2017-02-26 3 views
0

J'ai écrit une macro qui résume le nombre de bits indexés impairs qui sont activés.Pourquoi l'utilisation d'une macro dans mon code produit des erreurs?

Quelques exemples:

Dans la variable qui contient les bits suivants:

10010101 

Seul le bit à l'index 7 est activé, il n'y a que 1 bit impair indexé est activé, si la réponse est 1.

Dans la variable qui contient les bits suivants:

00101011 

Le bit à l'index 1 est activé, le bit à l'index 3 est activé et le bit à l'index 5 est activé. Par conséquent, un total de 3 bits indexés impairs sont activés. La réponse est 3.

J'ai écrit une fonction principale pour tester cette macro.

Voici le programme complet:

#include <stdio.h> 

#define ODD(n)\ 
int count = 0;\ 
int i = 1; \ 
while(n>>i)\ 
{\ 
    if(((n>>i)%2) == 1)\ 
     count++;\ 
     i = i+2;\ 
}\ 




int main() 
{ 
    int i; 
    int j; 
    int array1[] = {1,2,3,4}; 
/*array1 contains (binary representation): 
    00000001 
    00000010 
    00000011 
    00000100 
    After passing these into the macro: 
    00000001 ----> 0 odd indexed bits are turned on 
    00000010 ---->1 odd indexed bit is turned on 
    00000011 ---->1 odd indexed bit is turned on 
    00000100 ----> 0 odd indexed bits is turned on 

*/ 
int array2[4]; 
for(i=0; i<4; i++) 
{ 
    array2[i] = ODD(array1[i]); 
} 

for(j=0; j<4; j++) 
{ 
    printf("Array2: %d\n",array2[j]); 
} 




    return 0; 
} 

Je ne sais pas pourquoi je suis les erreurs suivantes:

odd.c: In function ���main���: 
odd.c:4:5: error: expected expression before ���int��� 
int count = 0;\ 

odd.c:34:19: note: in expansion of macro ���ODD��� 
    array2[i] = ODD(array1[i]); 
      ^

odd.c:8:13: error: ���count��� undeclared (first use in this function) 
     count++;\ 
     ^

compte est déclaré, donc je ne sais pas quel est le problème avec elle. Pourquoi ai-je eu ces erreurs et comment puis-je les corriger?

Répondre

3

Vous avez reçu une erreur car une macro n'est pas une fonction. Il est un mécanisme d'expansion jeton, et il se transforme un non-sens suivant:

array2[i] = int count = 0; 
while(array1[i]>>1)\ 
{\ 
    if(((array1[i]>>1)%2) == 1)\ 
     count++;\ 
}\ 

écrire comme fonction, et vous pouvez le traiter comme si elle est de retour d'un résultat réel:

int odd(int n) { 
    int count = 0; 
    while(n>>1) 
    { 
    if(((n>>1)%2) == 1) 
     count++; 
    } 
    return count; 
} 

Si vous insistez pour écrire ce avec une macro, vous aurez besoin de restructurer:

#define ODD(n, res) do { \ 
    int count = 0; \ 
    while(n>>1)\ 
    {\ 
    if(((n>>1)%2) == 1)\ 
     count++;\ 
    }\ 
    (res) = count;\ 
} while(0) 

pour définir une variab le, vous devez introduire une portée, donc une boucle while do est ajoutée pour cet effet. Cette construction de boucle particulière a la particularité de ne pas produire d'avertissement sur les instructions vides lorsque vous écrivez un terminateur d'instruction après l'appel de la macro (ODD(...);).

L'objectif de l'emplacement du résultat doit être passé comme un autre argument à la macro, comme ceci:

ODD(array1[i], array2[i]); 
+0

Merci beaucoup! @StoryTeller – Tree

+0

@Tree - Comme mon éditeur le suggère. Et n'oubliez pas que les entiers signés qui se déplacent à droite ont des résultats définis par l'implémentation. – StoryTeller

+0

Merci. La chose est, je suis intéressé à écrire cela comme une macro. Comment puis-je atteindre cet objectif? @StoryTeller – Tree