2009-08-19 8 views
2

ich ein kompletter Anfänger in allem, was ich außer vielleicht beim Atmen, so traurig, wenn ich nicht klar zu sein, aber hier geht:Einen Zeiger, der auf zwei Bytes Punkte

ich eine Funktion in C haben die Bytes schreibt zu einer Schaltung über einen I2C-Bus und in der Header-Datei sieht es wie folgt aus:

BOOL WINAPI JidaI2CWrite(HJIDA hJida, DWORD dwType, BYTE bAddr, LPBYTE pBytes, DWORD dwLen); 
  • hJida: Brett Griff.
  • dwType: Null-basierte Nummer des I2C Busses.
  • bAddr: Adresse des Geräts auf dem I2C-Bus, die vollen 8 Bit wie es ist auf den Bus geschrieben.
  • pBytes: Zeiger auf den Speicherort enthält die Bytes.
  • dwLen: Anzahl der zu schreibenden Bytes. Ich würde so etwas tun

Wenn ich mit der Adresse 0x98, nur ein Byte zu einer Schaltung schreiben wollte:

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

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


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

, die zu funktionieren scheinen, aber wenn ich will zwei Bytes schreiben, sagen Sie 0x10FF, tut es nicht. Also, wie mache ich einen Zeiger, der auf zwei Bytes statt nur einen zeigt?

Dank

+2

Vergessen Sie nicht, mit Ihrer Atmung Schritt zu halten, während Sie die Antworten lesen :-) –

+1

Ist Zeiger = & Schreiben [1] ein Tippfehler? Das sollte mit Sicherheit nicht funktionieren. –

+0

Ja, Zeiger = & Schreiben [0] ist wahrscheinlich, was du meintest. Oder, nur "Zeiger = Schreiben"; – Roddy

Antwort

10

Sie wollen etwas wie folgt aus:

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

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

Beachten Sie, dass ein Array in C in der Regel wie ein Zeiger verwendet werden kann. Die Variable writing kann nur als ein Zeiger auf einen Teil des Speichers gedacht werden, der in diesem Fall eine Größe von 2 Bytes hat. Das Erstellen eines weiteren Zeigers, der auf diesen Ort verweist, ist in diesem Fall redundant.

Hinweis könnte man es auf eine beliebige Anzahl von Bytes machen zeigen:

unsigned char writing[12]; 

//fill the array with data 

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

"Beachten Sie, dass Arrays in C sind eigentlich nur Zeiger" nicht ganz ... siehe "http://www.lysator.liu.se/c/c-faq/c-2.html" –

+0

@ SDX2000 hervorragende Punkt und Referenz , Ich übermäßig vereinfacht, hoffentlich meine Bearbeitung ist genauer – Gabe

+0

@ SDX2000 Dieser Link gibt eine 404 – Edward

6

Try this ...

//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); 

oder besser noch

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

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

Hinweis: sizeof(writeBuffer)/sizeof(writeBuffer[0]) automatisch berechnet die Größe des Arrays in Bytes für Sie

+0

dividiert durch 'sizeof (unsigned char)' ist sinnlos, da 'sizeof (char) 'im Standard 1 ist und' sizeof (vorzeichenloses Zeichen) == sizeof (char)' –

1

Es scheint, als ob der Parameter dwLen die Anzahl der zu schreibenden Bytes ist. Also:

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

Beachten Sie, dass die Nutzung von pointer zeigt auf writing[1] wahrscheinlich nicht als geschrieben arbeiten, denn das pointer setzt auf das Byte nach das Byte Sie wirklich zeigen will schreiben. Ich vermute, dass dies ein Tippfehler ist, aber wenn nicht, möchten Sie vielleicht Ihren bestehenden Code überprüfen, bevor Sie fortfahren.

+0

@Greg: es könnte funktionieren oder vielleicht nicht. Der Punkt ist, dass das Verhalten des Programms * undefiniert * gemäß der Sprachspezifikation ist. –

+0

@StephenC: "undefined" in welcher Weise? Der Zugriff auf Writing [1] ist möglicherweise undefiniert, aber die Adressierung sollte sicher funktionieren. – Roddy

0

Ich sehe zwei Möglichkeiten:

1) schreiben sie getrennt:

Schreiben [0] = 0x10; Schreiben [1] = 0xFF;

2) Überprüfen Sie, ob Ihr System kurz ist und 2Bytes verwenden.

wahrscheinlich als ((short *) schreiben) [0] = 0x10FF;

Auch müssen Sie schriftlich schreiben ist char schreiben [2];

und dann, wie andere gesagt haben, schreiben Sie die 2 Bytes ...

+1

"((kurz *) Schreiben) [0] = 0x10FF;" ruft wegen Endianess-Problemen zu Problemen auf. z.B. auf x86 und sparc würde es andere Ergebnisse geben, und es ist ein Schmerz, solche Fehler zu jagen. –

+0

vor kurzem haben solche reparaturen in einigen mac code, von powerpc zu intel, bewegen sie sind sehr, sehr richtig. –

1

writing ist bereits der Zeiger, die Sie wollen.

pointer loswerden.

Der letzte Parameter für JidaI2CWrite ist die Anzahl der Bytes, die Sie schreiben möchten.

Der Zeiger pBytes zeigt auf den Anfang des Blocks, den Sie schreiben möchten.