Forum: Compiler & IDEs "error: conflicting types for ADC_Read"


von Karl H. (karlheinz65)


Angehängte Dateien:

Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (karlheinz65)


Lesenswert?

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

von Kali (Gast)


Lesenswert?

>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.

von Karl H. (kbuchegg)


Lesenswert?

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

von Karl H. (karlheinz65)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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).

von Stefan E. (sternst)


Lesenswert?

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?

von Kali (Gast)


Lesenswert?

>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!

von Kali (Gast)


Lesenswert?

Ich hätte gerne eine Tüte mit kleinen Steinen und drei Grosse, Mammi.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Kali (Gast)


Lesenswert?

>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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Kali (Gast)


Lesenswert?

>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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Kali (Gast)


Lesenswert?

:-)

von Karl H. (karlheinz65)


Lesenswert?

Vielen Danke für die Hilfe habe das Problem gelöst und für die Zukunft 
gelernt =) Nochmals vielen Dank !

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.