2010-10-07 4 views
2

J'ai mis en place un tampon circulaire, et j'aimerais un moyen concis de mettre à jour le pointeur de la mémoire tampon tout en gérant correctement le wrap-around.Suggestions pour la gestion d'index concise dans le tampon circulaire

En supposant un tableau de taille 10, ma première réaction a été quelque chose comme:

size_t ptr = 0; 
// do some work... 
p = ++p % 10; 

Analyse statique, ainsi que gcc -Wall -Wextra, à juste titre giflé mon poignet pour un comportement non spécifié en raison d'une séquence violation de point. La solution évidente est quelque chose comme:

p++; 
p %= 10; 

Cependant, je cherchais quelque chose de plus concis, (à savoir, une seule ligne) à « encapsuler » cette opération. Suggestions? Autre que p ++; p% = 10; :-)

Répondre

7
p = (p + 1) % N; 

ou pour éviter le modulo:

p = ((N-1) == p) ? 0 : (p+1); 
+0

+1 presque ... si ce n'était pas pour l'horrible '(9 == p)' LOL – pmg

+0

Heh, "p = (p + 1)% N" c'est. – Throwback1986

-2

Avez-vous envisagé ++p %= 10;

+1

++ p n'est pas modifiable dans 'C'. Ne sait pas sur 'C++' ou 'Java' (la question n'est pas étiquetée avec ces langues) – pmg

+0

Ah, c'est vrai. Je viens de vérifier et il n'est pas modifiable en C. Un autre endroit où je me suis fait trébucher dans les différences entre les langues. – swestrup

0

Contrairement p++; p%=10;, je crois en utilisant l'opérateur virgule comme dans p++, p%=10; mieux admissible comme « un -doublure". Vous pouvez l'utiliser dans une macro ou dans le corps d'une instruction loop ou if/else sans accolades, et il évalue à la valeur résultante p.

Questions connexes