www.mikrocontroller.net

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


Autor: Lenz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
unsigned char const SET_CURSOR_AM_1[] = {0x11, 0x04, 0x1B, 0x4D, 0x4E, 0x32, 0xFD};
Die Funktion zum Senden der Bytes der Array-Konstanten:
void SPI_SendBytes(unsigned char* arData)
{
for (uint8_t i=0; i<sizeof(arData); i++){
  SPI_MasterTransmit(arData[i]);
  }
//Dummy-Byte senden
  _delay_us(10);
  SPI_MasterTransmit(0xFF);
}
Und der Funktionsaufruf:
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

Autor: Teplotaxl X. (t3plot4x1)
Datum:

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

versuchs mal so

Autor: Mandrake (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich glaube du musst deiner Funktion die Adresse übergeben also 
Funktionsaufruf so:

SPI_SendBytes(&SET_CURSOR_HM_1);

Gruß

Mandrake

Autor: Lenz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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"

Autor: tuppes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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"

Autor: Lenz (Gast)
Datum:

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

Autor: Schnuffi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Lenz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
...
for (uint8_t i=0; i<sizeof(*arData); i++){
  SPI_MasterTransmit(arData[i]);
  }
...
aber das geht nicht (=es wird nur 1 Byte übertragen).

Autor: Wolfgang Mües (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
unsigned const char SET_CURSOR_AM_1[] = {0x11, 0x04, 0x1B, 0x4D, 0x4E, 0x32, 0xFD};

void SPI_SendBytes(unsigned const char* arData, uint8_t len)
{
for (uint8_t i=0; i<len; i++){
  SPI_MasterTransmit(*arData++);
  }
//Dummy-Byte senden
  _delay_us(10);
  SPI_MasterTransmit(0xFF);
}

SPI_SendBytes(SET_CURSOR_AM_1,sizeof(SET_CURSOR_AM_1));

Autor: Lenz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja genau so hab ich das ja bereits

Autor: Mano Wee (Firma: ---) (manow)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
unsigned const char SET_CURSOR_AM_1[] = {..}

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.