C-Problem bei Array-Pointer-Übergabe

Gast #1037213
Lesenswert?

Hallo,
ich übertrage per SPI verschiedene Befehle die aus mehreren Bytes 
bestehen. Dazu dachte ich mir die Befehle als Arrays aus Bytes in 
Konstanten abzulegen und dann einer Funktion zu übergeben die Byte für 
Byte sendet.

Der Befehl als Konstante:
1
unsigned char const SET_CURSOR_AM_1[] = {0x11, 0x04, 0x1B, 0x4D, 0x4E, 0x32, 0xFD};
Die Funktion zum Senden der Bytes der Array-Konstanten:
1
void SPI_SendBytes(unsigned char* arData)
2
{
3
for (uint8_t i=0; i<sizeof(arData); i++){
4
  SPI_MasterTransmit(arData[i]);
5
  }
6
//Dummy-Byte senden
7
  _delay_us(10);
8
  SPI_MasterTransmit(0xFF);
9
}
Und der Funktionsaufruf:
1
SPI_SendBytes(*SET_CURSOR_HM_1);
beim Funktionsaufruf kriege ich die Warnmeldung:
"warning: passing argument 1 of 'SPI_SendBytes' makes pointer from 
integer without a cast".
Ein Typecast hat mir hier aber nicht weiter geholfen. Ich habe auch 
schon gelesen dass man die Fehlermeldung ignorieren könne, lieber hätte 
ich sie aber schon weg.

hoffe auf Hilfe

mfg
Gast #1037260
Lesenswert?

@Lenz: Hab leider wenig Zeit, daher nur kurz:

Du machst einen Fehler bei der Array-Übergabe an die Funktion. Innerhalb 
der Funktion wird das Array zum Pointer, und sizeof (arData) liefert 
nicht die Array-Länge, sondern die Größe des Pointers (compiler-abhängig 
meist 2, 3 oder 4).

ABhilfe:
void SPI_SendBytes(unsigned char* arData, int len)
{
  // und dann statt sizeof (arData) len verwenden.
}

Aufruf der Funktion:
SPI_SendBytes(SET_CURSOR_HM_1, sizeof (SET_CURSOR_HM_1));

gutes Google-Suchwort: "C passing arrays"
Gast #1037281
Lesenswert?

auch so funktioniert es leider nicht.
Allerdings hat mich das auf ein Problem gestossen, innerhalb der 
Funktion in der Zeile:
1
SPI_MasterTransmit(arData[i]);
würde ja auch auf den Pointer statt auf das Array zugegriffen. Aber wenn 
den Pointer dereferenziere
1
SPI_MasterTransmit(*arData[i]);
kriege ich die Fehlermeldung "error: invalid type argument of 'unary *'"
Gast #1037301
Lesenswert?

>auch so funktioniert es leider nicht.

Was heisst "es funktioniert nicht"?
Es geht so, wie von "tuppes" geschrieben!
Eine Warning kann es dann nur noch wegen
des "const" Qualifiers in der Array Definition geben,
d.h Du musst den auch in der Funktionsdefinition
einfügen, oder bei der Array-Definition weglassen.

Arrays und Pointer sind in C in den meisten Fällen äquivalent.

>SPI_MasterTransmit(*arData[i]);

Das ist falsch, da arData[i] schon das Element i
des Arrays ist, da gibt´s nix mehr zu dereferenzieren.

Empfehle die Lektüre eines guten C-Buchs (z.B von
Harbison und Steele, ist besser als K&R, mMn)
Gast #1037464
Lesenswert?

ja danke, mit const im Funktionskopf bin ich jetzt auch alle Warnungen 
los. Und jetzt funktioniert das auch so wie tuppes es vorgeschlagen hat.

Allerings verstehe ich nicht wieso es nicht möglich ist die Größe des 
Arrays in der Funktion fest zu stellen. Klar so wie ich das gemacht habe 
kann das natürlich nicht gehen, aber wenn ich den Pointer dereferenziere 
müsste ich doch die Größe des Arrays bekommen. Also
1
...
2
for (uint8_t i=0; i<sizeof(*arData); i++){
3
  SPI_MasterTransmit(arData[i]);
4
  }
5
...
aber das geht nicht (=es wird nur 1 Byte übertragen).
Gast #1037468
Lesenswert?

1
unsigned const char SET_CURSOR_AM_1[] = {0x11, 0x04, 0x1B, 0x4D, 0x4E, 0x32, 0xFD};
2

3
void SPI_SendBytes(unsigned const char* arData, uint8_t len)
4
{
5
for (uint8_t i=0; i<len; i++){
6
  SPI_MasterTransmit(*arData++);
7
  }
8
//Dummy-Byte senden
9
  _delay_us(10);
10
  SPI_MasterTransmit(0xFF);
11
}
12

13
SPI_SendBytes(SET_CURSOR_AM_1,sizeof(SET_CURSOR_AM_1));

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren