我有一個循環遍歷存儲在緩衝區中的圖像,一次抓取1024個字節,並將此千字節作爲UDP數據包發送出去。以下是代碼的相關部分。如果語句似乎沒有失敗
爲什麼我的第二條語句if (buf.bytesused - curr*1024 > 1024)
在curr*1024
變得大於buf.bytesused
時失敗?我陷入了一個無限循環,直到memcpy最終拋出一個seg錯誤纔會結束。我的buf.bytesused大約是900,000,而不是循環大約900次,它只是繼續下去,即使buf.bytesused - curr*1024
給出了一個負面結果,肯定小於1024.
如果不清楚:當curr是小的,buf.bytesused - curr * 1024> 1024就像我期望的那樣滿意,而第二個if-block被運行。但是,當curr變大(甚至是buf.bytesused - curr * 1024爲負值)時,第二個if塊仍在運行,而不是第三個塊,在else之後。
buf.bytesused
是一個無符號的32位int。
#define FRAME_START 0x0
#define FRAME_END 0xF
#define FRAME_MID 0xA
uint_32 buf.bytesused = 921600;
char frameInfo = FRAME_START;
char frameNum = i;
int curr = 0;
while (frameInfo != FRAME_END) {
if (curr == 0) {
frameInfo = FRAME_START;
memcpy(&frameInfo, &udpBuf[0], 1);
memcpy(&frameNum, &udpBuf[1], 1);
memcpy(buffers[buf.index].start + curr*1024, udpBuf + 2, 1024);
}else if (buf.bytesused - curr*1024 > 1024) {
frameInfo = FRAME_MID;
memcpy(&frameInfo, &udpBuf[0], 1);
memcpy(&frameNum, &udpBuf[1], 1);
memcpy(buffers[buf.index].start + curr*1024, udpBuf + 2, 1024);
} else {
frameInfo = FRAME_END;
memcpy(&frameInfo, &udpBuf[0], 1);
memcpy(&frameNum, &udpBuf[1], 1);
memcpy(buffers[buf.index].start + curr*1024, udpBuf + 2, (buf.bytesused % 1024));
}
if (sendto(s, udpBuf, BUFLEN, 0, &si_other, slen)==-1)
diep("sendto()");
curr++;
}
另外,有人可以告訴我我在做什麼錯誤的memcpy?它不會將我的兩個字符的值複製到我的緩衝區。
你確定問題是如果條件?看起來你正在用'udpBuf [0]'中的任何內容覆蓋'frameInfo',這意味着它不太可能留在FRAME_END中。編輯:哦,那些應該是另一種方式?您可能想查看'memcpy'的參數列表並查看您是否正確使用 –
是'buf.bytesused'是'size_t'還是其他無符號整數類型?如果是這樣,減法將使用無符號算術完成,並且不會消極。 –
對不起,如果我不清楚的問題。我希望這更清楚一點:當'curr'很小時,像我所期望的那樣滿足'buf.bytesused-curr * 1024> 1024',並且這個if-block被運行。但是,當curr變大時(甚至是很大的buf。bytesused - curr * 1024'爲負),第二個if塊仍在運行,而不是第三個塊,在else之後。 我不明白爲什麼,儘管以我的經驗來看,這通常意味着我忽略了一些非常基本的東西。 – WhiteHotLoveTiger