Es will nicht so recht (scanf..?)
-
Hallo,
ich hab ein einfaches Programm zur Nullstellenbestimmung per Bisektion geschrieben. Funktioniert auch sehr gut, wenn ich die Funktionsparameter im Code festlege. Will ich die aber per scanf einlesen, klappt es plötzlich nicht mehr.#include<stdio.h> #include<math.h> int steps=1; double bisection( double (*f)( double), double xl, double xu, double accuracy){ while(accuracy>=0.00001){ if(f((xl+xu)*0.5)>0) xl=(xl+xu)*0.5; else xu=(xl+xu)*0.5; accuracy=fabs(xu-xl); steps++; } return fabs(xl+xu)*0.5; } double y(double x){ double v; v=x*x*0.02+sin(x); return v; } int main(void){ double *f=y; printf("%.5lf",bisection(f,6.0, 4.0, 1)); printf("\nSchritte: %i", steps); return 0; }
Das funktioniert.
#include<stdio.h> #include<math.h> int steps=1; double bisection( double (*f)( double), double xl, double xu, double accuracy){ while(accuracy>=0.00001){ if(f((xl+xu)*0.5)>0) xl=(xl+xu)*0.5; else xu=(xl+xu)*0.5; accuracy=fabs((xu-xl)*0.5); steps++; } return (xl+xu)*0.5; } double y(double x){ double v; v=x*x*0.02+sin(x); return v; } int main(void){ double inp_xu, inp_xl, *f=y; printf("untere Grenze:"); scanf("%lf", &inp_xl); printf("obere Grenze:"); scanf("%lf", &inp_xu); printf("\n%.5lf",bisection(f,inp_xl, inp_xl, 1)); printf("\nSchritte: %i\n\n\n", steps); return 0; }
Das funktioniert nicht. Es wird immer die untere Grenze ausgegeben. Ich hab irgendwie das Gefühl, dass meine doubles zu ints verwurstet werden? Habe ich beim Einlesen oder der Parameterübergabe was falsch gemacht?
-
Seh grad in z.23 müsste "double *f=y;" wohl zu "double *f; f=&y;" geändert werden, ändert aber grundsätzlich nichts an meinem Problem.
-
Barajax schrieb:
double *f=y;
Das funktioniert.
Das halte ich für ein Gerücht.
-
Doch, hat funktioniert, vermutlich ist mein Compiler heute mal gut drauf
Habs aber schon geändert, siehe zweiter Post. Das ursprüngliche Problem ist aber immer noch da.
-
Du hantierst mit Funktionszeigern rum, ohne sie wirklich verstanden zu haben.
Du verwendest falsche Einlesefunktionalitäten, siehe mal im Parallelthread "liesDouble", da wird es richtig gemacht.
Außerdem gibt es statt code hier auch cpp Tags, und deine sonstige Formatierung führt auch zu Augenkrätze.
-
Du hantierst mit Funktionszeigern rum, ohne sie wirklich verstanden zu haben.
Du verwendest falsche Einlesefunktionalitäten, siehe mal im Parallelthread "liesDouble", da wird es richtig gemacht.
Außerdem gibt es statt code hier auch cpp Tags, und deine sonstige Formatierung führt auch zu Augenkrätze.Was hab ich dir denn getan? Wenn du mir nicht helfen willst, bitteschön, antworte halt nicht. Was du schreibst bringt mich jedenfalls in keiner Weise weiter.
-
Wutz wollte dich nur auf einige der FEhler in deinem Code bzw. Beitrag aufmerksam machen. DAzu gehört auch, daß es einen Unterschied gibt zwischen "normalen" Zeigern und Funktionszeigern - und du mischst beides durcheinander. f ist ein Zeiger auf einen double-Wert, bisection() erwartet einen Zeiger auf eine Funktion.
-
Das sind halt immer die "ganz besonderen" Menschen, mach dir nix daraus. Meist sind sie ausserhalb ihres Hobbys/Jobs ganz arme Wutzchen.
-
Deine Formatierung ist wirklich für die Füße, du hilfst den Lesern mit Hilfe der cpp Tags und besserer Formatierung, deinen Code schneller zu verstehen.
Das nächste Mal wirst du es sicher besser machen.
Aber zum Problem. Für Funktionszeiger nutze ich zum besseren Veraständnis eigentlich immer typedefs:typedef double (*mycb)(double);
mycb hat nun den Returnwert double und erwartet einen solchen als einzigen Parameter.
double bisection(mycb f, double xl, double xu, double accuracy) { ... } int main(void) { double inp_xu, inp_xl; mycb f = y; ... printf("\n%.5lf",bisection(f,inp_xl, inp_xl, 1)); ... }
-
Ah verstehe. Dann müsste ich den Funktionszeiger f wohl per
double (*f)(double); f=y;
definieren und zuweisen?
-
@ _Falke: Typedefs habe ich noch nie gehört, ehrlich gesagt
Aber ich werds ausprobieren.