2011-07-06 110 views
4

我正在研究基於UDP的文件共享程序。讓我在解釋問題之前發佈一些示例代碼。C++語法問題

while (true) 
{ 
    Data toRecv; 
    int bytesRead = recvfrom(s->_UPDsock, (char*)&toRecv, sizeof(toRecv), 0,(SOCKADDR*)&remoteAddress, &remoteAddresslength); 
    if(bytesRead > 0) 
    { 
     string temp(toRecv.chunk,(bytesRead-sizeof(int))); 
     if(!checker) 
     { 
      //total packet amount. 
      totalChunkAmount = toRecv.ACK; 
      checker = true; 
     } 
    } 
} 

正如你可以看到一行「13」我用我從UDP的recvFrom功能得到了變量初始化totalChunkAmount。我只需要初始化該值,這就是爲什麼我在boolif()檢查中使用它。初始化後,我將bool的值翻轉爲true,所以不會再次初始化。有沒有其他方法可以達到相同的結果,但不使用醜陋的bool切換方法。

+2

請注意,這可能是一個壞主意。 UDP數據包可能會丟失或無序到達。你應該使用TCP代替。 –

+1

@比利:是的,這可能是非常真實的,但他的問題並沒有真正與UDP或TCP有關...... – Mark

+1

@Mark:是的,這就是爲什麼它是一個評論,而不是一個答案:) –

回答

2

在初始化之前將totalChunkAmount設置爲無效狀態並檢查該狀態。例如,如果totalChunkAmountint然後,

totalChunkAmount = -1; // say -1 is invalid value 
while(true) 
{ 
... 
if(-1 == totalChunkAmount) 
    totalChunkAmount = toRecv.ACK; // ACK can never be -1 
} 

同樣地,如果totalChunkAmount是一個指針,那麼你可以將其設置爲NULL0)。

[編輯注意:我只是想知道,在你的while循環中主要是你正在初始化變量,那麼爲什麼你的break之後沒有出現循環呢?如果你能做到這一點,是很多更清潔,不需要這樣的檢查。]

+0

非常感謝。它看起來更好,縮短4行。 –

1
totalChunkAmount = totalChunkAmount == [uninitialized_value_here] ? toRecv.ACK : totalChunkAmount; 
0

我能想到手的唯一的事情是初始化totalChunkAmount爲-1​​(或其他一些非現實世界的價值)和然後檢查(避免額外的bool聲明)。

+0

Aww堆棧溢出爲什麼你沒有更新更快! :P – JohnKlehm

0

您提出的代碼可能會更長,但當然更具可讀性,並且可以更容易地遵循邏輯,並且我會將其保留原樣。

我唯一要做的就是將無臉的bool checker重命名爲bool totalChunkAmountInitialized

0

一個優雅的解決方案是使用boost :: optional <>。它非常適合這種情況,而且非常輕便。如果你不能或不想使用boost ::你可以很容易地編寫你自己的類。