2010-07-28 9 views
-2

J'ai une méthode pour vérifier la météo un nombre est pair ou impair:opérandes non valides à binaire

-(BOOL)numberIsEven:(unsigned int *)x { 


    if (x & 1) 
{ 
    return TRUE; 
} 
else 
{ 
return FALSE; 
    } 
} 

mais chaque fois que je le compiler je reçois l'erreur:

Invalid operands to binary % 

Il est donc compilation dans l'assemblage comme une fonction de module et à défaut, d'une certaine manière, cependant si j'utilise une fonction basée sur le module (sans doute plus lent), je reçois la même erreur!

Aidez-moi dépassement de la pile

Merci - Ollie

+8

'if (isTrue) {return true; } else {return false; } 'paradigme. Oh mec. – NullUserException

+0

Mis à part tous les autres problèmes, lorsque vous corrigez le bogue de ne pas déréférencer le pointeur, votre nom de méthode est vraiment nul car il retournera vrai si * x est impair. – JeremyP

+0

Pourriez-vous poster le vrai code et message d'erreur? Ce que vous avez posté est évidemment faux. –

Répondre

0

C'est parce que (à part le fait que votre code contient de nombreuses fautes de frappe) x est défini comme un pointeur. Un pointeur ne peut pas avoir de module sur lui, le résultat est sans signification.

1

Je soupçonne que vous lisez le message d'erreur faux et il dit vraiment "Opérandes invalides au binaire &".

La raison pour laquelle il est dit que est "x" est un pointeur, vous devez donc dire:

if (*x & 1) 

pas

if (x & 1) 
4

x est un pointeur. L'opérateur modulo ne fonctionnera pas sur les pointeurs.

return (*x & 1); 

Ce déréférence le pointeur, puis renvoie le résultat du modulo (implictly jeté à un BOOL)

0
return *x & 1; 

Depuis x est un pointeur vers un int, vous devez d'abord la déférence qu'il. En outre, vous pouvez modifier la signature pour prendre un unsigned int. Je ne vois aucun avantage à passer un pointeur dans cette situation. Sauf que c'est en réalité C, donc vous n'obtenez rien en castant à bool.

0
bool isOdd(unsigned int x) { 
    return (bool)(x&1); 
} 

bool isOdd_by_ptr(unsigned int * p) { 
    return isOdd(*p); 
} 

#define IS_ODD(X) (1 & (X)) 

#define IS_ODD_BY_PTR(P) (1 & *(P)) 

Fonctionne très bien.

+0

Voici quelque chose d'intéressant à essayer: 'bool isOdd (int x) {return! IsEven (x); } ',' bool isEven (int x) {return! isodd (x); } '= D – NullUserException

Questions connexes