Forum: Compiler & IDEs Probleme bei Übergabe von Pointer auf Struct AVR-GCC


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Thomas (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ich habe eine Struktur:
struct Pumpe
{
  uint8_t  max;    
  uint8_t status;    
  uint8_t* pwm;    
};


Einen Funktionsprototypen
void initPumps(struct Pumpe *pt_pump);

Die dazugehörige Funktion:
void initPumps(struct Pumpe *pt_pump)
{
  pt_pump->max = 100;
}



Sowie in der Main-Funktion folgende Initialisierung und den 
anschließenden Aufruf der oben beschriebenen Funktion.
struct Pumpe PumpeA, PumpeB;

initPumps(&PumpeA);


Eigentlich sollte es funktionieren, tut es aber nicht. Es wird beim 
Kompilieren mit folgender Fehlermeldung quittieret:

dereferencing pointer to incomplete type

Was sich auf
pt_pump->max = 100;
 bezieht.

Zusätzlich gibt es folgende Warnungen die sich auf die selbe 
Programmzeile beziehen, mir aber auch nicht bei der Lösung des Problems 
weiter helfen:

Warning  2  'struct Pumpe' declared inside parameter list [enabled by 
default]

Warning  3  its scope is only this definition or declaration, which is 
probably not what you want [enabled by default]


Ich habe jetzt schon Stundenlang herum probiert und im Netz gesucht. 
Finde aber keine Lösung.

Hat jemand eine Idee?

Thomas

von Thomas (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ergänzung dazu:

Wenn ich alles in eine Datei packe funktioniert es. Ursprünglich und so 
soll es eigentlich auch sein ist

Pumpe.h

->Struct und Prototyp

Pumpe.c

->Die Funktion die die Probleme verursacht


und der Rest in der Datei in der Main ist.

von Dr. Sommer (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Du musst am Anfang der Pumpe.c insbesondere vor der Funktion den 
Header inkludieren, denn sonst kennt Compiler ja dein struct gar nicht.

von Rolf M. (rmagnus)


Bewertung
0 lesenswert
nicht lesenswert
Thomas schrieb:
> dereferencing pointer to incomplete type

Das beudeutet, daß an dieser Stelle die vollständige Definition des Typs 
nicht bekannt ist. Somit ist ein Member-Zugriff nicht möglich, da der 
Compiler nicht einmal weiß, ob es dieses Member in der Struktur 
überhaupt gibt, geschweige denn, wo oder wie groß es ist.

> Zusätzlich gibt es folgende Warnungen die sich auf die selbe
> Programmzeile beziehen, mir aber auch nicht bei der Lösung des Problems
> weiter helfen:
>
> Warning  2  'struct Pumpe' declared inside parameter list [enabled by
> default]

Das heißt, daß der Compiler den Typ überhaupt nicht kennt. Dadurch wird 
aus dem Funktionsparameter automatisch eine Deklaration des Typs 
abgeleitet, so daß der Compiler ab da zumindest mal davon ausgeht, daß 
ein Typ dieses Namens existiert.

> Warning  3  its scope is only this definition or declaration, which is
> probably not what you want [enabled by default]

Da der Namen des Typs implizit im Funktionsparameter deklariert wurde, 
ist er auch nur innerhalb der Funktion gültig. Wie der Compiler schon 
sagt, will man das in der Regel so nicht.

von Daniel A. (daniel-a)


Bewertung
0 lesenswert
nicht lesenswert
Derartige Räzel führen mit gcc -E zur Erleuchtung.

von Falk B. (falk)


Bewertung
0 lesenswert
nicht lesenswert
#include "Pumpe.h"

von Thomas (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo und Danke an alle. Man sollte einfach nicht mehr erwarten, das man 
nach 15h vor dem Code und nachts um halb zwei noch seine eigenen dummen 
Fehler findet.

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.