2011-04-14 59 views
0

write()函數鑑於我的部分代碼:有問題在C

char bmpheader[54] = {0x42, 0x4D, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x13, 0x0B, 0x00, 0x00, 0x13, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; 

char bmpimagedata[36] = {0x07, 0x07, 0xFF, 0x07, 0x07, 0x07, 0x07, 0x07, 0xFF, 0xFF, 0x07, 0x07, 0x07, 0x07, 0x07, 0x66, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xFF, 0xFF, 0xFF, 0x46, 0x00, 0x00}; 


while (i < 54) { 
    printf("%c", bmpheader[i]); 
    write (socket, bmpheader[i], 1); 
    i++; 
} 
while (j < 36) { 
    printf("%c", bmpimagedata[j]); 
    write (socket, bmpimagedata[j], 1); 
    j++; 
} 

我在我的編譯器說passing argument 2 of 'write' makes pointer from integer without a cast兩個寫功能得到一個錯誤。我不太確定函數的參數本身(第三個參數是否正確?)。

我該如何糾正它?

回答

3

標準write函數接受一個指針到你想寫的東西;你通過它char(這是提升到int)。

最小的解決將是改變這一點:

write (socket, bmpheader[i], 1); 

write (socket, &bmpheader[i], 1); 

...但還有更好的方法。

你可以讓write寫出所有54個字節本身:

write (socket, bmpheader, 54); 

或者,如果你真的想這樣做一個char的時間,你可以使用指針:

int i; 
char *p; 
for (i = 0, p = bmpheader; i < 54; ++i, ++p) { 
    printf("%c", *p); 
    write (socket, p, 1); 
} 

無論哪種情況,您都希望避免使用幻數54並將其從數據中提取出來。由於sizeof(char)always one byte in standard C,你可以使用sizeof沒有做醜陋的sizeof(array)/sizeof(array[0])件事:

int i; 
char *p; 
for (i = 0, p = bmpheader; i < sizeof(bmpheader); ++i, ++p) { 
    printf("%c", *p); 
    write (socket, p, 1); 
} 

...但我敢肯定有一個更好的解決方案比。

您還可以使用putchar(相當輕量級),而不是printf(相當重量級):

int i; 
char* p; 
for (i = 0, p = bmpheader; i < sizeof(bmpheader); ++i, ++p) { 
    putchar(*p); 
    write (socket, p, 1); 
} 

我以前常常做這樣的事情指針算法,不知道他們是否是在不好的做法現代世界:

char* p; 
char* endp; 
for (p = bmpheader, p = bmpheader + sizeof(bmpheader); p < endp; ++p) { 
    putchar(*p); 
    write (socket, p, 1); 
} 
+0

啊,我知道有一些趕上,沒有看到'&'。謝謝! – stockoverflow 2011-04-14 12:24:26

+0

超級,感謝您的額外編輯。 – stockoverflow 2011-04-14 12:37:34

+0

downvoter喜歡提供一些有用的反饋? – 2011-04-14 15:07:19

1

簽名write

ssize_t write(int fd, const void *buf, size_t count); 

所以第二個參數應該是一個指針,並且您傳遞的不是指針的實際值。以下應幫助

write (socket, bmpheader + i, 1); 
write (socket, bmpimagedata + j, 1); 

但是,爲什麼不這樣做

write (socket, bmpheader, sizeof(bmpheader)/sizeof(*bmpheader)); 
write (socket, bmpimagedata, sizeof(bmpimagedata)/sizeof(*bmpimagedata)); 

和檢驗過程中的返回值

0

如果你檢查的write function原型,你會看到第二個參數是一個char *。在你的情況下,你給它一個單元格或你的數組,然後一個字符。 你應該寫:

write (socket, &(bmpheader[i]), 1); 

當然,這遠不是最有效的,你可以直接寫

write (socket, bmpheader, 54); 
+0

感謝您的快捷方式,所以我不需要循環所有這些十六進制值? – stockoverflow 2011-04-14 12:26:26

+0

不,你不知道:數據是連續的,你可以將它們迸發出來:-) – Bruce 2011-04-14 12:52:42

0

寫(插座,& bmpimagedata [J],的sizeof(bmpimagedata [J ])); 第二參數應該是指針 第三是將要寫入的數據大小

+0

在我的情況下,將工作,而不是sizeof(因爲他們都是1字節大小)。 – stockoverflow 2011-04-14 12:25:43

+0

是的沒問題,但靈活性是一件好事:) – 2011-04-14 12:26:45

0

bmpimagedata [j]的

是要使用 & bmpimagedata [j]的

0

如果改變的整數您的代碼...

write (socket, bmpimagedata + j, 1); 

...它會工作。但是你不必一次發送一個字節的數據,這就是爲什麼第三個參數是長度的原因。

你是否還考慮過查找write()函數的參考文檔以查看它的工作原理以及接受的內容?學習閱讀和解釋文件可能並不容易,但從長遠來看,比問問題更有益,「我不確定第三個參數是什麼」

0

令人驚訝的是很多奇怪的/令人費解的建議。

的規範的方式寫出來這兩個數組是:

write(socket, bmpheader, sizeof bmpheader); 
write(socket, bmpimagedata, sizeof bmpimagedata); 

但絕對做計算找出元素的數量,涉及的單個字符,或任何的大小是沒有意義的。只需編寫整個陣列,每個陣列一次,然後完成。

另外,當然,如果你成功與否(也許只有一部分被寫入),並處理它。

+0

我覺得這看起來最乾淨。 – stockoverflow 2011-04-14 13:17:10