Ansicht:   

#159660

Mr. Teflon

06.09.2009, 14:45:28
(editiert von Mr. Teflon, 06.09.2009, 14:47:43)

(C) Syntaxfehler? - [Error(ccom)] type redeclaration of Durchschnitt (ed) (pc.coding)

Hallo,

der Compiler will mir irgendwas sagen was ich aber nicht verstehe was er von mir will.  :kratz:

Die Variablen Messungen, Messwert und TempMesswert sind der Einfachheithalber als float deklariert.

Compilermeldung:

C:\\WorkSpace\\BikeBrake\\BikeBrake\\BikeBrake.c(945):
[Error(ccom)] type redeclaration of Durchschnitt
===> {
Sorry, compilation terminated because of these errors in Durchschnitt().

Aufgerufen wird das mit:

chan = 4;
Durchschnitt(chan);


// 10 Messungen und Mittelwertbildung
void Durchschnitt (uchar chan)	
	{
	Messungen = 0;
	Messwert = 0;
	TempMesswert = 0;
	while(Messungen < 10)
		{
	 	Messungen++;
	 	TempMesswert = float ad_in(chan);	
	 	Messwert = Messwert + TempMesswert;
		}
	Messwert = Messwert / 10; 
	}



Warum meckert der Compiler mit einer Redeklaration rum?

Wenn ich diesen Funktionsinhalt hier direkt in die andere Funktion schreibe, wo der Messwert weiter verarbeitet wird, dann klappt das alles. Lager ich es als allgemeine Funktion aus, meckert der Compiler rum. Das Wort Durchschnitt gibt es nur einmal für diesen Funktionsnamen im gesamten Programm.

--
___________
Tschau
Mr. Teflon

#159663

MudGuard zur Homepage von MudGuard

München,
06.09.2009, 14:52:45

@ Mr. Teflon

(C) Syntaxfehler? - [Error(ccom)] type redeclaration of Durchschnitt

> Aufgerufen wird das mit:
>
> chan = 4;
> Durchschnitt(chan);

Vermutung: der Aufruf steht vor der Definition.
Damit wird die Default-Deklaration angenommen, iirc ist das

int Durchschnitt();

wenn dann später im Text plötzlich

void Durchschnitt (uchar chan)

daherkommt, ist das eine Re-Deklaration, da ja schon implizit deklariert wurde. Da das Ding von der Default-Deklaration abweicht, kommt die Fehlermeldung.

2 mögliche Abhilfen:

1. Die Funktionsdefinition vor dem Aufruf schreiben.
2. Eine Funktionsdeklaration vor dem Aufruf schreiben.

--
[image]
MudGuard
O-o-ostern

#159664

MudGuard zur Homepage von MudGuard

München,
06.09.2009, 14:53:26

@ MudGuard

(C) Syntaxfehler? - [Error(ccom)] type redeclaration of Durchschnitt

PS:
> 1. Die Funktionsdefinition vor dem Aufruf schreiben.

Das ist nicht immer möglich, z.B. bei Funktionen, die sich gegenseitig aufrufen.

> 2. Eine Funktionsdeklaration vor dem Aufruf schreiben.

Das geht immer.

--
[image]
MudGuard
O-o-ostern

#159668

Mr. Teflon

06.09.2009, 16:43:35
(editiert von Mr. Teflon, 06.09.2009, 16:45:57)

@ MudGuard

(C) Syntaxfehler? - [Error(ccom)] type redeclaration of Durchschnitt (ed)

> PS:
> > 1. Die Funktionsdefinition vor dem Aufruf schreiben.
>
> Das ist nicht immer möglich, z.B. bei Funktionen, die sich gegenseitig
> aufrufen.
>
> > 2. Eine Funktionsdeklaration vor dem Aufruf schreiben.
>
> Das geht immer.

Hallo,

das wirft mich jetzt von der Arbeitsweise her eines Compilers etwas aus der Bahn. Warum ist die Positionsreihenfolge der Funktionen nicht egal. Das sind doch praktisch eigentlich nur Sprungmarken würde man in Basic sagen.

Aber wenn ich wie Du sagst, die Funktion ganz oben nach include usw. deklariere

void Durchschnitt (uchar chan);

dann funktioniert es tatsächlich. Besten Dank!

Also sollte man jede Funktion die man hat am Anfang deklarieren um spätere Problemen vorzubeugen?
Das ist für mich irgendwie alles doppelt gemoppelt.

Ich verstehe es jedoch immer noch nicht ganz. Der Compiler sieht doch den gesamten Programmcode bevor er es übersetzt. Warum stört ihm dann die Reihenfolge?

Ich meine, in den vielen Beispielprogrammen die ich nun schon gesehen habe werden doch auch Variablen nicht exakt am Enfang sondern erst in der Funktion deklariert. Das geht doch auch.

--
___________
Tschau
Mr. Teflon

#159670

MudGuard zur Homepage von MudGuard

München,
06.09.2009, 17:13:31

@ Mr. Teflon

(C) Syntaxfehler? - [Error(ccom)] type redeclaration of Durchschnitt

> das wirft mich jetzt von der Arbeitsweise her eines Compilers etwas aus
> der Bahn. Warum ist die Positionsreihenfolge der Funktionen nicht egal. Das
> sind doch praktisch eigentlich nur Sprungmarken würde man in Basic sagen.

Weil C einen one-pass-compiler benutzt.

> Ich verstehe es jedoch immer noch nicht ganz. Der Compiler sieht doch den
> gesamten Programmcode bevor er es übersetzt.

Nein, eben nicht. C kennt (one-pass-compiler) beim Übersetzen einer Codezeile nur alles, was vor dieser Zeile kommt (und natürlich diese Zeile).

--
[image]
MudGuard
O-o-ostern

#159673

Mr. Teflon

06.09.2009, 17:30:22

@ MudGuard

(C) Syntaxfehler? - [Error(ccom)] type redeclaration of Durchschnitt

Hallo,

ach\'so. Und wenn am Anfang Funktionsdeklarationen stehen, dann sieht der Compiler die Deklaration, springt zur Funktion, guckt sich diese an, weis Bescheid, springt zurück und macht weiter.
Ansonsten würde der Compiler ja auch nur die Deklaration irgendeiner Funktion sehen dennoch nicht wissen was die macht.

Stelle ich mir das einigermaßen richtig vor?

--
___________
Tschau
Mr. Teflon

#159675

MudGuard zur Homepage von MudGuard

München,
06.09.2009, 18:16:30

@ Mr. Teflon

(C) Syntaxfehler? - [Error(ccom)] type redeclaration of Durchschnitt

> ach\'so. Und wenn am Anfang Funktionsdeklarationen stehen, dann sieht der
> Compiler die Deklaration, springt zur Funktion,

Nein, er springt eben nicht. Er geht genau einmal von vorne nach hinten über den Quelltext (One-Pass).

Wenn er die Deklaration vor dem Aufruf gesehen hat, hat er zu dem Zeitpunkt, wo er mit dem Compilieren beim Aufruf angekommen ist, alle nötigen Informationen, um den Aufruf zu kompilieren. Was die Funktion macht, ist dafür vollkommen wurscht. Der Compiler muß nur die Art und Anzahl der Parameter sowie den Rückgabetyp kennen, um den Aufruf zu compilieren.

> Stelle ich mir das einigermaßen richtig vor?

Nö, absolut nicht.

--
[image]
MudGuard
O-o-ostern

#159913

Mr. Teflon

07.09.2009, 22:54:45

@ MudGuard

(C) Syntaxfehler? - [Error(ccom)] type redeclaration of Durchschnitt

> > Stelle ich mir das einigermaßen richtig vor?
>
> Nö, absolut nicht.

Hallo,

ich denke ganz fest - jetzt habe ich es verstanden.  ;-)

Danke.

--
___________
Tschau
Mr. Teflon

Ansicht:   
Auf unserer Web-Seite werden Cookies eingesetzt, um diverse Funktionalitäten zu gewährleisten. Hier erfährst du alles zum Datenschutz