Hallo, ich habe ein Spiel in C programmiert, indem man sich im Leben hocharbeiten muss. DevC++ sagt, es hätte 2 Fehler vor 2 "if's" gefunden und wäre durch frühere Fehler verwirrt. Meiner Meinung nach sind da aber gar keine Fehler. Wenn ich eine geschweifte If-Klammer lösche(dort wo einer der Fehler angezeigt wird), kompiliert es zwar, mein Spiel funktioniert aber nicht mehr so wie ich das will. Habe den Code mal als Anhang angefügt. Würde mich sehr über Hilfe freuen, Richard
welcher fehler bekommst du? Bitte Fehler und Zeilennummer Posten! Der code ist höflich ausgedrückt nicht sehr sinnvoll organisiert. Das ganze lässt bestimmt wesentlich vereinfachen.
Richard schrieb: > Wenn ich eine geschweifte If-Klammer lösche(dort wo einer der > Fehler angezeigt wird), kompiliert es zwar, mein Spiel funktioniert aber > nicht mehr so wie ich das will. Das Problem liegt nicht (nur)* in den Kontrollstrukturen sondern (auch)* in deinen do-while Schleifen. Der Block der ersten Schleife aus Zeile 13 endet in Zeile 720. Die Abbruchbedingung steht aber ersten nach weiteren Abfragen und Klammern in Zeile 799 und somit etwas deplaziert. Genauso sieht es mit der zweiten Schleife aus Zeile 25 aus, die laut Klammerung in Zeile in Zeile 472 enden sollte. Da steht aber auch keine Abbruchbedingung. Stattdessen folgt eine weitere Kontrollstruktur. Das eigentliche Problem wurde schon von Peter II angedeutet. Ich würde an deiner Stelle den Code besser strukturieren und einzelnen Aufgaben in separate Funktionen auslagern. Dafür sind sie (unter Anderem) da und das Debuggen geht einem auch etwas leichter von der Hand. *Ob es noch weitere Probleme bspw. bezüglich der Klammerung der if-Abfragen gibt habe ich nicht weiter kontrolliert. Nach der zweiten falschen Klammerung der Schleifen habe ich aufgehört.
dev-c++ habe ich in der ausbildung mal benutzt.. und fands nicht so toll.. außerdem wirds seit über 6 jahren nicht mehr gepflegt. kann eclipse oder netbeans empfehlen. ferner würde den code wie oben erwähnt mal anders strucktieren. was u.a. arg ins auge sticht: if (foo == 1) { if (bar == 0) { if (test > 0) { blabla } } } einfach mal in sowas wie if (foo == 1 && bar == 0&& test >0) {...} grob gesagt...
Viele Dank für die zahlreichen Antworten! Ich habe den Fehler gefunden: Eine versteckte If-Klammer(hinten an ein continue rangequetscht). Ich benutze jetzt auch CodeBlocks, ist wirklich komfortabler. Die ersten Ifs habe ich jetzt verkürzt, da ich aber noch Anfänger bin, sehe ich keine Möglichkeit das Skript noch weiter zu schrumpfen. Ich nehme an das würde mit Schleifen gehen, ich habe aber keine Ahnung wie man das lösen könnte. Noch ein Problem: Wenn man über 50000$ hat, wird angezeigt das man einen Vertrag mit einem Riesenunternehmen eröffnen kann. Dies kann man auch gut bestätigen. Pro Tag sollen dann 10000$ auf das eigene Konto überwiesen werden. Konto=Konto+10000 Aber nachdem man geschlafen hat, werden zu dem Konto weniger als 10000$ dazuaddiert. Woran kann das liegen? Wäre schön wenn ihr mir nochmal helfen könntet, im Vorraus schonmal Danke. Richard
Richard schrieb: > sehe ich > keine Möglichkeit das Skript noch weiter zu schrumpfen. ich schon.
1 | system("CLS"); |
2 | ...
|
3 | getchar(); |
diese sequenz kommt bestimmt 1000mal in deinen code vor. Warum machst du das in jeder IF-Abfrage und nicht nur einmal in der Schleife?
was soll das ständige neuinitialisieren des Zufallsgenerators? das macht man genau ein mal am Programmanfang.
Weil mir gerade sehr langweilig war hab ich einen Teil(!) mal etwas umgeschrieben (andere würden verbessert sagen). Gucks dir genau an und frag wenn Fragen sind, auf große Kommentare hatte ich keine Lust. Neben den oben erwähnten Sachen (if if if, srand() und cls): - Du solltest switch-case benutzen (wobei man darüber diskutieren könnte). - Deine if-Abfragen lassen sich mit else if deutlich vereinfachen. - scanf direkt in einer do-while-Schleife kapseln um Fehleingaben abzufangen. - Die Farbgeschichte (Danke dafür, den Trick kannte ich nicht!) habe ich deutlich verkürzt. - Bei MS gibts irgendwo eine cls-Funktion die auf ein paar API-Aufrufen beruht und deutlich schneller ist. - Ein paar Sachen wie if(!a) statt if(a==0) sind Geschmacksache, ich bin halt faul und !a ist kürzer (beides ist gleichwertig und richtig). - Die Sache mit den Sonderzeichen: Br\x81 cke ergibt Brü cke, aber Br\x81cke ergibt eine Warnung wie du vermutlich festgestellt hast... Lösung: Br""\x81""cke (nicht schön aber selten). - ...? Ohne Gewähr und Garantie. Ungetestet. Insgesamt ist der Code für die gegebene Funktion imho zu lang, ich habe aber keine Idee wie man das deutlich eleganter und kürzer kriegen könnte ohne allzuviel Komplexität reinzubringen. Eventuell irgendwas mit Arrays und Funktionen, aber das wird auch schnell undurchsichtig.
Übrigens, das nächste mal vielleicht die kompletten Namen aus dem Code entfernen bevor man ihn veröffentlicht... Und wenn ich mir so den ersten switch-case ansehe, das ist viel zu lang, da muss eine Funktion hin um etwas aufzuräumen. Ich war irgendwie zu faul das zu Tippen und mit Pointern (ohne gehts nicht wenn man die Variablen in der Funktion ändern will) rumzubasteln. :-( Nein, globale Variablen sind keine Lösung - frag mal Karl-Heinz was er sonst macht!
Gerade gesehen: Die Syntaxhervorhebung vermurkst irgendwie die Einrückungen (Tabulator duckundweg), in Programmer's Notepad oder CodeBlocks passts. So, genug Beiträge hintereinander verfasst.
abc schrieb: > Ein "Danke" ist wohl zu viel verlangt wie? Scheint so, aber wenn man die (mehrfach mit unvollständigen Informationen) Fragenden etwas unwirsch angeht, ist das Geheule groß, daß die Umgangsformen in diesem Forum ja so schlimm wären.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.