Seite 1 von 2
Prozeduren bringen Fehlermeldungen
Verfasst: Sa Apr 12, 2014 5:01 pm
von Schwimmfreak
Guten Tag Liebe Community,
Dies ist mein erster Post in diesem Forum deshalb verzeiht mir wenn er im falschen Bereich ist.
Ich arbeite mich momentan durch das Grundlagentutorial von C und bin beim Abschnitt Funktionen --> Prozeduren angelangt.
Code: Alles auswählen
#include <stdio.h>
void SayHello( int howOften )
{
int i;
for( i=0; i<howOften; i++ )
{
if( i == 5 )
return; // nach 5mal abrechen.
printf( "Hello\n" );
}
}
Als ich folgenden Quellcode (im Tutorial angegeben) kompilieren wollte gibt er mir den Fehler aus
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.7.1\..\..\..\libmingw32.a(main.o):main.c:(.text.startup+0xa7)||
undefined reference to `WinMain@16'|
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
Kann mir jemand diesen Fehler erläutern und vielleicht auch beheben, sollte so wie ich das lese und da der Quellcode wegen dem Tutorial gar nicht falsch sein kann ja irgendwie intern an meinem PC hängen.
Re: Prozeduren bringen Fehlermeldungen
Verfasst: Sa Apr 12, 2014 5:11 pm
von mfro
Schwimmfreak hat geschrieben:
Kann mir jemand diesen Fehler erläutern
Klar: in C _muß_ jedes Programm eine Funktion main() enthalten (das ist der "Anfang" des Programms). Die fehlt bei dir und deswegen meckert dein Compiler.
Häng' das:
Code: Alles auswählen
int main(int argc, char *argv[])
{
SayHello(3);
return 0;
}
"hinten" an und dein Programm müsste funktionieren.
Re: Prozeduren bringen Fehlermeldungen
Verfasst: Mo Apr 14, 2014 9:00 am
von oenone
Etwas Off-Topic: Aus einer Schleife mit return auszubrechen ist schlechter Stil.
Re: Prozeduren bringen Fehlermeldungen
Verfasst: Mo Apr 14, 2014 10:16 am
von xerion21
oenone hat geschrieben:Etwas Off-Topic: Aus einer Schleife mit return auszubrechen ist schlechter Stil.
um es mal konstruktiv zu machen:
Wenn du schon unbedingt abbrechen willst, benutze in einer Schleife lieber ein:

Re: Prozeduren bringen Fehlermeldungen
Verfasst: Mo Apr 14, 2014 10:55 am
von canlot
oenone hat geschrieben:Etwas Off-Topic: Aus einer Schleife mit return auszubrechen ist schlechter Stil.
Jeder hat da seine Vorlieben, aber darf ich fragen warum?
Ich empfinde es nicht als einen schlechten Stil, warum sollte die Funktion die CPU weiter verschwenden wenn sie nicht muss, und als unübersichtlich empfinde ich es auch nicht.
Re: Prozeduren bringen Fehlermeldungen
Verfasst: Mo Apr 14, 2014 11:58 am
von oenone
Mit einem break ist es wartbarer und lesbarer. Mit CPU-Zeit hat das nichts zu tun.
In dem obigen trivialen Beispiel ist es sicher egal.
Wenn du z.B. eine Funktion anpasst, musst du alle return-Statements nochmal untersuchen, ob sie immernoch das tun, was die Funktion tun soll. Mit break hast du nur eine Stelle, an der die Funktion verlassen wird.
Re: Prozeduren bringen Fehlermeldungen
Verfasst: Mo Apr 14, 2014 12:08 pm
von xerion21
canlot hat geschrieben:oenone hat geschrieben:Etwas Off-Topic: Aus einer Schleife mit return auszubrechen ist schlechter Stil.
Jeder hat da seine Vorlieben, aber darf ich fragen warum?
Ich empfinde es nicht als einen schlechten Stil, warum sollte die Funktion die CPU weiter verschwenden wenn sie nicht muss, und als unübersichtlich empfinde ich es auch nicht.
mit
sollte man Schleifen verlassen. Funktionen sollte man weiterhin mit
verlassen.
Re: Prozeduren bringen Fehlermeldungen
Verfasst: Mo Apr 14, 2014 12:58 pm
von Xin
Und man sollte sich überlegen, wie man programmieren möchte.
Es ist guter Stil, eine Funktion nur an einer einzigen Stelle zu verlassen.
Es ist schlechter Stil, unnötige Fragen zu stellen, zum Beispiel, ob die Schleife ihr Ziel erreicht hat (i==5) oder nicht. Das wusste man an der Stelle, wo das return steht schon. Wenn man nach der Schleife nochmals fragen müsste, dann wäre vielleicht ein goto anzuraten.
Moment... goto? Das ist doch ganz schlechter Stil und mieserabel wartbar. Um aus zwei Schleifen rauszuspringen braucht man zwei breaks, was beim zweiten break aber zusätzliche Fragen bedeutet. Hier kann auch Goto helfen.
Hier werden keine Fragen mehr gestellt, es muss auch nicht ein Rückgabecode zwischengespeichert werden. Das break wäre hier optimal. Aber bitte keine Zwangsjacken mit "So macht man das, weil das guter Stil ist", sondern bitte eine bewusste Abwägen von Vor- und Nachteilen einer Lösung.
Hier hätte das "break" den Vorteil, dass die Funktion nur einen Ausgang hat, das return entsprechend den Nachteil, dass die Funktion zwei Ausgänge hat. Ansonsten unterscheiden sich die Lösungen nicht.
break ist also hier die bessere Wahl. Anderswo kann das anders aussehen.
Für Stil muss man Zeit haben.
Re: Prozeduren bringen Fehlermeldungen
Verfasst: Mo Apr 14, 2014 1:07 pm
von xerion21
Xin hat geschrieben:Und man sollte sich überlegen, wie man programmieren möchte.
Es ist guter Stil, eine Funktion nur an einer einzigen Stelle zu verlassen.
Es ist schlechter Stil, unnötige Fragen zu stellen, zum Beispiel, ob die Schleife ihr Ziel erreicht hat (i==5) oder nicht. Das wusste man an der Stelle, wo das return steht schon. Wenn man nach der Schleife nochmals fragen müsste, dann wäre vielleicht ein goto anzuraten.
Moment... goto? Das ist doch ganz schlechter Stil und mieserabel wartbar. Um aus zwei Schleifen rauszuspringen braucht man zwei breaks, was beim zweiten break aber zusätzliche Fragen bedeutet. Hier kann auch Goto helfen.
Hier werden keine Fragen mehr gestellt, es muss auch nicht ein Rückgabecode zwischengespeichert werden. Das break wäre hier optimal. Aber bitte keine Zwangsjacken mit "So macht man das, weil das guter Stil ist", sondern bitte eine bewusste Abwägen von Vor- und Nachteilen einer Lösung.
Hier hätte das "break" den Vorteil, dass die Funktion nur einen Ausgang hat, das return entsprechend den Nachteil, dass die Funktion zwei Ausgänge hat. Ansonsten unterscheiden sich die Lösungen nicht.
break ist also hier die bessere Wahl. Anderswo kann das anders aussehen.
besser hätte man es nicht ausdrücken können

Für Stil muss man Zeit haben.
Re: Prozeduren bringen Fehlermeldungen
Verfasst: Mo Apr 14, 2014 1:35 pm
von oenone
Am Besten wäre in dem Beispiel natürlich, die Abfrage ob x==5 gleich in die for-Schleife zu integrieren.