Du bist nicht eingeloggt.

Login

Pass

Registrieren

Community
Szene & News
Locations
Impressum

Forum / Bits und Bytes

Fehler im C-Code

  -1- -2- vorwärts >>>  
Motocross_M - 30
Halbprofi (offline)

Dabei seit 01.2006
375 Beiträge

Geschrieben am: 08.04.2010 um 10:53 Uhr

hi, ich programmier seit kurzer zeit mit C rum, und habe jetzt ein kleines programm gemacht. aber irgendwo im code muss ein fehler sein, da ich mit Code::Blocks zwar auf "build" klicken kann, aber das programm nicht starten kann.

soll ich den code mal posten?

Ich hab keine Fußzeile nötig.

Motocross_M - 30
Halbprofi (offline)

Dabei seit 01.2006
375 Beiträge

Geschrieben am: 08.04.2010 um 11:00 Uhr

okay da ich jetzt gehen muss, hier ist der code:

#include <stdio.h>

void addition(void);
void subtraktion(void);
void multiplikation(void);
void division(void);

int main (void)
{
int wahl3;
Anfang:
printf ("Rechner: Waehlen Sie eine Rechenart:\n\t1.)Addition\n2.)Subtraktion\n3.)Multiplikation\n4.)Division\n");
scanf ("%d", &wahl3);
switch (wahl3)
{
case 1 : addition();
break;
case 2 : subtraktion();
break;
case 3 : multiplikation();
break;
case 4 : division();
break;
default : printf ("Unbekannte Eingabe\n");
goto Anfang;
}
return 0;
}

void addition(void)
{
double zahl, summe=0;
int wahl;
printf ("Addition (Eingabe durch das Eingeben von 0 beenden)");
Addition:
while (1)
{
printf ("\nZahl eingeben => ");
scanf ("%lf", &zahl);
if (zahl == 0)
continue;
else
summe += zahl;
}
printf ("\nDie Summe aller Zahlen beträgt %lf", summe);
Wahl:
printf ("\n\nWollen Sie den Vorgang wiederholen?\n\t1.)ja\n2.)nein\n");
scanf ("%d", &wahl);
switch (wahl)
{
case 1 : goto Addition;
break;
case 2 : goto Anfang;
break;
default : printf ("Unbekannte Eingabe\n");
goto Wahl;
}
}
void subtraktion(void)
{
double zahl, ergebnis=0;
int wahl;
printf ("Subtraktion ");
Subtraktion:
while (1)
{
printf ("\nZahl eingeben => ");
scanf ("%lf", &zahl);
if (zahl == 0)
continue;
ergebnis -= zahl;
}

printf ("\nDas Ergebnis ist %lf", ergebnis);
Wahl:
printf ("\nWollen Sie de Vorgang wiederholen?\n\t1.)ja\n2.)nein\n");
scanf ("%d", &wahl);
switch (wahl)
{
case 1 : goto Subtraktion;
break;
case 2 : goto Anfang;
break;
default : printf ("Unbekannte Eingabe\n");
goto Wahl;
}
}
void multiplikation(void)
{
double zahl, produkt=0;
int wahl;
printf ("Multiplikation ");
Multiplikation:
while (1)
{
printf ("\nZahl eingeben => ");
scanf ("%lf", &zahl);
if (zahl == 0)
continue;
else
produkt *= zahl;
}
printf ("\nDas Produkt aller Zahlen beträgt %lf", produkt);
Wahl1:
printf ("\nWollen Sie den Vorgang wiederholen?\n\t1.)ja\n2.)nein\n");
scanf ("%d", &wahl);
switch (wahl)
{
case 1 : goto Multiplikation;
break;
case 2 : goto Anfang;
break;
default : printf ("Unbekannte Eingabe\n");
goto Wahl1;
}
}
void division(void)
{
double zahl, zahl1, ergebnis=0;
int wahl;
printf ("Division ");
Division:
printf ("\nZahl eingeben => ");
scanf ("%lf", &zahl);
printf ("\nZahl eingeben => ");
scanf ("%lf", zahl1);
printf ("\n%lf durch %lf ist %lf", zahl, zahl1, zahl/zahl1);
Wahl2:
printf ("\nWollen Sie den Vorgang wiederholen?\n\t1.)ja\n2.)nein");
scanf ("%d", &wahl);
switch (wahl)
{
case 1 : goto Division;
break;
case 2 : goto Anfang;
break;
default : printf ("Unbekannte Eingabe\n");
goto Wahl2;
}
}


Ich hab keine Fußzeile nötig.

scw - 42
Experte (offline)

Dabei seit 09.2002
1836 Beiträge
Geschrieben am: 08.04.2010 um 11:12 Uhr

Kannst du vielleicht auch noch die Fehlermeldung posten, die beim Starten kommt? ;-)
Rauschkugl - 38
Experte (offline)

Dabei seit 03.2005
1488 Beiträge

Geschrieben am: 08.04.2010 um 11:24 Uhr

eine fehlermeldung wäre wirklich von vorteil.
und als kleiner tip für später, mit goto zu arbeiten ist nicht sonderlich schön, lass es am besten von anfang an weg.
TheBrainless - 38
Experte (offline)

Dabei seit 04.2005
1992 Beiträge

Geschrieben am: 08.04.2010 um 11:40 Uhr
Zuletzt editiert am: 08.04.2010 um 11:41 Uhr

Habs ma durch gcc gejagt und der meint, dass das Label Anfang in adition nicht definiert wäre. Anfang ist vermutlich nur lokal in der Methode main() sichtbar, deswegen kannst du da auch aus anderen Methoden nicht hinspringen (So versteh ich das zumindest. Ich programmier zwar eher selten C und erst recht nicht mit Gotos, aber so wäre mein Verständniss von anderen Programmiersprachen her).

Aber wie Rauschkugl geschrieben hat: Vergiss das mit den Gotos schnell wieder. Versuch lieber nur mit Methoden auszukommen (Ja, das geht ohne Probleme, ich mach das seit Jahren ;)).
Gotos machen den Quellcode unübersichtlich und verleiten dazu, so genannten Spaghetticode zu produzieren, bei dem man nachher nicht mehr weiß, was wann aufgerufen wird.

Mörps mörps blubbs!

Markus2 - 33
Profi (offline)

Dabei seit 11.2006
924 Beiträge
Geschrieben am: 08.04.2010 um 12:08 Uhr
Zuletzt editiert am: 08.04.2010 um 12:11 Uhr

Also um auch noch mal zu bestätigen was schon geschrieben wurde:

goto benutzt man normalerweise nicht.
Es ist sehr wahrscheinlich, dass die Label nur innerhalb ihres Blockes sichtbar sind (wie Variablen).

Außerdem dachte ich immer, eine Methode müsste vor dem ersten Aufruf deklariert werden.
Daher hätte ich die main-Methode an das Ende des Programmes gesetzt.

edit: sehe gerade, du hast die Methoden oben deklariert (hatte das übersehen), dann dürfte das doch kein Problem sein.

Außerdem bekomme ich vom gcc noch eine Warnung, dass ein Formatstring nicht mit dem angegbenen Variablentyp übereinstimme.

Never attribute to malice what can be adequately explained by stupidity.

scw - 42
Experte (offline)

Dabei seit 09.2002
1836 Beiträge
Geschrieben am: 08.04.2010 um 12:08 Uhr

Zitat von Rauschkugl:

eine fehlermeldung wäre wirklich von vorteil.
und als kleiner tip für später, mit goto zu arbeiten ist nicht sonderlich schön, lass es am besten von anfang an weg.


Hatte gar nicht gesehen, dass er mit goto arbeitet ;-) Aber stimmt. Sowas sollte man möglichst unterlassen, wenn die Programmiersprache für Schleifen so Dinge wie while usw. zur verfügung stellt. Gibt Programmiersprachen, in denen du aber solche jumps benötigst. C gehört da aber nicht dazu :-)
Motocross_M - 30
Halbprofi (offline)

Dabei seit 01.2006
375 Beiträge

Geschrieben am: 08.04.2010 um 16:29 Uhr

okay also wegen der fehlermeldung: es gibt keine. ich klicke auf "build", und er macht was. dann klick ich auf "run", und nichts passiert.
wegen goto: was kann ich sonst benutzen, um direkt zu springen?

sorry ich programmier noch nich lange.

Ich hab keine Fußzeile nötig.

scw - 42
Experte (offline)

Dabei seit 09.2002
1836 Beiträge
Geschrieben am: 08.04.2010 um 16:39 Uhr
Zuletzt editiert am: 08.04.2010 um 16:41 Uhr

Zitat von Motocross_M:

okay also wegen der fehlermeldung: es gibt keine. ich klicke auf "build", und er macht was. dann klick ich auf "run", und nichts passiert.
wegen goto: was kann ich sonst benutzen, um direkt zu springen?

sorry ich programmier noch nich lange.


Direkt anspringen tut man nicht! Sowas macht man dann eher mit if-Bedingungen oder while-Schleifen.
Schau mal, ob du deine IDE so einstellen kannst, dass sie dir auch nen paar Fehlermeldungen ausspuckt ;-)

EDIT: Das mit "Anfang" kannst du vermutlich in while(1) {...} stecken.

Motocross_M - 30
Halbprofi (offline)

Dabei seit 01.2006
375 Beiträge

Geschrieben am: 08.04.2010 um 16:40 Uhr

okay mach ich wenn ich mal zuhause wär :-D

Ich hab keine Fußzeile nötig.

Markus2 - 33
Profi (offline)

Dabei seit 11.2006
924 Beiträge
Geschrieben am: 08.04.2010 um 17:21 Uhr

Zitat von Motocross_M:

wegen goto: was kann ich sonst benutzen, um direkt zu springen?


Gar nichts. Direkt springen ist normalerweise nicht nötig und gilt als schlechter Stil.

Never attribute to malice what can be adequately explained by stupidity.

bredator - 41
Champion (offline)

Dabei seit 03.2008
5319 Beiträge

Geschrieben am: 08.04.2010 um 19:16 Uhr

Zitat von Motocross_M:

okay also wegen der fehlermeldung: es gibt keine. ich klicke auf "build", und er macht was. dann klick ich auf "run", und nichts passiert.
wegen goto: was kann ich sonst benutzen, um direkt zu springen?

sorry ich programmier noch nich lange.


Direkt springen ist böse und falsch. Stichwort: Spaghetticode.

Das war zu Basiczeiten vielleicht toll, aber auch damals schon wahnsinnig kompliziert und unübersichtlich. OOP ist da ein paar Schritte weiter und man sollte sich von Anfang an damit beschäftigen.

Lache nicht über jemanden, der einen Schritt zurück macht. Er könnte Anlauf nehmen.

Klischeepunk - 41
Champion (offline)

Dabei seit 01.2005
8907 Beiträge

Geschrieben am: 08.04.2010 um 19:24 Uhr

Hierzu allerdings mal wieder ein Snap von Wiki:

Zitat:

1968 sprach sich Edsger W. Dijkstra in seinem Aufsatz Go To Statement Considered Harmful (der Titel geht allerdings auf N. Wirth zurück), für eine Abschaffung des GOTO-Befehls in allen höheren Programmiersprachen aus. Das ist ohne weiteres möglich, da jedes GOTO-Programm durch ein While-Programm simuliert werden kann. Diese Meinung wurde in der Programmierausbildung bald zum Dogma erhoben; in einigen Sprachen wie Java wurde bewusst überhaupt kein GOTO-Befehl eingeführt (abgesehen von einem „gelabelten“ break – Schlüsselwort). Und dennoch behält man sich eine spätere Implementierung vor – GOTO ist als Schlüsselwort auch in Java reserviert. Andererseits unterstützen zahlreiche alte und neue imperative Programmiersprachen, z. B. Pascal, C, C++ und selbst das 2000 entwickelte C# und das 2007 publizierte D, noch GOTO. 2009 wurde GOTO nachträglich auch in die Skriptsprache PHP eingeführt (unter der Bezeichnung Jump Label).
Eine weniger kritisierte Variante des GOTO-Befehls ist das vorzeitige Verlassen eines Unterprogramms durch einen return-Befehl, das Abbrechen einer Schleife durch einen break-Befehl oder Abbrechen eines bestimmten Schleifendurchlaufs durch eine continue-Anweisung. Trotzdem gilt es in einigen Programmiersprachen als guter Programmierstil, wenn ein Block einen Einsprungpunkt und einen Ausstiegspunkt hat. In Sprachen, welche Ausnahmenbehandlung erlauben, wird dagegen die „Ein-Ausstiegpunkt“-Regel als obsolet angesehen, da throw-Anweisungen die Argumentation hinter dieser Regel ad absurdum führen.
In der Praxis hat sich jedoch gezeigt, dass der Verzicht auf GOTO zwar möglich ist, jedoch in einigen Fällen zu sehr aufwändigen Konstrukten führt. Besonders in zeitkritischen Programmteilen ist ein goto deutlich effektiver als am Ende von mehreren geschachtelten Schleifen jeweils eine Abbruchprüfung durchzuführen. Angesichts der Geschwindigkeit heutiger Prozessoren ist das Attribut zeitkritisch allerdings meist im Vergleich zu den Wartungskosten bei "Spaghetticode" vernachlässigbar.
Von einigen Entwicklern wurde auf der Linux Kernel Mailing List die häufige Verwendung von GOTO im Quellcode von Linux diskutiert. Linus Torvalds sagte dabei, dass die Verwendung von GOTO die Lesbarkeit des Quellcodes in vielen Fällen sogar deutlich erhöhen könne.


Gut platzierte Gotos können auch in OOP Zeiten sinnbringend sein. Man sollte sich nur nicht verleiten lassen sein Programm darauf aufzubauen, sondern sie selten und vernünftig einzusetzen.
Manchmal (und da muss ich Torvalds durchaus rechtgeben) bringen Gotos wesentlich klareres Verständnis als wenn man 12 Schleifen erstmal verinnerlichen muss, um zu begreifen wann wo welcher schritt erreicht wird und wo er endet.

Man sollte auch berücksichtigen, dass man bei einem Einsprung in Methoden ebenso diverse "gotos" hat. Das Argument "es ist besser" ist damit imho hinfällig - sollte es je gegolten haben.


Dieser Post wurde 2 mal ROT-13 verschlüsselt.

Motocross_M - 30
Halbprofi (offline)

Dabei seit 01.2006
375 Beiträge

Geschrieben am: 08.04.2010 um 19:36 Uhr

ähm ja also ich soll das programm einfach nochmal ohne die vielen gotos schreiben?

Ich hab keine Fußzeile nötig.

Klischeepunk - 41
Champion (offline)

Dabei seit 01.2005
8907 Beiträge

Geschrieben am: 08.04.2010 um 19:36 Uhr
Zuletzt editiert am: 08.04.2010 um 19:37 Uhr

Zitat von Motocross_M:

ähm ja also ich soll das programm einfach nochmal ohne die vielen gotos schreiben?

Du solltest dir einen Debugger beschaffen und ihn nutzen.

Dieser Post wurde 2 mal ROT-13 verschlüsselt.

Motocross_M - 30
Halbprofi (offline)

Dabei seit 01.2006
375 Beiträge

Geschrieben am: 08.04.2010 um 19:42 Uhr

ja in der entwicklungsumgebung Code::Blocks gibts glaub nen debugger, ich weiß aber nicht wirklich so recht wie der funktioniert, da in der anleitung nichts über die funktionsweise steht.

Ich hab keine Fußzeile nötig.

  -1- -2- vorwärts >>>
 

Forum / Bits und Bytes

(c) 1999 - 2026 team-ulm.de - all rights reserved - hosted by ibTEC Team-Ulm

- Presse - Blog - Historie - Partner - Nutzungsbedingungen - Datenschutzerklärung - Jugendschutz -