"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

void in C?

Qualle 30.07.2007 - 14:08 2902 35
Posts

Qualle

Banned
Registered: Jul 2007
Location: Austria
Posts: 46
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
Avatar
Registered: Jul 2002
Location: new
Posts: 8881
reicht der erste thread nich?
Bearbeitet von .dcp am 30.07.2007, 14:12

Qualle

Banned
Registered: Jul 2007
Location: Austria
Posts: 46
sorry firefox hat sicher verabschiedet und der thread war noch nicht vertig.
hab nicht gesehen, dass es schon drinnen ist! SORRY!!!

daisho

SHODAN
Avatar
Registered: Nov 2002
Location: 4C4
Posts: 19688
Ich bin zwar kein Programmier-Pro, aber du rufst eine Funktionslose Klasse auf und die soll sqrt(2.0) returnen?

Armax

OC Addicted
Registered: Apr 2004
Location: .
Posts: 1058
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

Banned
Registered: Jul 2007
Location: Austria
Posts: 46
@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
Avatar
Registered: Nov 2002
Location: 4C4
Posts: 19688
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
Bearbeitet von daisho am 30.07.2007, 14:25

Qualle

Banned
Registered: Jul 2007
Location: Austria
Posts: 46
@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
Avatar
Registered: Oct 2002
Location: Wien
Posts: 5239
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

Addicted
Avatar
Registered: Aug 2004
Location: Austria, 1050
Posts: 492
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
Avatar
Registered: Oct 2002
Location: Wien
Posts: 5239
ah jetzt seh ich den fehler XD du hast sqrt() deklariert du musst schon sqrt2() deklarieren :rolleyes:

edit: damn owned

daisho

SHODAN
Avatar
Registered: Nov 2002
Location: 4C4
Posts: 19688
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

Banned
Registered: Jul 2007
Location: Austria
Posts: 46
@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
Avatar
Registered: Sep 2004
Location: 1030
Posts: 1588
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
Registered: Jul 2007
Location: Austria
Posts: 46
@ 3mind: LCC-Win32 aber da zu compilieren und zu linken gleicht einem wunder für mich!!!:)
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz