Forum: Mikrocontroller und Digitale Elektronik Zeiger auf eine struct als Rückgabewert einer Funktion


von Andreas (Gast)


Lesenswert?

Hallo,

ich habe folgenden typedef:


typedef struct button_info  {
  uint8_t pressed;
  uint8_t pressed_long;
  uint8_t active;
  uint8_t pin;
}  but_info_t;


und eine Funktion die folgendermaßen aussieht:

but_info_t *but_check(uint8_t nmb)  {
  return &button[nmb];
}


nun möchte ich in meiner main folgenden Einzeilerhaben:

int main(void){
   but_info_t *bsp;

  bsp = but_check(0);
  if (bsp->pressed == 1){
    .....
    .....
    .....
  }
}

wie genau muß der Syntax in der main dazu sein? Irgendwie finde ich für 
dieses spezielle Beispiel und durch try and error bin ich nicht 
weitergekommen.
Das ich die Adresse zurückgeben möchte anstatt die Variable an sich habe 
ich mal so gelernt.


Gruß


Andreas

von Oliver (Gast)


Lesenswert?

Was genau geht denn nicht?
Abgesehen davon, daß du dir die Funktion komplett sparen kannst, und 
direkt in main
1
bsp = &button[0];

schreiben könntest, ist das soweit alles richtig. Vorausgesetzt 
natürlich, irgendwo steht noch sowas wie
1
but_info_t button[4711];

Oliver

von Andreas K. (a-k)


Lesenswert?

> assignment makes pointer from integer without a cast

Sieht so aus, also ob der Compiler zu diesem Zeitpunkt die Funktion 
but_check nicht kennt.

von Oliver (Gast)


Lesenswert?

Jetzt habe ich deinen zweiten Thread auch gesehen. Da steht aber ein 
anderer Code als hier.

Also:
Zeig das ganze Programm. Sonst wird das nichts.

Oliver

von Andreas (Gast)


Lesenswert?

Vielmehr gibt es da leider nicht zu zeigen
Aber hier nochmal alle betroffenen Zeilen:

das typedef für but_info_t sieht so aus:

typedef struct button_info  {
  uint8_t pressed;
  uint8_t pressed_long;
  uint8_t active;
  uint8_t pin;
}  but_info_t;



In der Datei button.c findet man u.a. diese zeilen:

but_info_t button[buttoncounter]; //buttoncounter ist hier 3


das Array wird in einer anderen Funktion gefüllt und das funktioniert 
auch.


dann rufe ich aus der main diese Funktion auf:

but_info_t *but_check(uint8_t nmb)  {
  return &button[nmb];
}

und zwar mit dieser Zeile:


  button = but_check(2);

folgende Fehlermeldung kommt:

assignment makes pointer from integer without a cast


Das ganze wird für einen ARM (AT91) mit gcc kompiliert.


Wenn ich mir die zum Beispiel in der main den Inhalt der variabel button 
anschaue, zum Beispiel button.pin.
Dann stimmen die Wert, allerdings weiß ich nicht was ich machen muß um 
diese Warnung weg zu bekommen.


Hoffe das reicht euch an Informationen

von Andreas K. (a-k)


Lesenswert?

Andreas wrote:

> Hoffe das reicht euch an Informationen

Nein. Weil das Problem wahrscheinlich daran liegt, dass in main() die 
aufgerufene Funktion nicht bekannt ist und daher alter C Tradition 
folgend als "int but_check();" interpretiert wird.

von Andreas (Gast)


Lesenswert?

jetzt verstehe ich!
Das kann wirklich sein.

Ok, da ich in der main kein "extern funktionsname ();" haben möchte
wollte ich eben die Funktion

but_info_t *but_check(uint8_t nmb)

in der lib_button.h hinzufügen.
Dort steht auch mein typedef für but_info_t.

Das Einfügen folgender Zeile

but_info_t *but_check(uint8_t nmb);

klappte aber nicht.
Dei Fehlermeldung lautet:

error: expected '=', ',', ';', 'asm' or '__attribute__' before '*' token


so langsam habeich das Gefühl ich stehe heute auf dem Schlauch.
Kann mir jemand helfen?

gruß

Andreas

von Andreas K. (a-k)


Lesenswert?

Andreas wrote:

> error: expected '=', ',', ';', 'asm' or '__attribute__' before '*' token

Jetzt fehlt ihm die Definition von buf_info_t.

> so langsam habeich das Gefühl ich stehe heute auf dem Schlauch.
> Kann mir jemand helfen?

Ein C Kurs könnte helfen. Ein entsprechendes Buch auch.

von Andreas (Gast)


Lesenswert?

Oh mann...

das wars.
Danke.Wegen dem Buch....ist ja bald Weihnachten.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.