passing struct by reference

Gast #4707056
Hallo miteinander!

ich möchte einen Teil der Struktur, die ich als Referenz an ein 
Unterprogramm übergeben habe, an ein weiteres Unterprogramm übergeben.
Vorgestellt hab ich es mir so:

struct lsm330dlc_acc_rdg {
        uint8_t status;   // ACC Status
        uint16_t src;
        uint8_t char fss;
        uint8_t acc[3];
};

struct lsm330dlc_rdg {
       struct lsm330dlc_acc_rdg acc_rdg;
       struct lsm330dlc_gyro_rdg gyr_rdg;
};


int LSM330_read(struct acc_rdg* SensorOutput)
{
  readRegs(LSM330_ACCAddr, OUT_X_L_A, SensorOutput->acc_rdg->acc);
}

uint8_t readRegs(uint8_t deviceAddr, uint8_t reg, uint16_t* dataPtr)
{
  /* do something */
  return true;
}

Beim Compilieren mit CooCox bekomme ich jedoch die Fehlermeldung:
85: error: invalid type argument of '->' (have 'struct 
lsm330dlc_acc_rdg')

Die Treffer bei Google behandeln nur die erste Stufe der Übergabe per 
Referenz.
Kann mir jemand sagen, was ich da falsch mache?
Persönliche Seite
Das fängt schon mal hiermit an:

> int LSM330_read(struct acc_rdg* SensorOutput)

"struct acc_rdg" ist nicht definiert. Ich vermute mal, daß Du eigentlich 
"struct lsm330dlc_rdg" meinst.

Dann geht es hiermit weiter:

> readRegs(LSM330_ACCAddr, OUT_X_L_A, SensorOutput->acc_rdg->acc);

Das Strukturelement "acc_rdg" ist kein Pointer, also kannst Du es auch 
nicht dereferenzieren. Statt -> gehört dort ein . hin.

Deine Funktion readRegs erwartet als drittes Argument einen Pointer, 
d.h. Du musst die Adresse von "acc" bestimmen und übergeben. Das ginge 
mit dem Adressoperator & -- wenn denn die Typen passen würden.

Da ist Dein drittes Problem: acc ist ein uint8_t-Array mit drei 
Elementen.

Deine Funktion "readRegs" erwartet aber einen Pointer auf uint16_t.

Das passt nicht hinten und nicht vorne.


Im übrigen grenzt Deine Namensvergabe an den Versuch der "code 
obfuscation", wenn Du etwas klarere und eindeutigere Namen verwenden 
würdest, würde Dir vielleicht der eine oder andere Knoten von selbst 
aufgehen.
Gast
Danke für die schnelle Antwort!

hab das jetzt so gemacht und es funktioniert:

readRegs(LSM330_ACCAddr, (OUT_X_L_A | RW_MULTIPLE_BM), 
SensorOutput->acc_rdg.acc);

Gesamtes Beispiel:


struct lsm330dlc_acc_rdg {
        unsigned char status;   // ACC Status
        unsigned char src;
        unsigned char fss;
        uint16_t acc[3];
};

struct lsm330dlc_gyro_rdg {
        unsigned char status;   // Gyro Status
        unsigned char src;
        unsigned char fss;
        uint16_t rot[3];
};

struct lsm330dlc_rdg {
       struct lsm330dlc_acc_rdg acc_rdg;
       struct lsm330dlc_gyro_rdg gyr_rdg;
};

int LSM330_read(struct lsm330dlc_rdg* SensorOutput)
{
   readRegs(LSM330_ACCAddr, (OUT_X_L_A | RW_MULTIPLE_BM), 
SensorOutput->acc_rdg.acc);
}

uint8_t readRegs(uint8_t deviceAddr, uint8_t reg, uint16_t* dataPtr)
{
   /* Do something */
}

Der Fehlerschwerpunkt war bei "SensorOutput->acc_rdg.acc". Da fehlen mir 
wohl noch ein Paar Grundlagen.

Die anderen Sachen waren Kopierfehler, beim Versuch den Code fürs Forum 
verdaulich zu machen :-)

Zu "code obfuscation" -> werde mir wohl noch die Namensconventionen für 
C anschauen müssen, wollte es erst beim Refactoring machen.

Vielen Dank nochmal für die vielen Antworten!
Gruß Stefan

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.