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