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:
Die Funktion zum Senden der Bytes der Array-Konstanten:
1
voidSPI_SendBytes(unsignedchar*arData)
2
{
3
for(uint8_ti=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
funktioniert dann immer noch nicht, zusätzlich kriege ich noch bei der
Konstantendefinition die Warnmeldung:
"warning: initialization makes pointer from integer without a cast"
@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"
>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)
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_ti=0;i<sizeof(*arData);i++){
3
SPI_MasterTransmit(arData[i]);
4
}
5
...
aber das geht nicht (=es wird nur 1 Byte übertragen).
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.