2011-07-06 4 views
4

Je travaille sur un programme de partage de fichiers basé sur UDP. Permettez-moi de poster un exemple de code avant d'expliquer le problème.Question de syntaxe 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; 
     } 
    } 
} 

Comme vous pouvez le voir à la ligne « 13 » Je l'initialisation totalChunkAmount en utilisant la variable que je suis arrivé de la fonction de UDP recvFrom. J'ai besoin d'initialiser cette valeur seulement une fois, c'est pourquoi je l'utilise dans un contrôle boolif(). et après l'initialisation, je retourne la valeur bool à true, donc il ne sera pas initialisé à nouveau. Existe-t-il un autre moyen d'obtenir le même résultat, mais n'utilise pas la moche bool méthode de commutation.

+2

Notez que c'est probablement une mauvaise idée. Les paquets UDP peuvent être perdus ou tomber en panne. Vous devriez probablement utiliser TCP à la place. –

+1

@Billy: oui, cela peut être très vrai, mais sa question n'a pas vraiment à faire avec quoi que ce soit UDP ou TCP après tout ... – Mark

+1

@Mark: Oui, c'est pourquoi c'est un commentaire plutôt qu'une réponse :) –

Répondre

2

Définissez totalChunkAmount sur un état non valide avant son initialisation et recherchez cet état. Par exemple, si totalChunkAmount est un int alors,

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

De même, si totalChunkAmount est un pointeur, vous pouvez le mettre à NULL (0).

[Modifier Note: Je me demandais simplement, dans votre boucle while principalement vous êtes en train d'initialiser la variable alors pourquoi ne pas votre break hors de la boucle après cela? Si vous pouvez le faire, il est beaucoup plus propre et pas de tels contrôles sont nécessaires.]

+0

Merci beaucoup. ça a l'air bien meilleur et 4 lignes plus courtes. –

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

La seule chose que je peux penser à la main hors serait d'initialiser totalChunkAmount à -1 (ou une autre valeur mondiale non réel) et vérifiez ensuite cela (en évitant la déclaration supplémentaire de bool).

+0

Aww pile débordement pourquoi u pas de mise à jour plus rapide! : P – JohnKlehm

0

Le code que vous avez proposé est peut-être plus long, mais sûrement plus lisible et le rend plus facile à suivre la logique, et je voudrais le laisser tel quel.

Le seul changement que je ferais est de renommer le bool checker sans visage en bool totalChunkAmountInitialized.

0

Une solution élégante est d'utiliser boost :: optionnel <>. C'est parfait pour de tels cas et assez léger. Si vous ne pouvez pas ou ne voulez pas utiliser boost: vous pouvez coder votre propre classe assez facilement.