mikrocontroller.net

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


Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Oliver (Gast)
Datum:

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

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

Oliver

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh mann...

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.