Hallo,
Ich komm einfach nicht weiter mit einem Pointer auf ein Array-Eintrag in
einem struct namens settings_t. Ich habe eine Funktion, die mir die
Daten aus dem Array im struct per SPI ausgeben soll. Und die erwartet
einen Pointer auf den Beginn der Daten im Array des Structs.
Hier ist das Struct:
Ich weiß das da irgendwas noch nicht stimmt, denn es kommt immer die
Warmung:
1
../spi.c:68: warning: passing argument 1 of 'spi_write_data' from incompatible pointer type
Wie deklariere/initialisiere ich den Pointer richtig? Bekomm es einfach
nicht hin. Ich lerne leider erst in "C" zu programmieren.
Wer kann mir weiterhelfen?
Steffen
Steffen H. schrieb:> Ich weiß das da irgendwas noch nicht stimmt, denn es kommt immer die> Warmung:>
1
> ../spi.c:68: warning: passing argument 1 of 'spi_write_data' from
2
> incompatible pointer type
3
>
spi_write_data will einen Pointer auf char.
Du gibst ihm einen Pointer auf long.
und das passt nun mal nicht. ein char ist kein long. Und auch ein
Pointer auf char ist daher erst mal nicht kompatibel mit einem Pointer
auf long.
Jetzt wissen wir an dieser Stelle aber, das dieses 'char' im Grund nur
ein notwendiges Übel ist für 'ist mir eigentlich wurst was du hast, ich
nehm einfach die Bytes und schreib sie'.
D.h. im Grunde spielt es keine wirkliche Rolle, dass da ein long im
Spiel ist. Man darf hier also durchaus Umcasten.
Man muss nur darauf achten, dass spi_write_data auch die tatsächlich
richtige Anzahl an Bytes schreibt. Und an dieser Stelle kommt dann eine
zweite Zutat ins Spiel: ein sizeof.
um das komplette Array zu schreiben.
Wow, das geht aber noch schnell um diese Urzeit. Danke schon mal für die
Antworten.
geier99 schrieb:> wie wärs mit:> void spi_write_data(long* source, char wr_bytes, char spi_cs)
Ich will die Funktion schon multikunktionell halten. Deswegen möcht ich
'char' wenn möglich nicht unbedingt mit 'long' ersetzen.
Karl Heinz Buchegger schrieb:> um das komplette Array zu schreiben.
Steffen H. schrieb:> geier99 schrieb:>> wie wärs mit:>> void spi_write_data(long* source, char wr_bytes, char spi_cs)> Ich will die Funktion schon multikunktionell halten. Deswegen möcht ich> 'char' wenn möglich nicht unbedingt mit 'long' ersetzen.
char* durch long* ist zudem eine gaaanz schlechte Idee wenn bestimmte
ALignments gegeben sind, etw wenn dein Code auf ARM oder PowerPC oder
einer anderen strict-Alignment Plattform ausführt. Zur Hardware steht
ja nix geschrieben (ausser in deinem Login-Name).
Zudem ist das Layout von settings_t eigenwillig. Erwarte Probleme beim
Übertragen zwischen Plattformen mit unterschiedlichen Alignments,
zumindest wenn du settings_t als ganzes überträgst.
Ohne saubere (De)Serialisierung sind Bit-, Byte-, Word- und
float-Endianess sowie Darstellung von Flotings weitere Problemfelder.
Johann L. schrieb:> char* durch long* ist zudem eine gaaanz schlechte Idee wenn bestimmte> ALignments gegeben sind, etw wenn dein Code auf ARM oder PowerPC oder> einer anderen strict-Alignment Plattform ausführt. Zur Hardware steht> ja nix geschrieben (ausser in deinem Login-Name).>> Zudem ist das Layout von settings_t eigenwillig. Erwarte Probleme beim> Übertragen zwischen Plattformen mit unterschiedlichen Alignments,> zumindest wenn du settings_t als ganzes überträgst.>> Ohne saubere (De)Serialisierung sind Bit-, Byte-, Word- und> float-Endianess sowie Darstellung von Flotings weitere Problemfelder.
Da hast du wohl Recht und ich noch garnicht drüber nachgedacht. Dann
werd ich da wohl noch Probleme kriegen.
Danke Johann für die Hinweise.
Karl Heinz Buchegger schrieb:> um das komplette Array zu schreiben.
Es gibt leider weiterhin eine Warnung und der Pointer ist leider immer
noch falsch. :(
Vieleicht noch das '&' vergessen und siehe da, so geht es jetzt. Ganz
ohne WARNING. :)
Steffen H. schrieb:> geier99 schrieb:>> wie wärs mit:>> void spi_write_data(long* source, char wr_bytes, char spi_cs)> Ich will die Funktion schon multikunktionell halten. Deswegen möcht ich> 'char' wenn möglich nicht unbedingt mit 'long' ersetzen.
Warum nimmst du dann nicht void*? Das ist der in C als generischer
"Zeiger auf irgendwas, dessen Typ unbekannt ist" vorgesehene Typ. Dann
kannst du dir auch den Cast sparen.
Eine eigene Frage?
Dieser Thread ist über 14 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.