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 type

    Compiler:
    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 type

    Das 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


Anmelden zum Antworten