2009-08-19 27 views
2

Je suis en tout, sauf peut-être la respiration, novice désolé si je ne suis pas clair, mais voilà:Faire un pointeur qui pointe vers deux octets

J'ai une fonction en C qui écrit octets à un circuit via un bus I2C, et dans le fichier d'en-tête, il ressemble à ceci:

BOOL WINAPI JidaI2CWrite(HJIDA hJida, DWORD dwType, BYTE bAddr, LPBYTE pBytes, DWORD dwLen); 
  • hJida: poignée du Conseil.
  • dwType: Numéro à base zéro du bus I2C .
  • bAddr: Adresse de l'appareil sur le bus I2C , les 8 bits complets tels que sont écrits sur le bus.
  • pBytes: Pointeur vers l'emplacement contenant les octets.
  • dwLen: Nombre d'octets à écrire.

Si je voulais écrire un seul octet à un circuit avec l'adresse 0x98, je ferais quelque chose comme ceci:

unsigned char writing[1]; 
writing[0]=0x10; 

unsigned char *pointer; 
pointer = &writing[0]; 


JidaI2CWrite(hJida,0,0x98,pointer,1); 

qui semble fonctionner, mais si je voulais écrire deux octets, disons 0x10FF, ce n'est pas le cas. Alors, comment faire un pointeur qui pointe sur deux octets au lieu d'un seul?

Merci

+2

N'oubliez pas de suivre votre respiration en lisant les réponses :-) –

+1

Est-ce que pointer = & écrire [1] une faute de frappe? Cela ne devrait certainement pas fonctionner. –

+0

Oui, pointer = & écrire [0] est probablement ce que vous vouliez dire. Ou, juste "pointeur = écriture"; – Roddy

Répondre

10

Vous voulez quelque chose comme ceci:

unsigned char writing[2]; 
writing[0] = 0x01; 
writing[1] = 0x02; 

JidaI2CWrite(hJida, 0, 0x98, writing, 2); 

Notez qu'un tableau en C peut être généralement utilisé comme un pointeur. La variable writing peut être considérée comme un pointeur sur un morceau de mémoire ayant dans ce cas une taille de 2 octets. Créer un autre pointeur pour pointer vers cet emplacement est redondant (dans ce cas).

Notez que vous pouvez le faire pointer à un nombre quelconque d'octets:

unsigned char writing[12]; 

//fill the array with data 

JidaI2CWrite(hJida, 0, 0x98, writing, 12); 
+2

"Notez que les tableaux en C ne sont en réalité que des pointeurs" pas tout à fait ... voir "http://www.lysator.liu.se/c/c-faq/c-2.html" –

+0

@ SDX2000 excellent point et référence , Je simplifié à l'excès, j'espère que mon édition est plus précise – Gabe

+0

@ SDX2000 Ce lien donne un 404 – Edward

6

Essayez cette ...

//A buffer containing the bytes to be written 
unsigned char writeBuffer[] = {0x10, 0xFF}; 

//writeBuffer itself points to the start of the write buffer 
//you dont need an extra pointer variable 
//Indicate the size of the buffer in the call to the function 
//pointers do not carry array size information with them (in C/C++) 
JidaI2CWrite(hJida,0,0x98,writeBuffer,2); 

ou mieux encore

unsigned char writeBuffer[] = {0x10, 0xFF}; 

JidaI2CWrite(hJida,0,0x98,writeBuffer 
       ,sizeof(writeBuffer)/sizeof(unsigned char)); 

Note: sizeof(writeBuffer)/sizeof(writeBuffer[0]) calcule automatiquement la taille du tableau en octets pour vous

+0

diviser par 'sizeof (unsigned char)' est inutile, puisque 'sizeof (char)' est défini comme étant 1 dans le standard et 'sizeof (char non signé) == sizeof (char)' –

1

Il semble que le paramètre dwLen est le nombre d'octets à écrire. Alors:

unsigned char writing[2]; 
writing[0] = 0x10; 
writing[1] = 0xff; 
JidaI2CWrite(hJida, 0, 0x98, writing, 2); 

Notez que votre utilisation de pointer pointant vers writing[1] devrait probablement pas comme écrit, parce que définit pointer pour pointer vers l'octet après l'octet que vous voulez vraiment écrire. Je soupçonne que c'est une faute de frappe, mais si ce n'est pas le cas, vous voudrez peut-être revoir votre code existant avant de continuer.

+0

@Greg: cela peut fonctionner ou ça pourrait ne pas. Le fait est que le comportement du programme est * non défini * selon les spécifications de langage. –

+0

@StephenC: "non défini" de quelle manière? En fait accéder à l'écriture [1] peut être indéfini, mais en prenant son adresse devrait fonctionner, sûrement? – Roddy

0

Je vois 2 choix:

1) les écrire séparément:

écrit [0] = 0x10; écriture [1] = 0xFF; 2) vérifiez si votre système est court sur 2 octets et utilisez un court-circuit.

probablement comme écriture ((short *)) [0] = 0x10FF;

Aussi, vous devez écrire declaire est l'écriture de caractère [2];

puis, comme d'autres l'ont dit, écrire les 2 octets ...

+1

"(écriture (courte *)) [0] = 0x10FF;" appelle à des problèmes en raison de problèmes d'endianness. par exemple. sur x86 et sparc cela donnerait des résultats différents, et c'est une douleur de chasser les bugs de ce genre. –

+0

ayant récemment fait de telles corrections dans certains codes mac, en passant de powerpc à intel, vous êtes très très correct. –

1

writing est déjà le pointeur que vous voulez.

Débarrassez-vous de pointer.

Le dernier paramètre à JidaI2CWrite est le nombre d'octets que vous voulez écrire.

Le pointeur pBytes indique le début du bloc que vous voulez écrire.