Selber geschriebenes Programm bleibt hängen (Dev-C++)
-
schon korigiert hat er beim kopieren nicht übernommen. Im Programm stehts aber so wies jetzt da steht.
Das das geht wusste ich nicht wie gesagt hat er beim kopieren irgendwie nicht übernommen ^^ warum auch immer.
-
Nur beim kurzen drüberschauen:
a) Das void in den Klammern ist unter C++ unnötig ("void Kampf(void)" => "void Kampf()")
b) Die Variablen sind teilweise [ironie]gut verständlich[/ironie] gewählt.
c) Schleifeneinrückungen sollten sinnvoll gewählt sein, teilweise fehlt bei dir die Einrückung.
d) Lieber einzelne Bereiche als eigene Funktion auslagern, anstatt Funktionen zu riesig werden zu lassen.
e) Ich hoffe du hast deinen Code nicht innerhalb des Kopfes einer for-Schleife geschrieben? "for(;Lebt == 1 || GLeben == 1" ist unvollständig...Um es kurz zu machen: Dein Programm ist nicht sinnvoll zu lesen. Daher werde ich auch garnicht erst versuchen den Fehler zu suchen (Der Aufwand wäre zu groß).
cu André
-
Kristallkugel auspack...
Ich denke mal, der Fehler liegt hier:
while(GAp!=0) { //bla... }GAp wurde nirgends initialisiert, soweit ich das überblicke.
Und wenn, dann bleibt er spätestens hängen, sobald er in die Schleife geht und eine Deiner if-Bedingungen erfüllt wird. Dann ist GAp immer 0-Wert und somit immer != 0.
-
a) Ich hab in dem tutorial was ich benutze gelernt das es besserer Programmierstyl ist wenn man es dazu schreibt, wenn dem nicht so ist kann ich da ja auch nichts zu ,da ich es ja nicht besser weis.
b)Das kann gut sein wie gesagt bin noch anfänger und das ist mein erstes eigentliches projekt.
c)Kann auch gut sein. Habs aber wenigstens versucht ^^
d)Danke für den Tipp ich werds mir merken und es beim nächsten mal anders machen.
e)Ich habe den code inerhalb der for schleife aufgebaut da dieser ja solange wiederholt werden soll bis einer von beiden tot ist. Den Fehler in Zeile acht habe ich schon behoben ist wie schon gesagt beim kopieren nicht übernommen worden.@Tachyon GAp hab ich als Globale Variable schon vor der Main funktion deklariert. Und in der 2 Funktion wird GAp=6
-
Bongi schrieb:
Und in der 2 Funktion wird GAp=6
Jo, dann ist GAp != 0. Dann gehts in die while-Schleife rein. Jetzt kann es sein, dass keine Deiner if-Bedingungen true wird. Dann wird GAp immer 6 bleiben, Du siehst keine Ausgaben, und die Schleife rennt -> Das Programm hängt.
while(GAp != 0) { cout << "Die Schleife brummt...\n"; if(... }Wenn der Text dann ständig ausgegeben wird, solltest Du mal über die Erzeugung Deiner Abbruchbedingung nachdenken.
-
Edit: Genau dort lag mein Problem ich hatte eine falsche Bedingung gesetzt und somit ist keine der angegebenen if Befehle true gewesen.
Danke Tachyon und natürlich auch den anderen.
-
Also:
1. Globale Variablen solltest du immer vermeiden wenn es möglich ist. Funktionen besitzen nicht ohne Grund eine Parameterliste, über die man die "Eingangsgrößen" übergeben kann.
2. Beim zweiten kurzen drüberschauen: ich nehme mal an das der Realschaden mindestens 0 sein sollte, oder?
int BGSchadenWaffe1=GSchadenWaffe1-Verteidigung; // Ich schätze mal das folgendes besser ist (auch andere Benennung gewählt): int realSchadenWaffe1 = gesamtschadenWaffe1 - verteidigung; if(realSchadenWaffe1<0) realSchadenWaffe1 = 0; // oder: int realSchadenWaffe1 = (gesamtschadenWaffe1 < verteidigung) ? 0 : (gesamtschadenWaffe1 - verteidigung);Wenn ich mit meinen Superduper-Zweihändigen-Zahnstocher-Mit-Parierstange einen Panzer angreife, werde ich ihn wohl dennoch nicht heilen

3. Ich würde dir raten, das du dir gleich einen einheitlichen Schreibstil zum Unterscheiden von Variablen oder Funktionen/Methoden angewöhnst. Benennungen sollten zumindest so ausführlich sein, das sie bereits etwas über die Verwendung aussagen ("GAp" sagt nichts aus).
Eine mögliche Variante (es gibt viele, finde deinen Stil):
a) Variablennamen klein beginnen (isNew, roundNumber, count...)
b) Methoden/Klassen/Stukturen groß beginnen (DeleteAddress, Address, Appointment...)
c) Makros komplett groß (ONE_INCLUDEGUARD...)Eine Möglichkeit Funktionen/Methoden in dieser Variante von Klassen/Strukturen zu unterscheiden ist es, Klassen/Strukturen mit Nomen zu benennen ("Address"), Funktionen/Methoden aber zusätzlich immer um Verben zu ergänzen (bzw. wenn es reicht nur das Verb zu benutzen; Beispiel "DeleteAddress" als Funktionsname oder "Address::Delete" als Bennennung einer Methode...).
4. Über die Qualität von Tutorials lasse ich mich hier lieber nicht aus, achte aber dabei das dein Tutorial zumindest etwas aktuell ist (z.B. "#include <iostream>" statt "#include <iostream.h>", Verwendung von std::string statt char[]/char*...).
cu André
-
Also ich fasse mal zusammen.
-Globale Variablen vermeiden lieber lokale verwenden.
-Die Namen der Variablen ausführlicher schreiben. Und alle möglichen Situationen berücksichtigen. Also vorrausschauend Programmieren (wenn ich das jetzt richtig verstandnen habe ^^).
-Einheitlichen Schreibstil angewöhnen aus der man sofort Erkennen kann ob es eine Variable usw. ist. Dazu habe ich aber noch eine Frage. Sollte man dann am Anfang des Codes einen Kommentar erstellen damit sofort ersichtlich wird welche Schreibweise für Variablen usw. sind?
-Darauf achten das das Tutorial das benutzt wird nicht zu alt ist. Hierzu habe ich auch noch eine Frage. Wie alt dürfe so ein Tutorial den sein damit es noch aktuell ist? Die Sache mit #include <iostream> ist in meinem Tutorial schon und das mit den String weis ich noch nicht. So weit bin ich noch nicht. Das Tutorial ist von Ende 2003 ist das zu alt oder geht das noch?Stimmt das soweit?
Dann bedanke ich mich jetzt noch ein mal recht herzlich bei dir André. Ich werde mir diese Dinge zu Herzen nehmen. Und so wie es aussieht werde ich demnächst wohl auch nicht mehr ganz so viel schreiben müssen. Bin nämlich grad bei den Arrays ^^
Ah da fällt mir noch ein. Die Sache mit den Funktionen von einem Zeiger habe ich jetzt zwar verstanden aber ich verstehe nich ganz warum man das mit den Zeigern macht. Wenn mir das noch einer erklären könnte wäre ich sehr froh.
Oh man der Text wird wieder lang ^^ Naja ich wollte auch noch schnell loswerden das ich dieses Forum einfach nur Klasse finde. Mir wurde inerhalb weniger Minuten geholfen was in einem anderem Forum keiner geschafft hat. Dort wurde nur meine schlechte arbeit bemängelt meine eigentliche Frage aber nicht beantwortet. Natürlich nehme ich Kritik dankend an, dann sollte aber auch dabei geschrieben werden was schlecht ist oder was ich besser machen kann und der Ton sollte natürlich auch angemessen sein.
Also
für das Forum und alle die hier Neulingen und auch Erfahrenen Programmierern helfen.
-
Bongi schrieb:
Ah da fällt mir noch ein. Die Sache mit den Funktionen von einem Zeiger habe ich jetzt zwar verstanden aber ich verstehe nich ganz warum man das mit den Zeigern macht. Wenn mir das noch einer erklären könnte wäre ich sehr froh.
Ich bin mir zwar nicht ganz sicher, was du meinst, aber ich vermute, die allgemeine Übergabe von Variabeln an Funktionen per Zeiger.
Die Übergabe als Zeiger oder Referenz hat den Vorteil, dass eine Variable von der Funktion verändert werden kann, was mit einer Wertübergabe nicht möglich ist. Das kann oft praktisch sein, wie z.B. in folgendem Beispiel (Zeiger haben jedoch noch einige weitere Anwendungsbereiche):
// Funktion mit Wertübergabe; verändert Parameter nicht, gibt neuen Wert zurück int NaechsteZahl(int a) { return a + 1; } // Funktion mit Übergabe als Referenz, erhöht a um 1 void ErhoeheZahl(int &a) { a = a + 1; // oder a++; } // Funktion mit Übergabe als Zeiger, erhöht a um 1 void ErhoeheZahl2(int *a) { *a = *a + 1; // oder (*a)++; } // In main() würde es etwa folgendermassen aussehen: int main() { int x = 4; int y = NaechsteZahl(x); // y ist 5, x aber immer noch 4 ErhoeheZahl(x); // x wird erhöht, ist nun auch 5 ErhoeheZahl2(&y); // y wird erhöht, ist nun 6 }Bei Zeigern übergibst du normalerweise die Adresse der Variable an die Funktion (wird durch das
&beiErhoeheZahl2(&y);. Die Funktion selber dereferenziert den Zeiger dann mit*(*a = *a + 1), das heisst, es wird auf den Wert der übergebenen Speicheradresse zugegriffen. Referenzen sind dadurch etwas einfacher, und besonders am Anfang eher zu empfehlen. Du musst lediglich ein & vor den Parameter schreiben, damit er als Referenz übergeben wird - doch Vorsicht: hier bedeutet&nicht Adressübergabe, sondern Übergabe als Referenz.Bongi schrieb:
-Einheitlichen Schreibstil angewöhnen aus der man sofort Erkennen kann ob es eine Variable usw. ist. Dazu habe ich aber noch eine Frage. Sollte man dann am Anfang des Codes einen Kommentar erstellen damit sofort ersichtlich wird welche Schreibweise für Variablen usw. sind?
Das ist eigentlich dir überlassen. Wenn du immer weisst, was gemeint ist, kannst du es auch lassen, aber eine oder zwei Zeilen Kommentar am Anfang können eigentlich nicht schaden

Bongi schrieb:
-Darauf achten das das Tutorial das benutzt wird nicht zu alt ist. Hierzu habe ich auch noch eine Frage. Wie alt dürfe so ein Tutorial den sein damit es noch aktuell ist? Die Sache mit #include <iostream> ist in meinem Tutorial schon und das mit den String weis ich noch nicht. So weit bin ich noch nicht. Das Tutorial ist von Ende 2003 ist das zu alt oder geht das noch?
Grundsätzlich sollte das Tutorial nicht veraltet sein. Bei Tutorials ist es jedoch oft so, dass C mit C++ vermischt wird und mit unsauberem oder falschem Code (z.B.
void main()) gearbeitet wird. Im Internet findet man sehr viel Schrott, eventuell solltest du dir auch ein Buch überlegen.Ich hoffe, ich konnte einigermassen helfen, ansonsten fragst du einfach

-
Bongi schrieb:
...Und so wie es aussieht werde ich demnächst wohl auch nicht mehr ganz so viel schreiben müssen. Bin nämlich grad bei den Arrays ^^
Ah da fällt mir noch ein. Die Sache mit den Funktionen von einem Zeiger habe ich jetzt zwar verstanden aber ich verstehe nich ganz warum man das mit den Zeigern macht. Wenn mir das noch einer erklären könnte wäre ich sehr froh.
Das Deutet eher auf ein C den ein C++ Tutorial hin. Arrays kann man zwar durchnehmen, ich würde aber erst std::vector ansprechen - Dies ist aber Geschmackssache. Zeiger wiederum haben meines Erachtens zwar in ein C++ Tutorial zu tun, Bei Funktionsübergaben sollten aber Referenzen zuerst angesprochen werden! Zudem würde ich grundsätzlich versuchen Zeiger nicht zu früh zu erklären...
cu André
-
asc@ausgeloggt schrieb:
...void Kampf...
Hmmmm das kommt mir doch bekannt vor ....
"Die Schildkröte liegt auf dem Rücken, Leon, doch sie helfen nicht ! Warum helfen sie nicht ??"
...
"Meine Mutter ? Ich erzähl Ihnen mal was von meiner Mutter !" *BÄNG*
Gruß,
Simon2.
-
Simon2 schrieb:
asc@ausgeloggt schrieb:
...void Kampf...
Hmmmm das kommt mir doch bekannt vor ....
"Die Schildkröte liegt auf dem Rücken, Leon, doch sie helfen nicht ! Warum helfen sie nicht ??"
...
"Meine Mutter ? Ich erzähl Ihnen mal was von meiner Mutter !" *BÄNG*
Gruß,
Simon2.
Pff, Banause. Das heisst Voigt Kampff...
-
Nexus schrieb:
Die Übergabe als Zeiger oder Referenz hat den Vorteil, dass eine Variable von der Funktion verändert werden kann, was mit einer Wertübergabe nicht möglich ist. Das kann oft praktisch sein, wie z.B. in folgendem Beispiel (Zeiger haben jedoch noch einige weitere Anwendungsbereiche):
Genau das wollte ich wissen ^^ Dankeschön
Das mit dem Buch werde ich mir noch mal überlegen aber will erst einmal das Tutorial durcharbeiten.
Aber noch einmal ein kräftiges Dankeschön an alle die mir meine Fragen beantwortet haben und sich ein bisschen um einen Neuling wie mich kümmern
