2009-11-04 94 views
0

我試圖通過三個參數來我的write()函數:C++常量無效*轉換

write(fd, "C,1,1\r\n", 7); 

這工作得很好。不過,我想帶一個參數,並把它傳遞給命令部分,使其動態:

write(fd, N, 4); 

我不熟悉C++的類型,但它一直要求一種類型的「常量無效*」我已經能夠將我的變量N轉換爲兩種不同的格式,希望能夠更容易地轉換。這是我曾嘗試:

const fmx::FixPt& outValue = dataVect.AtAsNumber(3); 
const double N = outValue.AsLong(); 

double N = outValue.AsLong(); 

所以雙和const雙(*這可能是幾乎同樣的事情......我不知道C++非常好)

我也可以把它作爲剛:

const fmx::FixPt& outValue = dataVect.AtAsNumber(3); 
write(fd, outValue, 4); 

但我想呼籲大家如何轉換雙會比試圖解釋或弄清楚獨一無二的,因爲const類型FMX :: FixPt &東西要好得多......

*我也嘗試:

write(fd, &N, 4); 

這不僅擺脫我的錯誤,但仍然無法正常工作。

那麼,它甚至可以轉換爲「const void *」類型嗎?

非常感謝!

這裏是代碼:

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供寫入(INT,常量無效*,爲size_t)'

+2

你究竟在做什麼?根據你寫的內容很難分辨出來,根據你的最終目標是什麼,答案可能會有所不同。 – 2009-11-04 20:16:37

+0

請注意結尾的第三行:「只能刪除我的錯誤,但仍然不起作用」。你是什​​麼意思「不起作用」?你想達到什麼目的? – 2009-11-04 20:37:38

+0

對不起每個人,有時我覺得如果我提供了太多的信息,那麼我只會混淆這個問題。 我正在爲FileMaker寫一個插件,它將打開一個串口並將命令發送到軌道設備,如C,7 C,1,1等......除了我需要命令C,3,X這將需要1-1000的數字。我想傳遞那個數字。之前我只是在「3000」或其他什麼,但我需要通過變量硬編碼。當我編譯它給我我的轉換錯誤,但是當我添加「&」時沒有錯誤,但是當我運行腳本時,軌道/掃描器設備什麼也不做。 – Pfeffer 2009-11-04 21:59:59

回答

1

在我看來,就好像你問題是從雙精度轉換爲字符串。我認爲,如果N的值爲2000,則需要寫出字符'2','0','0'和'0',而不是2000.0的內部表示。

其實,我看你使用功能outValue.AsLong(),我會希望返回long值(這是一個整數),而不是double值(這是浮點數),它會更方便處理在這種情況下是一個整數。在這種情況下,doublelong是數據類型。

將數字轉換爲字符串在C中有點尷尬,並且通常使用sprintf()函數完成。這有點棘手。首先,你必須指定一個char數組來寫入字符串。請確保它足夠大,以便擁有最大數量,並添加一個,因爲sprintf()會再寫入一個字符來標記字符串的末尾。 (大多數C字符串函數都可以。)然後用它調用sprintf。我們來看看這個。

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); 

要解釋其中的一些:我們用5個字符string_value,因爲我們需要的字符1.數加上我們得到的價值爲long_value,然後用sprintf()函數把值放入STRING_VALUE。 sprintf()的第一個參數是結果所在的內存區域,第二個參數是格式字符串,以下是您要放入字符串的值。在格式字符串中,'%'表示它將描述一個字段,'0'表示填零結果,'4'表示至少使用四個字符,而「ld」表示你是傳遞值爲long

+0

這工作完美!非常感謝你! – Pfeffer 2009-11-04 23:06:56

7

write命令只需要一個數據塊並寫入文件描述符。所以,如果你想寫你double舉行的二進制數據,你會做這樣的事情:

write(fd, &N, sizeof(double)); 

注意,這個二進制數據,而不是人類可讀ASCII數據寫入到文件描述。這可能很危險,因爲數據是以本地體系結構的字節順序存儲的,但根據您的應用程序,這可能不是問題。

通常情況下,在C++中,你可以使用iostream運營商:

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(); 

流運算符重載,採取多種參數,包括字符串:

out << "hello world: " << 42 << endl; 
1

write()函數的第二個參數是指向緩衝區(一個字節數組)的指針,第三個參數是該緩衝區的大小。所以,你需要以某種方式獲得你想要寫入該文件的字節數組。

你的 「解決方案」

write(fd, &N, 4); 

將工作如果N是什麼,是4個字節長。但是,這似乎不是你想要的。

從你的問題中不清楚你到底想要完成什麼。你想寫一個字符串嗎?然後,您需要將N轉換爲字符串,並將該字符串的第一個字節的地址傳遞給write

+0

謝謝,抱歉,我應該添加更多信息。 我有一個的if/else如果被檢查長度聲明: ......否則,如果(tempText->分配( 「4」),* tempText ==長度){... 所以我知道4是正確的(我通過1000) 我的工作示例:寫(fd,「C,1,1 \ r \ n」,7); 它看起來像一個字符串,但它一直說「無法將_____轉換爲'const void *' 爲什麼它要求'const void *'它看起來像一個字符串... * side note ,我試着做const void * tester =「1000」;它的工作......所以'const void *? 再次感謝! – Pfeffer 2009-11-04 21:23:33

+0

在C中,一個字符串指針,例如''C,1,1,\ r \ n「(它的類型爲const char *')將被自動轉換爲void *。但是在C++中,你需要用'(const void *)「C,1,1,\ r \ n」'顯式強制轉換。請注意,在這樣投射之前,您仍然必須以您想要的格式獲得它! – bdonlan 2009-11-04 22:24:19

+0

而在C++中,你真的想做一個'static_cast (data)',而不是C風格的轉換操作。 – jheddings 2009-11-04 22:34:10

0

從你的工作例子看來,write接受一個const char *作爲第二個參數,而長度(const char *中的字符數)作爲第三個參數。

因此write(fd, "C,1,1\r\n", 7);傳遞一個const char *指向「C,1,1 \ r \ n」,它是7個字符長。

如果你想在一個變量而不是硬編碼通過「C,1,1 \ r \ n」,那麼你要做到以下幾點:

int someNum = 7; // example variable 

const int BUFFERSIZE = 256; 
char strBuffer[BUFFERSIZE]; 
snprintf(strBuffer, BUFFERSIZE, "whatever you like, even a number: %d\n\r", someNum); 
write(fd, str, BUFFERSIZE); 
+1

請記住,_snprintf_s()不是標準函數。它存在於Visual C++中,並且我無所不知其他的知識。如果您使用其他編譯器,則需要使用sprintf()或該編譯器的特定功能。如果您使用Visual C++,_snprintf_s()比sprintf()更安全。 – 2009-11-04 22:42:25

+0

感謝大衛,我已經用sprintf的便攜式安全版更新了示例。 – KSchmidt 2009-11-05 15:13:59