void in C?
Qualle 30.07.2007 - 14:08 2902 35
Qualle
Banned
|
Hallo an alle!
Beispiel aus meinem Buch:
#include <stdio.h> #include <math.h>
double sqrt();
void main() { printf("Wurzel aus 2:%lg\n",sqrt2()); } double sqrt2() { return(sqrt(2.0)); }
Compiler wirft eine Fehlermeldung aus: 7 C:\Dev-Cpp\Unbenannt1.cpp `main' must return `int' C:\Dev-Cpp\Unbenannt1.cpp In function `int main(...)': 8 C:\Dev-Cpp\Unbenannt1.cpp `sqrt2' undeclared (first use this function) (Each undeclared identifier is reported only once for each function it appears in.) C:\Dev-Cpp\Unbenannt1.cpp In function `double sqrt2()': 11 C:\Dev-Cpp\Unbenannt1.cpp `double sqrt2()' used prior to declaration
Da bei der Funktion double sqrt(); das Klammerpaar leer ist.
Die Erklärung aus dem Buch:
Was also ist die Ursache für die Fahlermeldung? Was Sie noch nicht wissen können, leider akzeptiert der Compiler die Anweisung double sqrt2(); nicht als Funktionsprotoypen, Die Ursache ist das leere Klammerpaar. Der Compiler nimmt an, Sie hätten vergessen, in den Klammern die Funktionsparameter aufzuführen und beschwert sich. Tun Sie dem Compiler den Gefallen und weisen explizit darauf hin, dass es sich bei sqrt2 um eine parameterlose Fuktion handelt.Möglich wird dies durch das Schlüsselwort void, das anstelle eines Parameters in den Klammern aufgeführt werden muss: double sqrt2(void);
Die geänderte Version:
#include <stdio.h> #include <math.h>
double sqrt(void);
void main() { printf("Wurzel aus 2:%lg\n",sqrt2()); } double sqrt2() { return(sqrt(2.0)); }
Fehlermeldungen:
7 C:\Dev-Cpp\Unbenannt1.cpp `main' must return `int' C:\Dev-Cpp\Unbenannt1.cpp In function `int main(...)': 8 C:\Dev-Cpp\Unbenannt1.cpp `sqrt2' undeclared (first use this function) (Each undeclared identifier is reported only once for each function it appears in.) C:\Dev-Cpp\Unbenannt1.cpp In function `double sqrt2()': 11 C:\Dev-Cpp\Unbenannt1.cpp `double sqrt2()' used prior to declaration
Bearbeitet von Qualle am 30.07.2007, 16:46
|
.dcp
notamodbuthot
|
reicht der erste thread nich?
Bearbeitet von .dcp am 30.07.2007, 14:12
|
Qualle
Banned
|
sorry firefox hat sicher verabschiedet und der thread war noch nicht vertig. hab nicht gesehen, dass es schon drinnen ist! SORRY!!!
|
daisho
SHODAN
|
Ich bin zwar kein Programmier-Pro, aber du rufst eine Funktionslose Klasse auf und die soll sqrt(2.0) returnen?
|
Armax
OC Addicted
|
#include <stdio.h>
#include <math.h>
double sqrt(void);
void main()
{
printf("Wurzel aus 2:%lg\n",sqrt2());
}
double sqrt2()
{
return(sqrt(2.0));
}
Dein prototyp heißt "sqrt"... aufrufen tust du sqrt2 Außerdem heißts iirc main(void *arg)
|
Qualle
Banned
|
@Armax: sqrt ist geändert aber es bleibt immer noch die Fehlermeldung:7 C:\Dev-Cpp\Unbenannt1.cpp `main' must return `int'
mit *arg funtionierts auch nicht.
|
daisho
SHODAN
|
sqrt(double) ist auch die Funktion von Wurzelziehen schätze ich einmal und nicht seine Klasse. /Edit: Im zweiten Versuch ist sqrt2 btw 2mal definiert, kA ob das normal ist so zu schreiben. (Beim 2ten mal kann man sich "double" ja sparen schätze ich) /Edit2: Hab jetzt keinen Compiler bei der Hand um das zu testen und meine Grund-C-Übungen sind schon einige Jährchen her aber ich würde das so machen: #include <stdio.h>
#include <math.h>
double sqrt2(double);
void main()
{
printf("Wurzel aus 2:%lg\n",sqrt2(double));
}
sqrt2(double)
{
return(sqrt(2.0));
}
Ich hoffe ich schreib da keinen BS
Bearbeitet von daisho am 30.07.2007, 14:25
|
Qualle
Banned
|
@daisho: deswegen wurde sie auch in sqrt2 umbenannt. wenn ich mich nicht irre.
@daisho:edit: so wie du das schreibst funktioniert es auch nicht! hab es compiliert.
Bearbeitet von Qualle am 30.07.2007, 14:27
|
AdRy
Auferstanden
|
Qualle wir wärs wenn du lernst compiler fhelermeldungen mal zu verstehn? steht doch eh alles da was falsch is: 7 C:\Dev-Cpp\Unbenannt1.cpp `main' must return `int' C:\Dev-Cpp\Unbenannt1.cpp In function `int main(...)': Die funktion heisst main() und nicht void main() in C 8 C:\Dev-Cpp\Unbenannt1.cpp `sqrt2' undeclared (first use this function) (Each undeclared identifier is reported only once for each function it appears in.) C:\Dev-Cpp\Unbenannt1.cpp In function `double sqrt2()': 11 C:\Dev-Cpp\Unbenannt1.cpp `double sqrt2()' used prior to declaration Was soll die funktion sqrt2 sein? wurzelziehn is sqrt! Wenn sqrt2 eine selbstgeschriebene funktion ist musst du sie deklarieren.
|
Bowser
Addicted
|
Sorry, aber das Problem liegt nicht an der Wurzelfunktion. Steht doch eh schon in der ersten Fehlermeldung, dass main einen int als Rückgabewert haben muss. Is auch logisch so, weil die main Funktion ja die Anzahl der Fehler die aufgetreten sind zurückwerfen sollte. Also, mach einen int aus dem void und schreib ein return 0; unten dran und dann sollts funktionieren. Das aus dem Buch muss aber nicht zwingend falsch sein deswegen. Es gibt ja viele Compiler und die verwenden leicht unterschiedliche Standards. Dev-CPP verwendet z.B. auch den GNU Compiler und der verlangt eben einen int als Rückgabe von main. EDIT: Aja, und deine sqrt2 Funktion sollte über der main funktion deklariert werden. Sonst kennt er sie in main ja nicht.
|
AdRy
Auferstanden
|
ah jetzt seh ich den fehler XD du hast sqrt() deklariert du musst schon sqrt2() deklarieren edit: damn owned
|
daisho
SHODAN
|
@daisho:edit: so wie du das schreibst funktioniert es auch nicht! hab es compiliert. Hehe, war auch nur aus Erinnerungen von C++ Zeiten konstruiert
|
Qualle
Banned
|
@AdRy: Das Buch sagt, dass es in den seltensten fällen einen rückgabewert der main funktion giebt und daher wird void main verwendet. EDIT:@ArRy: wenn ich einfach nur main() schreibe funktionierts!!! komische sache!!!!
Bearbeitet von Qualle am 30.07.2007, 14:37
|
3mind
mimimi
|
gut, wenn du dich schon so sehr an dein buch hältst:
steht vielleicht auch irgendwo im buch für welchen compiler die im buch verwendeten code-beispiele ausgelegt sind? wenn dem so ist solltest einfach den genannten compiler verwenden und dir somit weitere 'probleme' ersparen.
|
Qualle
Banned
|
@ 3mind: LCC-Win32 aber da zu compilieren und zu linken gleicht einem wunder für mich!!!
|