Forum: Mikrocontroller und Digitale Elektronik C-Problem bei Array-Pointer-Übergabe


von Lenz (Gast)


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

von Teplotaxl X. (t3plot4x1)


Lesenswert?

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

versuchs mal so

von Mandrake (Gast)


Lesenswert?

Ich glaube du musst deiner Funktion die Adresse übergeben also 
Funktionsaufruf so:

SPI_SendBytes(&SET_CURSOR_HM_1);

Gruß

Mandrake

von Lenz (Gast)


Lesenswert?

funktioniert dann immer noch nicht, zusätzlich kriege ich noch bei der 
Konstantendefinition die Warnmeldung:
"warning: initialization makes pointer from integer without a cast"

von tuppes (Gast)


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"

von Lenz (Gast)


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 *'"

von Schnuffi (Gast)


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)

von Lenz (Gast)


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).

von Wolfgang Mües (Gast)


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

von Lenz (Gast)


Lesenswert?

ja genau so hab ich das ja bereits

von Mano W. (Firma: ---) (manow)


Lesenswert?

1
unsigned const char SET_CURSOR_AM_1[] = {..}

Sollte das const nicht am Anfang stehen?
1
const unsigned char SET_CURSOR_AM_1[] = {..}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.