Forum: PC-Programmierung conflicting types for 'wurzel'|


von serf5 (Gast)


Lesenswert?

Bitte ich brauche hilfe. Das ist meine Programme:
#include <stdlib.h>
#include<math.h>
double main()
{
double x1,x2,x3;
x1=4.52;
x2=10.5677;
x3=150.578;

double Mx1=wurzel( x1);
printf("x1:%f\n",Mx1);
double Mx2= wurzel( x2);
printf("x2:%f\n",Mx2);
double Mx3= wurzel( x3);
printf("x3:%f\n",Mx3);
return 0;
}


 double wurzel(double x)
{
    double m;
    double f=0.1;
    double wurz=sqrt(x);
for (m=x/2;m*m<x;)
    {
        m=m+f;
        printf("%f=%f\n",m,wurz);

    }

    for (m=x/2;m*m>x;)
    {
        m=m-f;

        printf("%f=%f\n",m,wurz);
    }


   return m;
}


Zeigt mir immer fehler:
conflicting types for 'wurzel'

was ist bedeutet? Wie kann ich wieder gut machen?
Eingentlich wollte ich aus funktion "wurzel" in hauptprogramm werte  von 
m in double zurückgeben.

von Dumdi D. (dumdidum)


Lesenswert?

Schieb mal die Funktion 'wurzel' vor die Funktion 'main'

von Kaj (Gast)


Lesenswert?

serf5 schrieb:
> #include<math.h>
Leerzeichen fehlt

serf5 schrieb:
> double main()
int main()

serf5 schrieb:
> for (m=x/2;m*m<x;)
nicht schoen

serf5 schrieb:
> printf("%f=%f\n",m,wurz);
falsche parameter, das muesste glaube ich %lf heissen und nicht %f

Dein Problem duerfte aber sein, das du deine Funktion wurzel nicht 
deklariert hast.
Entweder du verschiebst die Funktion vor main oder aber du laesst die 
Funktion wo sie ist und du deklarierst sie mal aben schnell vor main.

http://stackoverflow.com/questions/1549631/getting-conflicting-types-for-function-in-c-why

von serf5 (Gast)


Lesenswert?

Vielen dank für den Rat!! Jetzt funktionirt es! Aber warum?

von Detlef K. (adenin)


Lesenswert?

Die Funktion wurzel() muss vor der Benutzung deklariert werden.

von Detlef K. (adenin)


Lesenswert?

serf5 schrieb:
> Vielen dank für den Rat!! Jetzt funktionirt es! Aber warum?

Ich geh schlafen.
;)

von Rolf Magnus (Gast)


Lesenswert?

serf5 schrieb:
> Zeigt mir immer fehler:
> conflicting types for 'wurzel'

Also bei mir sagt der Compiler:
1
serf5.c:3:8: Warnung: Rückgabetyp von »main« ist nicht »int« [-Wmain]
2
serf5.c: In Funktion »main«:
3
serf5.c:10:1: Warnung: Implizite Deklaration der Funktion »wurzel« [-Wimplicit-function-declaration]
4
serf5.c:11:1: Warnung: Implizite Deklaration der Funktion »printf« [-Wimplicit-function-declaration]
5
serf5.c:11:1: Warnung: Unverträgliche implizite Deklaration der eingebauten Funktion »printf« [standardmäßig aktiviert]
6
serf5.c: Auf höchster Ebene:
7
serf5.c:20:9: Fehler: In Konflikt stehende Typen für »wurzel«
8
serf5.c:10:12: Anmerkung: Vorherige implizite Deklaration von »wurzel« war hier
9
serf5.c: In Funktion »wurzel«:
10
serf5.c:28:9: Warnung: Unverträgliche implizite Deklaration der eingebauten Funktion »printf« [standardmäßig aktiviert]
11
serf5.c:36:9: Warnung: Unverträgliche implizite Deklaration der eingebauten Funktion »printf« [standardmäßig aktiviert]

serf5 schrieb:
> Vielen dank für den Rat!! Jetzt funktionirt es! Aber warum?

Weil der Compiler nun beim Aufruf auch weiß, daß die Funktion ein double 
zurückgibt.
Wenn man ihm das nicht sagt, nimmt er als default int an. Wenn er dann 
später zu der Implementation deiner Funktion kommt, steht da aber auf 
einmal double, was seiner vorherigen Annahme widerspricht. Also gibt's 
da einen Fehler.

von Dirk B. (dirkb2)


Lesenswert?

Kaj schrieb:
> serf5 schrieb:
>> printf("%f=%f\n",m,wurz);
> falsche parameter, das muesste glaube ich %lf heissen und nicht %f

Das ist falsch!

Lies nochmal die Referenz/man page für printf durch.

Bei Funktionen mit variablen Argument werden Ganzzahltypen (char, short) 
in int gewandelt und float als double übergeben. (Macht der Compiler, 
steht im Standard)
Somit kennt printf kein float und daher ist %f für double (und damit 
auch float) da.

Dies glit für printf. scanf ist eine ganz andere Funktion (die erwartet 
ja auch Zeiger als Paramter)

Die Compiler aktzeptieren das %lf und seit C11 ist es auch im Standard 
enthalt und somit nicht mehr falsch. Aber nötig ist es nicht.

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.