Heron von Alexandria
-
Huhu,
hab da mal eine Frage, wir sollten ein Programm schreiben was die Heron von Alexandria funktion beinhaltet:
Formulieren Sie einen rekursiven Algorithmus in sqrt.c, der xk für auf der Kommandozeile gegebene Werte von a und k berechnet und ausgibt. Dabei sei a als positive reelle und k als natürliche Zahl im Dezimalsystem gegeben. x1 sei 1.Habe dabei folgende code bisher:
#include <stdio.h> #include <assert.h> int square_root(int argc,char *argv[],int y) { int a=atoi(argv[1]); assert(a >= 0); int x = a; if (x < y) { while (x > y) { x = (x+y)*0.5; y = a/x; return x; } } else{ return 0; } }
Allerdings kommt beim kompilieren folgende fehlermeldung:
In functionmain': 18 undefined reference to
WinMain'
[Error] ld returned 1 exit statusJemand ne Idee vllt ?
-
Zeig mal deine main Funktion.
-
Erstelle eine Konsolenanwendung und nenne die Datei sqrt.c, so wie verlangt.
Du hast eine Windowsanwendung erstellt, was hier falsch ist.
-
Das ist der Gesamte Code, da gibs keine Main funktion, des hat mich ja auch schon verwundert
-
Du scheinst grob verwirrt zu sein, wie Funktionen funktionieren. vielleicht solltest du noch mal einfachere Übungen wiederholen. Wenn du so weit bist, nimm mal dies als Ansatz:
double xk(double a, unsigned k) { // Dein Code hier } int main(int argc, char *argv[]) { // Dein Code hier printf("Die Wurzel von %f zu %u. Ordnung ist: %f", a, k, xk(a,k)); }
x1 sei 1.
Das ist ja wohl mal vollkommener Unsinn. Entweder hat der Ausgabensteller eine alte Aufgabenstellung zur Fakultät schlampig recycelt oder er möchte nicht, dass ihr bei korrekten Lösungen abschreibt.
-
Wutz schrieb:
Erstelle eine Konsolenanwendung und nenne die Datei sqrt.c, so wie verlangt.
Du hast eine Windowsanwendung erstellt, was hier falsch ist.Wieso ist diese hier grad falsch?
-
Damdidu schrieb:
Wieso ist diese hier grad falsch?
"Windows-Anwendungen" enthalten Fenster, Buttons, Menüs und den ganzen Kram, das brauchst du hierfür nicht.
-
Okay danke schon mal für die vielen Antworten
Habe die funktion umbenannt in main, was mich vorhin dabei geritten hat keine ahnung.
Allerdings lässt es sich zwar nun kompilieren, macht aber dennoch nicht was es soll#include <stdio.h> #include <assert.h> int main(int argc,char *argv[],int y) { int a=atoi(argv[1]); assert(a >= 0); int x = a; if (x < y) { while (x > y) { x = (x+y)*0.5; y = a/x; return x; } } else{ return 0; } }
-
Damdidu schrieb:
Allerdings lässt es sich zwar nun kompilieren,
Dann hast du einen sehr toleranten Compiler. Bei main sind zwei Signaturen gültig:
int main(void) int main(int, char**); /* Und int main(), da sie die beiden anderen enthält */
Deine selbstausgedachte Version mag zwar übersetzt werden aber was denkst du denn, was da passieren soll? Ein Computer ist keine magische Kiste, wo du dir irgendwas wünscht und dann wild irgendwas tippst und dann kommt automatisch das richtige raus. Code ist Logik pur, kein wild zusammengeschmissener Zeichensalat. Du musst von jedem Zeichen in deinem Code genau wissen, wo und warum du es setzt. In dem Sinne, erklär doch mal
int main(int argc,char *argv[],int y)
Kannst du nicht, oder? Entweder weil du es wirklich nicht weißt oder weil du merkst, dass es keinen Sinn macht. In beiden Fällen: Wie soll dann der Computer daraus ein sinnvolles Programm machen?
macht aber dennoch nicht was es soll
Du machst auch an so ziemlich keiner Stelle irgendwas gemäß Aufgabenstellung.
-
Die werte sollen ja als Kommandozeilenparameter übergeben werden, dafür ist das argc bzw argv.
das int y ist da in der tat ünerflüssig
-
Damdidu schrieb:
Die werte sollen ja als Kommandozeilenparameter übergeben werden, dafür ist das argc bzw argv.
das int y ist da in der tat ünerflüssigOk. Dann mach mal weiter so:
int a=atoi(argv[1]);
Wie verhält sich dies zur Aufgabenstellung:
Dabei sei a als positive reelle und k als natürliche Zahl im Dezimalsystem gegeben.
?
Selbst wenn dies zur Aufgabenstellung passen würde: Ist das gute Praxis so? Fallen dir mögliche Fehlerquellen ein?
-
Ich bin da nun soweit gekommen:
#include <stdio.h> double wurzel; double main(double argc,char *argv[ ]) { double a=atof(argv[1]); double n=atof(argv[2]); printf("%f", wurzel); } wurzel( double a,double n) { double x = a; double xn = n; while ( x > xn) { x=(xn+(x/xn))*0.5; return x; } }
Allerdings kommen beim compilen immernoch die Fehlermeldungen:
17 1 [Error] 'wurzel' redeclared as different kind of symbol
3 8 [Note] previous declaration of 'wurzel' was here
-
Die Fehlermeldung ist doch recht eindeutig. Was mag das wohl heißen? Es wird doch sogar zeichengenau gesagt, wo die Probleme sind.
Guck dir wirklich dringend nochmal frühere Übungen und Kapitel im Lehrwerk an. Du scheinst fundamentale Probleme mit Funktionen zu haben. Die Übungsaufgabe ist jedoch eine fortgeschrittene Benutzung von Funktionen. Das wirst du niemals lösen können, wenn du dir Grundlagen nicht beherrscht.
-
SeppJ schrieb:
Damdidu schrieb:
Allerdings lässt es sich zwar nun kompilieren,
Dann hast du einen sehr toleranten Compiler. Bei main sind zwei Signaturen gültig:
int main(void) int main(int, char**); /* Und int main(), da sie die beiden anderen enthält */
Deine selbstausgedachte Version mag zwar übersetzt werden aber was denkst du denn, was da passieren soll?
Ein Computer ist keine magische Kiste, wo du dir irgendwas wünscht und dann wild irgendwas tippst und dann
kommt automatisch das richtige raus.Auch wenn der TE nicht weiss was er tut - der Compiler kennt sicher mehr als zwei gültige
main() Funktionen, wie z.b. diese:main(int argc, char **argv, char **env)
http://www.willemer.de/informatik/unix/unprmain.htm
PS: Leider passen Pointer bei 32 Bit auch regelmässig in int - warnings zeigen einige Compiler nur
an wenn man sie darum bittet ...
-
Stimmt, das war schlecht formuliert. Besser: Es gibt zwei Signaturen, die unterstützt werden müssen, das sind die beiden genannten. Es darf weitere geben, das ist dann der Implementierung überlassen, diese zu dokumentieren.
Aber keine Implementierung macht das, was der TE hier erwartet. Stattdessen passiert wohl das, was du hier beschreibst: Er trifft zufällig eine von den Typen her passende Funktion, aber die Argumente haben eine völlig andere Bedeutung als er denkt.