2013-11-28 113 views
0

我有一個循環遍歷存儲在緩衝區中的圖像,一次抓取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?它不會將我的兩個字符的值複製到我的緩衝區。

+0

你確定問題是如果條件?看起來你正在用'udpBuf [0]'中的任何內容覆蓋'frameInfo',這意味着它不太可能留在FRAME_END中。編輯:哦,那些應該是另一種方式?您可能想查看'memcpy'的參數列表並查看您是否正確使用 –

+2

是'buf.bytesused'是'size_t'還是其他無符號整數類型?如果是這樣,減法將使用無符號算術完成,並且不會消極。 –

+0

對不起,如果我不清楚的問題。我希望這更清楚一點:當'curr'很小時,像我所期望的那樣滿足'buf.bytesused-curr * 1024> 1024',並且這個if-block被運行。但是,當curr變大時(甚至是很大的buf。bytesused - curr * 1024'爲負),第二個if塊仍在運行,而不是第三個塊,在else之後。 我不明白爲什麼,儘管以我的經驗來看,這通常意味着我忽略了一些非常基本的東西。 – WhiteHotLoveTiger

回答

3

如果人們想知道,實際的問題是在這裏:

frameInfo = FRAME_END; 
memcpy(&frameInfo, &udpBuf[0], 1); 

frameInfo它設置爲FRAME_END之後被覆蓋,所以while (frameInfo != FRAME_END)絕不會評估爲false。事實上,這導致程序進入一個無限循環,導致OP錯誤地認爲他的if語句是錯誤的。使用調試器而不是假設你知道問題出在哪裏總是一個好習慣!

4

if (buf.bytesused - curr*1024 > 1024) fail when curr*1024 gets larger than buf.bytesused

這可能是問題,當buf.bytesusedunsigned

如果是負值並且有符號,則上述比較應該失敗。

要解決,你也可以使用簡單的數學。

if (buf.bytesused > curr*1024 + 1024) 

if (buf.bytesused > (curr + 1)*1024) 

這些條件不會導致由於問題簽署除非curr+1是負的。

我認爲這應該可以解決您的問題。

+1

這是不太可能成爲問題。除非buf.bytesused小於1024,否則如果bytesused是無符號的,則這種情況最終會失敗。我不認爲這是錯的。 –

+0

@RedAlert - 無符號結果可能> 1024。 –

+0

@Hot Licks - 他的代碼中沒有「結果」,但如果你正在談論bytesused,那麼它應該工作正常,如果它開始> 1024.隨着curr遞增,最終表達式將評估爲0到1024之間的某個值,這將導致條件失敗。 –