首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++常量空*转换

C++常量空*转换
EN

Stack Overflow用户
提问于 2009-11-05 04:11:00
回答 4查看 5.6K关注 0票数 0

我尝试将三个参数传递给write()函数:

代码语言:javascript
复制
write(fd, "C,1,1\r\n", 7);

这可以很好地工作。但我想接受一个参数,并将其传递给命令部分,以使其成为动态的:

代码语言:javascript
复制
write(fd, N, 4);

我不熟悉c++类型,但它总是要求一个"const void*“类型。我已经能够将我的变量N转换为几种不同的格式,希望其中一种更容易转换。这是我尝试过的:

代码语言:javascript
复制
const fmx::FixPt&  outValue = dataVect.AtAsNumber(3);
const double  N = outValue.AsLong();

double  N = outValue.AsLong();

所以double和const double(*这可能是几乎相同的事情...我不太了解c++ )

我也可以将其保留为:

代码语言:javascript
复制
const fmx::FixPt&  outValue = dataVect.AtAsNumber(3);
write(fd, outValue, 4);

但我认为询问每个人如何转换双精度值要比试图解释或弄清楚像const fmx::FixPt&类型这样独特的东西要好得多。

*我也尝试过:

代码语言:javascript
复制
write(fd, &N, 4);

它只能摆脱我的错误,但仍然不能工作。

那么,是否可以将其转换为"const void*“类型呢?

非常感谢!

下面是代码:

代码语言:javascript
复制
const fmx::FixPt& outValue = dataVect.AtAsNumber(3);
double  N = outValue.AsLong();

int fd;
struct termios options;
fd=open("/dev/tty.KeySerial1", O_RDWR | O_NOCTTY | O_NDELAY);
fcntl(fd, F_SETFL, 0);
tcgetattr(fd,&options);
options.c_ispeed=57600;
options.c_ospeed=57600;
options.c_cflag |= (CLOCAL | CREAD);
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
options.c_cflag &= ~CSTOPB;
options.c_lflag &= ~ECHO;
options.c_oflag &= ~ECHO;
options.c_oflag &= ~OPOST;
options.c_cflag |= CS8;
options.c_cflag |= CRTSCTS;
options.c_cc[VMIN] = 0;
options.c_cc[VTIME] =10;
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&options);


if( tempText->Assign("2"), *tempText == direction ) {
    write(fd, "C,1,2\r\n", 7);//Direction
}else{
    write(fd, "C,1,1\r\n", 7);//Direction
}

if( tempText->Assign("1"), *tempText == speed ) {
    write(fd, "C,2,1\r\n", 7);//Speed
} else if( tempText->Assign("2"), *tempText == speed ) {
    write(fd, "C,2,2\r\n", 7);//Speed
} else if( tempText->Assign("3"), *tempText == speed ) {
    write(fd, "C,2,3\r\n", 7);//Speed
} else if( tempText->Assign("4"), *tempText == speed ) {
    write(fd, "C,2,4\r\n", 7);//Speed
} else if( tempText->Assign("5"), *tempText == speed ) {
    write(fd, "C,2,5\r\n", 7);//Speed
} else if( tempText->Assign("6"), *tempText == speed ) {
    write(fd, "C,2,6\r\n", 7);//Speed
} else if( tempText->Assign("7"), *tempText == speed ) {
    write(fd, "C,2,7\r\n", 7);//Speed
} else if( tempText->Assign("8"), *tempText == speed ) {
    write(fd, "C,2,8\r\n", 7);//Speed
} else if( tempText->Assign("9"), *tempText == speed ) {
    write(fd, "C,2,9\r\n", 7);//Speed
} else if( tempText->Assign("10"), *tempText == speed ) {
    write(fd, "C,2,10\r\n", 8);//Speed
} else if( tempText->Assign("11"), *tempText == speed ) {
    write(fd, "C,2,11\r\n", 8);//Speed
} else if( tempText->Assign("12"), *tempText == speed ) {
    write(fd, "C,2,12\r\n", 8);//Speed
} else if( tempText->Assign("13"), *tempText == speed ) {
    write(fd, "C,2,13\r\n", 8);//Speed
} else if( tempText->Assign("14"), *tempText == speed ) {
    write(fd, "C,2,14\r\n", 8);//Speed
} else if( tempText->Assign("15"), *tempText == speed ) {
    write(fd, "C,2,15\r\n", 8);//Speed
} else if( tempText->Assign("16"), *tempText == speed ) {
    write(fd, "C,2,16\r\n", 8);//Speed
} else if( tempText->Assign("17"), *tempText == speed ) {
    write(fd, "C,2,17\r\n", 8);//Speed
}



if(tempText->Assign("1"), *tempText == length){
    write(fd, "C,3,", 4);
    write(fd, "1", 1);
    write(fd, "\r\n", 2);
} else if(tempText->Assign("2"), *tempText == length){
    write(fd, "C,3,", 4);
    write(fd, "10", 2);
    write(fd, "\r\n", 2);
} else if(tempText->Assign("3"), *tempText == length){
    write(fd, "C,3,", 4);
    write(fd, "100", 3);
    write(fd, "\r\n", 2);
} else if(tempText->Assign("4"), *tempText == length){

    write(fd, "C,3,", 4);
    write(fd, N, 4);
    write(fd, "\r\n", 2);
}


close(fd);

错误:无法将参数'2‘的'ssize_t’转换为'const void*‘到’double write(int,const void*,size_t)‘

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-11-05 06:39:43

在我看来,您的问题似乎是从双精度值到字符串的转换。我认为,如果N的值为2000.0,那么您希望写出字符'2‘、’0‘、’0‘和'0',而不是内部表示形式2000.0。

实际上,我看到您使用了一个函数outValue.AsLong(),我希望它返回一个long值(这是一个整数),而不是一个double值(这是一个浮点数),在这种情况下处理一个整数会更方便。在本例中,doublelong是数据类型。

在C中,将数字转换为字符串有点笨拙,通常使用sprintf()函数来完成。这有点棘手。首先,必须指定要将字符串写入其中的char数组。确保它足够大,以容纳将要包含的最大数字,并添加1,因为sprintf()会多写一个字符来标记字符串的末尾。(大多数C字符串函数都是这样的。)然后用它调用sprintf。让我们来看看这个。

代码语言:javascript
复制
char string_value[5];  /* we're assuming the number is always between 0 and 9999 */
long long_value = outValue.asLong();
sprintf(string_value, "%04ld", long_value);
write (fd, string_value, 4);

为了解释其中的一些:我们对string_value使用了5个字符,因为我们需要字符数加1。我们将值放入long_value,然后使用sprintf()函数将值放入string_value。sprintf()的第一个参数是结果所在的内存区域,第二个参数是格式化字符串,下面是您输入到字符串中的值。在格式字符串中,'%‘表示它将描述一个字段,'0’表示对结果进行零填充,'4‘表示至少使用四个字符,"ld“表示您正在传递一个long值。

票数 1
EN

Stack Overflow用户

发布于 2009-11-05 04:18:10

write命令只接受一个blob数据并写入文件描述符。因此,如果您想要编写保存在double中的二进制数据,您可以这样做:

代码语言:javascript
复制
write(fd, &N, sizeof(double));

请注意,这会将二进制数据,而不是人类可读的ASCII数据写入您的文件描述符。这可能很危险,因为数据是以本地体系结构的字节顺序存储的,但这可能不是一个问题,具体取决于您的应用程序。

通常,在C++中,您将使用iostream运算符:

代码语言:javascript
复制
double N = 0.0;

// write data to file
ofstream out("myfile", ofstream::binary);
out << N;
out.close();

// read data back
ifstream in("myfile", ifstream::binary);
in >> N;
in.close();

流运算符被重载以接受多种类型的参数,包括字符串:

代码语言:javascript
复制
out << "hello world: " << 42 << endl;
票数 7
EN

Stack Overflow用户

发布于 2009-11-05 04:20:12

write()函数的第二个参数是指向缓冲区(字节数组)的指针,第三个参数是该缓冲区的大小。因此,您需要以某种方式获取要写入该文件的字节数组。

你的“解决方案”

代码语言:javascript
复制
write(fd, &N, 4);

如果N是4字节长的东西,将会起作用。然而,这似乎不是你想要的。

从你的问题中还不清楚你到底想要实现什么。你想写一个字符串吗?然后需要将N转换为字符串,并将该字符串的第一个字节的地址传递给write

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1676297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档