Adresse von Struktur in einer Struktur ??
-
Moin Moin,
Sorry für die einfache Frage, aber ich stehe gerade auf dem Schlauch...
Wie kann ich die adresse einer Struktur in einem arry von Strukturen übergeben?#define BUF_SIZE 20 typedef struct { long id; int data[8]; } can_t; typedef struct { bool wflag; int rdPos; int wrPos; can_t rxBuffer[BUF_SIZE] } buf_t; volatile buf_t buf[3]; //Prototypes read_can(can_t msg); // Compiler meckert ( mit recht natürlich... :-) ) read_can(&buf[0].rxBuffer[0]) Und im realen Code dann mit index: read_can(&buf[i].rxBuffer[buf[i].rdPos]);
Ich komme nicht darauf wie ich also die adresse von der Struktur can_t in der Struktur buf_t übergeben kann.
Herzlichen Dank für das Wegreißen des Brettes von meiner Stirn ...
Karsten
-
Wieso Adresse? Wo möchte read_can denn eine Adresse haben?
Oder soll der Prototyp so aussehen
read_can(can_t *msg);
Und was "meckert" der Compiler?
Bitte die Meldung per Copy&Paste.
-
Karsten42 schrieb:
//Prototypes read_can(can_t msg);
Der Parameter ist kein Zeiger. Muss das so? Vermutlich nicht.
// Compiler meckert ( mit recht natürlich... :-) ) read_can(&buf[0].rxBuffer[0])
Weil die Deklaration von read_can falsch ist. Ansonsten stimmt der Aufruf.
-
sollte das so aussehen
int read_can(volatile can_t *msg);
-
Sorry, ich bin ein Dussel!
Richtig:
uint8_t read_can(can_t *msg);
Exakte Meldung des Compilers:
bridge.c:58: warning: passing argument 1 of 'read_can' discards qualifiers from pointer target typeCompiler:
gcc version 4.3.3 (WinAVR 20100110)Sorry!
-
Karsten42 schrieb:
Sorry, ich bin ein Dussel!
Richtig:
uint8_t read_can(can_t *msg);
Exakte Meldung des Compilers:
bridge.c:58: warning: passing argument 1 of 'read_can' discards qualifiers from pointer target typeDas liegt an dem volatile-Qualifizierer. Eigentlich müsstest du die Funktion mit einem
volatile can_t *msg
-Argument deklarieren, oder erstmal mit einem temporären can_t aufrufen und das dann in den volatilen Buffer umkopieren.So wie es jetzt ist, kommt es zu undefiniertem (oder zumindest unspezifiziertem?) Verhalten beim Zugriff auf den volatile-Buffer durch einen nicht-volatilen Zeiger innerhalb von read_can.
-
Hallo liebe Experten,
Herzlichen Dank für eure Hilfe! Manchmal ist das Brett vor dem Kopf eher ein Balken
So gehts:
// ---------------------------------------------------------------------------- typedef struct { uint32_t id; //!< ID 29 Bit) uint8_t length; //!< data byte length uint8_t data[8]; //!< data of CAN message } can_t; typedef struct { volatile int posRead; volatile int posWrite; volatile bool wasWrite; can_t rx_buffer[BUF_SIZE]; } buf_t; // Prototype uint8_t can_get_message(can_t *msg, uint8_t mcp); ..... if (can_get_message(&(buf[i].rx_buffer[buf[i].posWrite]), mcp)) { buf[i].posWrite = (buf[i].posWrite + 1) % BUF_SIZE; buf[i].wasWrite = true; } ....
Herzlichen Dank * 10^12
Karsten