Fehler beim ersten größeren C projekt
-
Moin moin liebe mitprogrammierer!
ich bin noch ziemlicher anfänger und wollte mir einmal was basteln, was ich auch brauchen kann. Also nicht irgendeine Schulaufgabe. Nun stoße ich auf ein Problem! Es gibt keine Fehler beim Compilieren, doch wärend des Programmablaufs hängt es sich auf und muss geschlossen werden.
Zur Erklärung des Programms:
Es geht um ein Online game. dort kann man items verbessern. bis zu 24 stufen. auf jeder stufe wird die prozentchance des erfolgs geringer, aber es geht nur gut auf ungeraden zahlen. Anfangen mit den verbesserungen tut man bei +11. die 3 variablen (*uqt=0, *uqm=0, *uqg=0) sind items die man dazu benötigt, nur für mich, also nichts wichtiges, ich denke der fehler liegt in der schleife
PS: Verbesserungen über Programmierestil, codeverdopplung ect. nehme ich gerne entgegen!
MEIN SKYPENAME: pobertus
-----------------------------------
QT:// --- includes ------------------------------------------------------------ #include <stdio.h> #include <stdlib.h> #include <time.h> // --- lokale Prototypen --------------------------------------------------- // --- main ---------------------------------------------------------------- int main(int argc, char *argv[]) { int uz=11, wst, ve, *uqt=0, *uqm=0, *uqg=0, ue; printf("Dieses Programm errechntet die Anzahl benoetigter Upps!\n" "By GlenX\n\n\n\n"); printf("Gewuenschter Wert: "); scanf("%d", wst); for(ve=0; uz<wst; ve++) { ue = upper(uz, *uqt, *uqm, *uqg); uz = uz + ue; if (uz % 2 == 0) uz--; } printf("Erfolgreich!\nVersuche:%d\nTinkturen:%d\nM eister:%d\n" "Glückstränke:%d\n", ve, uqt, uqm, uqg); system("PAUSE"); return 0; } // *** lokale Unterprogramme *********************************************** int upper(int uz, int *uqt, int *uqm, int *uqg) { int p, uh, uh1; srand (time(NULL)); p = rand()%101; if( p<bib(uz)) { uh = rand()%4; *uqm++; *uqg++; } else { uh1 = rand()%4; if (uh1 == 1) uh = -1; else if (uh1 == 2) uh = -2; else uh = -3; *uqm++; *uqg++; *uqt++; } return uh; } // ------------------------------------------------------------------------- int bib (int uz) { int bib; if(uz == 11) bib = 53; else if(uz == 12) bib = 11; else if(uz == 13) bib = 41; else if(uz == 14) bib = 11; else if(uz == 15) bib = 33; else if(uz == 16) bib = 7; else if(uz == 17) bib = 21; else if(uz == 18) bib = 7; else if(uz == 19) bib = 17; else if(uz == 20) bib = 5; else if(uz == 21) bib = 13; else if(uz == 22) bib = 5; else bib = 11; return bib; } // ------------------------------------------------------------------------- // [END OF FILE]
Mit Zitat antworten
-
Das ist eine Menge Quelltext ohne konkrete Frage, daher gebe ich dir erst einmal nur die zahlreichen Compilerwarnungen und den Hinweis, immer mit höchster Warnstufe zu compilieren und Warnungen wie Fehler zu behandeln (die meisten Warnungen hier sind auch handfeste Fehler), bis du genug C gelernt hast, dass du genau weißt, was die Warnungen bedeuten:
test.c: In function ‘main’: test.c:16:3: warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘int’ [-Wformat] test.c:20:7: warning: implicit declaration of function ‘upper’ [-Wimplicit-function-declaration] test.c:27:10: warning: format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘int *’ [-Wformat] test.c:27:10: warning: format ‘%d’ expects argument of type ‘int’, but argument 4 has type ‘int *’ [-Wformat] test.c:27:10: warning: format ‘%d’ expects argument of type ‘int’, but argument 5 has type ‘int *’ [-Wformat] test.c:9:14: warning: unused parameter ‘argc’ [-Wunused-parameter] test.c:9:26: warning: unused parameter ‘argv’ [-Wunused-parameter] test.c: In function ‘upper’: test.c:41:3: warning: implicit declaration of function ‘bib’ [-Wimplicit-function-declaration] test.c:44:7: warning: value computed is not used [-Wunused-value] test.c:45:7: warning: value computed is not used [-Wunused-value] test.c:56:7: warning: value computed is not used [-Wunused-value] test.c:57:7: warning: value computed is not used [-Wunused-value] test.c:58:7: warning: value computed is not used [-Wunused-value] test.c: In function ‘main’: test.c:16:8: warning: ignoring return value of ‘scanf’, declared with attribute warn_unused_result [-Wunused-result] test.c:31:9: warning: ignoring return value of ‘system’, declared with attribute warn_unused_result [-Wunused-result] test.c:16:8: warning: ‘wst’ is used uninitialized in this function [-Wuninitialized]
edit: Noch Erläuterung, was die Warnungen bedeuten:
-scanf wird schlichtweg so nicht benutzt. Es mussscanf("%d", &wst);
usw. heißen. Dies ist auch die erste Absturzursache in deinem Programm.
-Funktionen solltest du deklarieren oder definieren, bevor du sie benutzt. In diesem Fall kann sich der Compiler zwar erschließen, was gemeint ist, aber das kann ganz schnell schiefgehen. (edit:Nein, es geht hier schon schief. Die Argumente die die Funktion erwartet passen nicht zu dem, was du ihr gibst. Da wird irgendwas schlimmes, abstürzendes passieren)
-Beim printf benutzt du auch die Formatangaben nicht richtig. Aber ich habe auch keine Ahnung, was du dort ausgeben möchtest(siehe unten)
-Unbenutzte Variablen sind klar, oder? Wozu sie einführen, wenn du sie nicht nutzt?
-value computed is not used: ++ bindet stärker als *. Also ist*ugm++;
identisch zu*(ugm++);
, was vermutlich nicht das ist, was du möchtest. Wenn ich eine Ahnung hatte, was ugm sein soll, könnte ich sogar beurteilen, ob du das möchtest oder nicht (siehe unten)
-Rückgabewert ignoriert: scanf und system können fehlschlagen (z.B. falsche Eingabe). Wenn die Eingabe ungültig ist, läuft dein Programm mit irgendwelchen Nonsenswerten weiter.
-Die warnung, dass wst uninitialisiert benutzt zu werden scheint ist ein Folgefehler des fehlerhaften scanf-AufrufsDeine Variablennamen sind übrigens äußerst nichtssagend. Ich habe keine Ahnung, was was ist. Du wirst es in ein paar Stunden auch nicht mehr wissen. Schnell, sag mir, ohne Nachzugucken, was
ue
speichert! Gib zu: Du kannst es jetzt schon nicht mehr, oder?Die Benutzung von Pointern in deinem Programm ist ebenfalls konfus. Was sollen die Pointer in der main-Funktion machen? Die zeigen auf nichts, werden trotzdem dereferenziert. Das wird ebenfalls abstürzen. Der Sinn ist ebenfalls nicht erschließbar, siehe oben.
Nichts für ungut, aber du hast dich gewaltig übernommen. Du brauchst mehr Grundlagen, besonders zu Pointern und zu grundlegenden Programmiermustern.
-
Hallo IGlenX,
SeppJ hat ja schon alles gesagt. Hier noch einige Hinweise:
scanf erwartet als Parameter die Adresse einer Variablen. Der Aufruf heißt also: scanf("%d",&wst). Zum zweiten deklarierst Du die Variabeln uqt, uqm und upg als Zeiger auf int und definierst sie gleichzeitig, indem Du ihnen einen Wrt zuweist. In der Funktion upper übergibst Du nun den dereferenzierten Wert und nicht die Adresse. Wenn Du hier den "*" Operator (Dereferenzierung) entfernst, übergibst Du die Adresse und die Funktion upper kann damit arbeiten.
Gruß
Bonni4355
-
Und
srand (time(NULL));
solte man nur einmal im Programm aufrufen. Am besten am Anfang vonmain()
-
hey
danke mal an alle antworten, haben mir alle weitergeholfen
doch ist vielleicht jemand hier der proffesionell programmiert? denn ich hab das eig. alles schon gelernt, die tests waren eig. alle gut und trotzdem bring ich eigenständige programme nicht zusammen. wäre nett wenn sich mal jemand zeitnehmen würde und mir ein paar fragen beantworten würde. vielleicht auf skype oder so
bin grad echt am verzweifeln.lg
GlenX
-
Wir haben einen IRC-Kanal:
http://www.c-plusplus.net/forum/117233Da kann durchaus ein rauer Ton herrschen (wie hier im Forum auch :p , besonders, falls du dich nicht an gängige Hacker-Netikette hältst), aber vielleicht findest du gerade jemanden, der dir in C hilft.
Du brauchst keinen professionellen Programmierer als Helfer. Das sind einfache Grundlagen, du brauchst ein Buch. Falls du noch spezifische Einzelfragen hast, dann gibt es natürlich auch noch dieses Forum hier.