2010-10-06 27 views
2

Je travaille sur le projet de micrologiciel C. J'ai une union qui est définie commeAide à la création d'un pointeur sur un syndicat

typedef union { 
    unsigned long value; 
    unsigned char bytes[4]; 
} LONGVALUE; 

J'ai aussi une fonction qui a ce prototype,

char sendHexToASCII_UART(char *msg, int cnt); 

et une variable de type LongValue défini comme,

LONGVALUE countAddr; 

LA PROBLÈME: Je remplis les octets individuels de la variable union avec des valeurs d'un tableau (tempBuff1), je veux ensuite passer l'adresse du premier élément de l'union à une fonction qui va imprimer à l'UART. Sur ma fonction appelez sendHexToASCII_UART((int *)countAddr.bytes[0], 4);, j'obtiens un avertissement de compilateur disant "cast à pointeur d'entier de taille différente". Quelqu'un peut-il expliquer pourquoi je reçois ceci et comment je peux le faire disparaître? REMARQUE: La modification de la conversion (int *) en (char *) entraîne le même avertissement.

countAddr.bytes[0] = tempBuff1[COUNT_ADDR - PWRD_ADDRESS]; 
countAddr.bytes[1] = tempBuff1[COUNT_ADDR - PWRD_ADDRESS + 1]; 
countAddr.bytes[2] = tempBuff1[COUNT_ADDR - PWRD_ADDRESS + 2]; 
countAddr.bytes[3] = tempBuff1[COUNT_ADDR - PWRD_ADDRESS + 3]; 
sendHexToASCII_UART((int *)countAddr.bytes[0], 4); 

Répondre

4

Pourquoi ne pas simplement:

sendHexToASCII_UART((char *)countAddr.bytes, 4); 

ou mieux encore:

sendHexToASCII_UART((char *)countAddr.bytes, sizeof(countAddr.bytes)); 
+0

Puis-je obtenir: 'avertissement: les cibles des pointeurs dans l'argumentation passant 1 « sendHexToASCII_UART » diffèrent en signedness' – PICyourBrain

+0

Mise à jour réponse maintenant ... Je –

+0

changé à (unsigned char *) et je reçois toujours le même avertissement "different in sidnedness" – PICyourBrain

1

sendHexToASCII_UART ((int *) (& countAddr.bytes [0]), 4);

ou:

sendHexToASCII_UART ((int *) (countAddr.bytes), 4);

0

La valeur de l'expression

countAddr.bytes[0] 

est un unsigned char (le premier octet dans votre tableau), que vous lancez un pointeur int, d'où l'avertissement. Comme Oli l'a dit, vous devez supprimer le [0] pour obtenir un pointeur sur le tableau, ce que vous voulez.

+0

Puis j'obtiens: 'warning: les cibles de pointeur en passant l'argument 1 de 'sendHexToASCII_UART' diffèrent en signés'' – PICyourBrain

+0

Right. Votre meilleur pari est probablement d'utiliser une distribution ici, comme suggéré par Alex, puisque vous voulez vraiment changer l'interprétation de votre séquence d'octets. –

0

ou essayez ceci sans créer de variable de type LongValue

sendHexToASCII_UART(((LONGVALUE *)0)->bytes, 4);