C Übersetzungfehler, Ursache unbekannt

Fireball89

Captain
Registriert
Aug. 2007
Beiträge
3.498
Habe heute zur Übung eine rekursive Runden-Funktion in C geschrieben.
Fehlermeldung: test.c:10: incompatible types for redefinition of 'runden'
Ich bins x Mal durchgegangen. Ich seh da keinen Fehler.
Ihr vielleicht?

Achja: Die Zeile 10 is der Funktionskopf.

Code:
#include <stdio.h>
#include <math.h>

int main (void) {
	double a = 16.35722;
	int p = 2;
	printf("%f\n",runden(a,p));
}

double runden (double i, int pr) {
	if (pr<1) {
		if ((i-floor(i))<0.5) return floor(i);
		else return ceil(i);
	}
	else return (runden(i*10,pr-1))/10;
}
 
Vertausche mal main und runden. Also erst runden definieren, dann in main aufrufen.
 
das darf nicht wahr sein -.-
Ich könnte meinen alten Info-Lehrer dafür umbringen, denn er hat uns immer beigebracht (in Java natürlich): Main-Funktion nach ganz oben. Ich hab mir das dermaßen eingeprägt ...
Seitdem krieg ich in der Uni immer Ärger damit und jetzt das noch.

Vielen Dank fürs Brett vorm Kopf entfernen!
 
Ich würde Ihne alleine dafür killen, dass er euch mit sonem Zeug wie Java "programmieren" beibringen will :evillol:
 
Fireball89 schrieb:
Ich könnte meinen alten Info-Lehrer dafür umbringen, denn er hat uns immer beigebracht (in Java natürlich): Main-Funktion nach ganz oben. Ich hab mir das dermaßen eingeprägt ...

sowas nennt man Coding-Conventions, da kann jeder seine eigenen festlegen. Da es keine offziellen gibt, wo die Main-Methode stehen soll (ist ja auch nur eine), hat euer Lehrer eben eine geschaffen, gut so.
Man müsste viel mehr die Schuld bei den C-Compilern suchen, dass die nichtmal ein reordering der Funktionen machen können, aber das sind andere Diskussionen.
 
Kleine Ergaenzung zu dem bereits geschriebenen:
Es ist in dem Fall egal, ob du die komplette runden-funktion vor die main setzt oder einfach nur die Zeile
double runden (double i, int pr);
vor die main schreibst.
 
Funktionskopf ohne Rumpf => Prototype (benötigt nicht einmal Variablen-Namen, sondern nur Typen) - legt die "Signatur" der Funktion fest (danach entscheidet C++ z.B. auch beim Überladen, welche Funktion letztlich angesprungen wird).

Beispiel:
Code:
double runden (double, int);


Gesamte Funktion => Implementierung (hier werden die Variablen-Namen benötigt, da sie ja aller Wahrscheinlichkeit nach innerhalb der Funktion angesprochen werden)

Beispiel:
Code:
double runden (double, int)
{
    double x;

    ...

    return x;
}

Da C im Gegensatz zu Java ein Single-Pass-Compiler ist, muss die Funktionssignatur beim ersten Aufruf bekannt sein, sonst werden die Typen als int angenommen. Das ist einer der Gründe, warum Header-Dateien existieren - zur Prototypen-Deklaration.
 
Zurück
Oben