2010-11-26 39 views
0

J'essaie d'effectuer un mod (%) sur 2 ints dans c. Ma première fois en essayant une telle chose.Problème lors de l'utilisation de l'opérateur mod c

Le code ci-dessous se trouve dans une boucle où le compte est mis à 0 en dehors de la boucle et incrémente de 1 chaque itération. Je m'attends à voir ma valeur "read" changer mais elle reste bloquée à la valeur de "blah".

Qu'est-ce que je fais mal?

int blah=176400; 
count+=1; 
NSLog(@"the time = %i",count);// prints the correct increments 
int read = (int)(blah % count); 
NSLog(@"read %i",read); // prints out 1764000 all the time 
+1

votre code fonctionne quand je l'exécute. (Mis à part les modifications à ne pas utiliser NSLog.) Pouvez-vous essayer de produire un cas de test minimal qui reproduit le problème? –

+1

Impressions «176400» ou «1764000»? Aussi, y compris pour la boucle serait utile. – darioo

+0

Le code que vous affichez semble correct, le problème peut être dans la boucle autour d'elle, ou ailleurs. S'il vous plaît poster le code complet (et éviter des choses comme NSLog, ou Xcode, XCode spécifique, pas C). – kriss

Répondre

4

code Exemple:

#include <stdio.h> 

int main() { 
    int blah = 176400; 
    for (int count = 1; count < 20; ++count) { 
     printf("%d %% %d = %d\n", blah, count, blah % count); 
    } 
} 

Sortie:

176400 % 1 = 0 
176400 % 2 = 0 
176400 % 3 = 0 
176400 % 4 = 0 
176400 % 5 = 0 
176400 % 6 = 0 
176400 % 7 = 0 
176400 % 8 = 0 
176400 % 9 = 0 
176400 % 10 = 0 
176400 % 11 = 4 
176400 % 12 = 0 
176400 % 13 = 3 
176400 % 14 = 0 
176400 % 15 = 0 
176400 % 16 = 0 
176400 % 17 = 8 
176400 % 18 = 0 
176400 % 19 = 4 

Je dirais que le problème est ailleurs dans votre code.

+0

Ou, «compter» est bien plus grand que ce à quoi nous nous attendons. – cHao

+0

@chao. Cela soulève une alarme.devient très important en fonction de la durée de fonctionnement de mon application. – dubbeat

+1

@dubbeat: Eh bien, vous ne l'avez pas mentionné auparavant. Si count est plus grand que bla, alors vous voyez un comportement attendu. – darioo

1

Vous faites "n modulo m" où m est supérieur à n. Le résultat est n, et c'est correct. Vous pourriez vouloir count % blah?

+0

Si je change les valeurs, j'imprime à plusieurs reprises la valeur pour count au lieu de blah. – dubbeat

+1

-1: non, il utilise modulo dans l'ordre correct – kriss

+2

@kriss: Cela dépend de l'intention, ce que je ne comprends pas vraiment du code limité de la question. Vous ne pouvez pas dire définitivement que l'un ou l'autre est le «bon ordre» sans savoir ce que le nombre était destiné à représenter. Franchement, «count% blah» a plus de sens dans la plupart des situations auxquelles je peux penser. – cHao

1

Comprendre que blah % count est fondamentalement le reste de diviser blah par count, si les deux nombres sont positifs. (Les choses deviennent un peu plus poilues lorsque l'un des nombres ou les deux sont négatifs.) Si count est le plus grand nombre, alors le résultat sera toujours blah (car la division donnerait 0, avec un reste de blah). Dans votre cas, il semble que count devient très important, menant à cette situation. Il est difficile de deviner l'intention de votre utilisation % ici, mais il semble que vos opérandes sont dans le mauvais ordre, ou vous ne comprenez pas quel devrait être le résultat ... ou peut-être, ce dont vous avez réellement besoin est un opérateur différent entièrement.