Hallo Freunde,
Habe ein Problem mit zwei Fehlermeldungn beim Compilieren,
"error: conflicting types for ADC_Read"
"error: previous implicit declaration of ADC_Read was here"
Mein Code habe ich euch als Textdatei hochgeladen und die entsprechenden
Stellen mit ">>>>" markiert.
Ich hoffe ihr könnt mir weiterhelfen.
Vielen Dank
Du hast keinen Protoypen für ADC_Read. In so einem Fall greifen Standardannahmen, d.h. der Compiler versucht anhand des Aufrufs + ein paar zusätzliche Regeln zu erraten, wie denn die Signatur der Funktion aussieht. Und wenn er dann die Funktion tatsächlich präsentiert bekommt und er feststellen muss, dass seine Schätzung daneben lag, dann kommt es zu dieser Fehlermeldung. Kann man ganz leicht erkennen, der Compiler spricht von einer "previous implicit declaration" - implizit, also aus dem Zusammenhang extrahiert - er hat die Funktion nur dadurch kennen gelernt, weil du sie benutzt hast. ----> Protoyp der Funktion vor der ersten Verwendung anlegen, dann passiert das nicht mehr.
Vielen Dank für die schnelle Antwort!!! Könntest du mir vll. ein Hinweis geben wie man einen Funktionsprototypen erstellt? Oder wie ich weiter vorgehen sollte? Vielen Dank
>Oder wie ich weiter vorgehen sollte?
Ein C-Buch lesen.
Ansonsten: Ein Deklaration ist syntaktisch eigentlich nur eine Funktion
ohne Rumpf. Dein Problem ist dann gelöst wenn Du diese Deklaration vor
der ersten Verwendung dieser Funktion im Quelltext anordnest. In der
Regel schreibt man diese in eine H-Datei.
Karl Heinz schrieb: > Vielen Dank für die schnelle Antwort!!! > > Könntest du mir vll. ein Hinweis geben wie man einen Funktionsprototypen > erstellt? ? Du hast massenhaft Prototypen in deinem Programm und fragst wie man einen erstellt? Schau dir mal den Beginn deines Programms an und frag dich, was davon wohl auf die Funktionalität abzielt, die ich dir beschrieben habe. > Oder wie ich weiter vorgehen sollte? Wie Kali schon sagte: C-Buch lesen
Sorry, war ein Missverständnis. Klar habe ich Prototypen drin aber ich verstehe nicht wie ich deinen Lösungsansatz bei meinem Problem umsetzen kann. Da es sich bei "sensor_sued = ADC_Read" eigtl. nur über Werteübergabe handeln soll und beide Variablen den gleichen Typ (uint16_t) haben. MfG
Karl Heinz schrieb: > Sorry, war ein Missverständnis. Klar habe ich Prototypen drin aber ich > verstehe nicht wie ich deinen Lösungsansatz bei meinem Problem umsetzen > kann. Indem du den Protoypen für ADC_Read zu den restlichen Protoypen dazuschreibst! Denn den hast du vergessen einzukopieren. Ist doch nicht so schwer. Hier sind deine Protoypen:
1 | #define F_CPU_3686400UL
|
2 | #include <avr/io.h> |
3 | #include <avr/interrupt.h> |
4 | #include <util/delay.h> |
5 | |
6 | void pause_drehung (void); |
7 | void pause_neigung (void); |
8 | void rechtslauf_drehen (void); |
9 | void linkslauf_drehen (void); |
10 | void neigung_flacher (void); |
11 | void neigung_steiler (void); |
12 | void manuel (void); |
13 | void automatik (void); |
14 | void ADC_Init(void); |
Schau sie durch! Kein ADC_Read!
1 | #define F_CPU_3686400UL
|
2 | #include <avr/io.h> |
3 | #include <avr/interrupt.h> |
4 | #include <util/delay.h> |
5 | |
6 | void pause_drehung (void); |
7 | void pause_neigung (void); |
8 | void rechtslauf_drehen (void); |
9 | void linkslauf_drehen (void); |
10 | void neigung_flacher (void); |
11 | void neigung_steiler (void); |
12 | void manuel (void); |
13 | void automatik (void); |
14 | void ADC_Init(void); |
15 | uint16_t ADC_Read( uint8_t channel ); |
Jetzt gibt es auch für ADC_Read einen Protoypen. > > Da es sich bei "sensor_sued = ADC_Read" eigtl. nur über Werteübergabe > handeln soll und beide Variablen den gleichen Typ (uint16_t) haben. Das hat damit im eigentlichen Sinne nichts zu tun. Das sorgt nur für die Fehlermeldung die du siehst. Aber der eigentliche Fehler ist der vergessene Prototyp. Ergänze ihn, und der Fehler verschwindet. (Und mit ein bischen Glück hast du dir sogar gemerkt bzw. verstanden warum es zur Fehlermldung überhaupt kam. Ein uint8_t ist nun mal kein int).
Karl Heinz schrieb: > Da es sich bei "sensor_sued = ADC_Read" eigtl. nur über Werteübergabe > handeln soll und beide Variablen den gleichen Typ (uint16_t) haben. ADC_Read ist aber keine Variable, sondern eine Funktion. Und da der Compiler an dieser Stelle noch keinen Prototypen der Funktion zu Gesicht bekommen hat, weiß er auch nicht, welchen Typ der Rückgabewert der Funktion hat. Vielleicht jetzt etwas klarer?
>Da es sich bei "sensor_sued = ADC_Read" eigtl. nur über Werteübergabe >handeln soll und beide Variablen den gleichen Typ (uint16_t) haben. Was heisst hier "nur"? Du solltest doch mal ein C-Buch lesen. An Deinem Urteil über diese Zeile ist gleich mehreres falsch: Rechts vom "=" steht keine Variable sondern ein Funktionsaufruf. An der Stelle des Aufrufs von ADC_Read weiss der Compiler noch nicht, das Deine Funktion ein uint16_t zurückgibt. Wie Karl Heinz B. schon schrieb: >In so einem Fall greifen Standardannahmen, d.h. der Compiler versucht >anhand des Aufrufs + ein paar zusätzliche Regeln zu erraten, wie denn >die Signatur der Funktion aussieht. Deswegen ist der Prototyp notwendig!
Ich hätte gerne eine Tüte mit kleinen Steinen und drei Grosse, Mammi.
Kali schrieb: > An der Stelle des Aufrufs von ADC_Read weiss der Compiler noch nicht, > das Deine Funktion ein uint16_t zurückgibt. das ist noch nicht mal das eigentliche Problem. Ein uint16_t ist soweit mit einem int kompatibel. Beides sind 16 Bit, das ergibt maximal einen signed mismatch. Aber ein uint8_t (das Argument channel) geht nicht mit der impliziten Annahme zusammen, dass das 1. Argument beim Funktionsaufruf ein int ist. Aus
1 | sensor_sued = ADC_Read (0); |
leitet sich der Compiler mangels Prototyp her, dass die Funktion so aussehen müsste
1 | int ADC_Read( int arg ); |
tatsächlich sieht sie aber, wie der Compiler erst hinterher feststellt, so aus
1 | unsigned int ADC_Read( unsigned char arg ); |
int <--> unsigned char das geht schief.
>das ist noch nicht mal das eigentliche Problem. >Ein uint16_t ist soweit mit einem int kompatibel. Aber ein uint8_t (das >Argument channel) geht nicht mit der impliziten Annahme zusammen, dass >das 1. Argument beim Funktionsaufruf ein int ist. Oh. Sch... Hast recht. Hier, haste meine Steine.
Einen Fehler, den viele Neulinge machen: Sie glauben, dass der Compiler den Quelltext von oben nach unten, von unen nach oben, von links nach rechts und von rechts nach links absucht, um sich die Einzelteile zusammenzusuchen. Dem ist aber nicht so! Ein C Compiler liest den Text von oben nach unten. Und zwar nur ein einziges mal! Also muss man dafür sorgen, dass er notwendige Deklarationen im Text zu Gesicht bekommt, noch bevor man die entsprechende Variable/Funktion das erste mal verwendet. Von oben nach unten. Ein einziges mal. Verwendet werden kann, was bekannt ist. Ein C Compiler ist kein Excel, dass sich eine Strategie zurecht legt, in welcher Reihenfolge die Einzelteile abzuarbeiten sind, damit hinterher das Ergebnis stimmt.
>Einen Fehler, den viele Neulinge machen:
Öhm. Ich muss bekennen, das ich kein Neuling bin, sondern beim Schreiben
kurz aus dem Auge verloren hatte, das das Problem von der Vermutung über
den Parameter kommt und nicht über den Rückgabewert. Oder war ich
garnicht gemeint?
Kali schrieb: >>Einen Fehler, den viele Neulinge machen: > > Öhm. Ich muss bekennen, das ich kein Neuling bin, Mein Fehler. Das ging nicht an dich. Hätte ich besser kennzeichnen sollen.
Vielen Danke für die Hilfe habe das Problem gelöst und für die Zukunft gelernt =) Nochmals vielen Dank !
Karl Heinz schrieb: > > Könntest du mir vll. ein Hinweis geben wie man einen Funktionsprototypen > erstellt? Protoize? http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Running-Protoize.html
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.