Hi,
ich habe eine Bibliothek selbstgeschrieben um den 28BYJ-48-Schrittmotor
an einem STM32F072B-Discoveryboard
zu betreiben.
Hier der Code der Header-Datei:
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Verbose mode can be enabled via `-v, --verbose` option
Inc/main.h:40:16: error: storage size of 'stepper1' isn't known
81
struct stepper stepper1;
82
^~~~~~~~
83
*** [.pio\build\disco_f072rb\src\main.o] Error 1
84
========================================================================================= [FAILED] Took 9.54 seconds =========================================================================================The terminal process "C:\Users\Max\.platformio\penv\Scripts\platformio.exe 'run'" terminated with exit code: 1.
85
86
Terminal will be reused by tasks, press any key to close it.
Vielleicht habe ich zu Viel Code eingefügt aber ich hoffe alle Infos
gegeben zu haben.
Kann jemand der sich mit so was auskennt helfen den Fehler zu beheben?
Max
Oliver S. schrieb:> Eigentlich müsste es doch schon hier knallen:void> stepper_set_step(struct stepper stepper0,int step);>> Definitionen gehören in Header-Dateien, Deklarationen nicht. Und erst> ein struct definieren, dann benutzen.
Genau.
In der Funktionsdefinition wird die stepper-struct ja definiert(1. Eine
struct vom Typ stepper erstellt,mit dem Namen stepper0;Danach wird
stepper0 im Code verwendet.).
Das wüsstet ihr G. schrieb:> struct stepper stepper1; //ACHTUNG! HIER EREIGNET SICH DER FEHLER!
Woher soll der Compiler denn wissen, wie ein struct stepper aussieht?
Das ist ja an der Stelle überhaupt nicht definiert.
Rolf M. schrieb:> Das wüsstet ihr G. schrieb:>> struct stepper stepper1; //ACHTUNG! HIER EREIGNET SICH DER FEHLER!>> Woher soll der Compiler denn wissen, wie ein struct stepper aussieht?> Das ist ja an der Stelle überhaupt nicht definiert.
Ich denke durch die Headerdatei.
Wenn ich falsch denke korrigiere mich, ich bin neu in C.
Rolf M. schrieb:> Das wüsstet ihr G. schrieb:>> struct stepper stepper1; //ACHTUNG! HIER EREIGNET SICH DER FEHLER!>> Woher soll der Compiler denn wissen, wie ein struct stepper aussieht?> Das ist ja an der Stelle überhaupt nicht definiert.
Und eine Variable sollte in einem Header auch nicht definiert werden.
Nur deklariert - und dann gehört ein extern davor.
Das hier ist die Deklaration des struct stepper:
> struct stepper> {> uint16_t IN1;> GPIO_TypeDef* IN1_Base;> uint16_t IN2;> GPIO_TypeDef*IN2_Base;> uint16_t IN3;> GPIO_TypeDef* IN3_Base;> uint16_t IN4;> GPIO_TypeDef* IN4_Base;> int step_count;> };
Die gehört in die headerdatei, ganz nach oben.
Die headerdatei musst du dann in jede .c-Datei einbinden, die struct
stepper benutzt.
Oliver
Das wüsstet ihr G. schrieb:> Rolf M. schrieb:>> Das wüsstet ihr G. schrieb:>>> struct stepper stepper1; //ACHTUNG! HIER EREIGNET SICH DER FEHLER!>>>> Woher soll der Compiler denn wissen, wie ein struct stepper aussieht?>> Das ist ja an der Stelle überhaupt nicht definiert.>> Ich denke durch die Headerdatei.
Die Definition der Struktur steht aber nicht in der Headerdatei, sondern
in der .c-Datei:
Das wüsstet ihr G. schrieb:> Hier der Code der Quelldatei(.c)> #include <stepper_new.h>> //Emulates a stepper in the software> struct stepper> {> uint16_t IN1;> GPIO_TypeDef* IN1_Base;> uint16_t IN2;> GPIO_TypeDef*IN2_Base;> uint16_t IN3;> GPIO_TypeDef* IN3_Base;> uint16_t IN4;> GPIO_TypeDef* IN4_Base;> int step_count;> Wenn ich falsch denke korrigiere mich, ich bin neu in C.
Dass in den Header nur die Deklaration kommt und die Definition in die
.c-Datei, gilt nur für Variablen und Funktionen, aber nicht für die
Datentypen.
Das wüsstet ihr G. schrieb:> Wenn ich falsch denke korrigiere mich, ich bin neu in C.
Du hast das eigentliche Problem noch gar nicht verstanden:
Du willst NICHT die Struktur übergeben SONDERN den Pointer darauf.
Das erfordert Änderungen an Deinem Code. Im wesentlichen nur stumpfes
ersetzen, z.B. x.y wird zu x->y und (x) wird zu (&x).
Du musst Dich jedoch damit befassen, sonst gehen die Fragen erst los,
wenn Dein Code compiliert und (nicht) läuft.
A. S. schrieb:> Das wüsstet ihr G. schrieb:>> Wenn ich falsch denke korrigiere mich, ich bin neu in C.>> Du hast das eigentliche Problem noch gar nicht verstanden:
Doch, hat er. "ich bin neu in C" ist die vollumfängliche
Problembeschreibung, nur sehr freundlich formuliert.
C-Buch...
Oliver
Oliver S. schrieb:> Doch, hat er. "ich bin neu in C" ist die vollumfängliche> Problembeschreibung, nur sehr freundlich formuliert.>> C-Buch...>> Oliver
☺ Ja so kann man es auch nehmen, auf jedenfall vielen Dank an A. S.,
für seine Detailbeschreibung wie man den Code ändert.
Wenn ich den Code geändert habe werde ich bescheidgeben ob er
funktioniert oder nicht.