void in C?

Seite 1 von 3 - Forum: Coding Stuff auf overclockers.at

URL: https://www.overclockers.at/coding-stuff/void_in_c_183004/page_1 - zur Vollversion wechseln!


Qualle schrieb am 30.07.2007 um 14:08

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


.dcp schrieb am 30.07.2007 um 14:09

reicht der erste thread nich?


Qualle schrieb am 30.07.2007 um 14:12

sorry firefox hat sicher verabschiedet und der thread war noch nicht vertig.
hab nicht gesehen, dass es schon drinnen ist! SORRY!!!


daisho schrieb am 30.07.2007 um 14:15

Ich bin zwar kein Programmier-Pro, aber du rufst eine Funktionslose Klasse auf und die soll sqrt(2.0) returnen?


Armax schrieb am 30.07.2007 um 14:18

Code:
#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 schrieb am 30.07.2007 um 14:20

@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 schrieb am 30.07.2007 um 14:20

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:

Code:
#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 :D


Qualle schrieb am 30.07.2007 um 14:23

@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.


AdRy schrieb am 30.07.2007 um 14:26

Qualle wir wärs wenn du lernst compiler fhelermeldungen mal zu verstehn? steht doch eh alles da was falsch is:

Zitat
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

Zitat
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 schrieb am 30.07.2007 um 14:28

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 schrieb am 30.07.2007 um 14:29

ah jetzt seh ich den fehler XD du hast sqrt() deklariert du musst schon sqrt2() deklarieren :rolleyes:

edit: damn owned


daisho schrieb am 30.07.2007 um 14:30

Zitat von Qualle
@daisho:edit: so wie du das schreibst funktioniert es auch nicht!
hab es compiliert.
Hehe, war auch nur aus Erinnerungen von C++ Zeiten konstruiert :p


Qualle schrieb am 30.07.2007 um 14:31

@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!!!!


3mind schrieb am 30.07.2007 um 14:34

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 schrieb am 30.07.2007 um 14:38

@ 3mind: LCC-Win32 aber da zu compilieren und zu linken gleicht einem wunder für mich!!!:)




overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2026