C-Problem bei Array-Pointer-Übergabe

Gast #1037213
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 #1037240
funktioniert dann immer noch nicht, zusätzlich kriege ich noch bei der 
Konstantendefinition die Warnmeldung:
"warning: initialization makes pointer from integer without a cast"
Gast #1037260
@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
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
>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
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
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

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.