Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

12.01.2007, 11:55

mal wieder komisches verhalten

hi,

ich weiß nich ob ich einfach nur zu blöd bin oder ob mein cpp irgendwie kaputt ist aber wo is hier der fehler:

Also es geht um folgendes: das ganze soll mal dame für konsole werden. dementsprechend sind auf dem board[8][8] die positionen der steine eingetragen. wenn man jetzt dran ist soll man eine position von seinem stein angeben (zb a1), dann soll überprüft werden ob man da überhaupt einen stein hat und dann soll man das ziel eingeben und dann wird wieder geprüft ob man da hinziehen darf (regeln kommen noch später)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
bool ValidateCoords(char* coords, bool P2Active)
{
    char c;
    
    switch(coords[0])
    {
                case 'a': case 'A':
        {
            coords[0] = 0;
            break;
        }

        case 'b': case 'B':
        {
            coords[0] = 1;
            break;
        }

        case 'c': case 'C':
        {
            coords[0] = 2;
            break;
        }

        case 'd': case 'D':
        {
            coords[0] = 3;
            break;
        }

        case 'e': case 'E':
        {
            coords[0] = 4;
            break;
        }

        case 'f': case 'F':
        {
            coords[0] = 5;
            break;
        }

        case 'g': case 'G':
        {
            coords[0] = 6;
            break;
        }

        case 'h': case 'H':
        {
            coords[0] = 7;
            break;
        }

        default:
            return false;
    }

    if(P2Active)
        c = '2';
    else
        c = '1';
    
        // hier sollte stehen board[0][1] != '1'    

        if(board[coords[0]][(coords[1]-1)-'0'] != c)
        return false;
    else
// ich hab per debugger geprüft dass er true zurückgibt       

return true;
}

void move()
{
    char start[2], end[2];
    
    cout << "From: ";
    cin >> start; // hier gibt man erstmal die startkoordinaten von seinem stein an (zb. a1)


        // dann soll getestet werden ob überhaupt ein stein auf diesem feld liegt  

        // nach der funktion steht dann hier true != true, was ja false is aber er springt trotzdem in den code in der while schleife O_o

        while(ValidateCoords(start, turns % 2) != true);
    {
        cout << "Invalid Coordinates! Choose one of your Figures!" << endl;
        cout << "From: ";
        cin >> start;
    } 

    cout << "To: ";
    cin >> end;

    while(ValidateCoords(end, turns % 2) != true);
    {
        cout << "Invalid Coordinates! You can't jump to that field!" << endl;
        cout << "To: ";
        cin >> end;
    }
}

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

12.01.2007, 12:04

Zitat von »"Sk!p"«


ich weiß nich ob ich einfach nur zu blöd bin


Ja, du bist einfach zu blöd!

C-/C++-Quelltext

1
 while(ValidateCoords(end, turns % 2) != true);


Schau dir die Zeile nochmal gaaaanz genau an, speziell das Semikolon gaaanz hinten!
Noch ein Tipp: Das gehört da nich hin, weil der Block darunter dann einfach als normaler Codeblock ausgeführt wird und nichts mit der while Schleife zu tun hat.

Achja:

C-/C++-Quelltext

1
2
3
4
5
6
// hier sollte stehen board[0][1] != '1'    

         if(board[coords[0]][(coords[1]-1)-'0'] != c) 
         return false; 
     else 
 // ich hab per debugger geprüft dass er true zurückgibt        

 return true;


Sowas entspräche diesem hier:

C-/C++-Quelltext

1
2
3
4
if ( true )
  return false;
else
  return true;


Und da sollte wirklich jeder vor Schreck vom Stuhl fallen... oO
Das reicht völlig:

C-/C++-Quelltext

1
return ( board[coords[0]][(coords[1]-1)-'0'] == c );
@D13_Dreinig

3

12.01.2007, 20:17

Zitat von »"David_pb"«


Schau dir die Zeile nochmal gaaaanz genau an, speziell das Semikolon gaaanz hinten!


sorry so semikolons sind ziemlich klein ^^

Zitat von »"David_pb"«


Sowas entspräche diesem hier:

C-/C++-Quelltext

1
2
3
4
if ( true )
  return false;
else
  return true;



ja ich muss zugeben dass ich den code noch nicht so ganz optimiert habe aber der rest von meinem programm is eigentlich recht gut strukturiert und vor allem kommentiert, zumindest im verhältnis zu dem code den ich von anderen auf meinem level bisher gesehn hab.

ich muss mich allerdings nochmal ausdrücklich dafür entschuldigen dass ich bei meiner mami unten rausgefallen bin ohne der letzte 1337-3d-gamez-programmer zu sein. ich hoffe es gibt noch hoffnung für mich ansonsten stürze ich mich hier gleich ausm 3. stock :/

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

4

12.01.2007, 21:53

Jetzt verfall nicht in selbstmitleid sondern mach mehr aus dir, als 'was da unten rausgefallen ist' :lol:

David_pb hatte sicher nicht die absicht, dich als blöd hinzustellen - ist zumindest bisher in diesem Forum nicht seine Art^^

Faule Socke

Community-Fossil

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

5

12.01.2007, 22:45

Wenn in einer if-Abfrage ein return vorkommt brauchst du danach kein else-Teil mehr da der code nach return ja sowieso net ausgeführt wird(falls die bedingung für die abfrage true ergibt)
Um allerdings kompilerwarnungen zu Verhindern solltest du nach dieser abfrage auch noch irgendwo ein return einfügen(was ja logisch ist)
Und ein "case" erwartet auch keine blöcke si wie du es gemacht hast...
Weil bei der switch-Anweisung teilst du "case/switch" mit hilfe der anweisung "break" mit wo es zu ende ist!(in schleifen brauchst ud ja blöche falls du mehrere anweisungen ausführen willst)...


SO ich hoffe ich hab jetzt net zu viel mist erzählt und jeder hat es auch einigermasen verstanden falls ich doch mist geschrieben habe... bitte net in den mülleimer, weil das wirft imemr so n schatten auf mich...


mfg,

Faule Socke

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

13.01.2007, 00:05

Zitat von »"Sk!p"«


ich muss mich allerdings nochmal ausdrücklich dafür entschuldigen dass ich bei meiner mami unten rausgefallen bin ohne der letzte 1337-3d-gamez-programmer zu sein. ich hoffe es gibt noch hoffnung für mich ansonsten stürze ich mich hier gleich ausm 3. stock :/


Ne, wollt dich nich als doof hinstellen! :) Nich falsch verstehen, hab mich nur über dein "ich weiß nich ob ich einfach nur zu blöd bin" gefreut! ;)

Ansonsten waren das ernst gemeinte Ratschläge!

grüße
@D13_Dreinig

7

13.01.2007, 11:17

die ich mir auch zu herzen genommen hab.

es hat sich halt nur nach mecker angehört, im grunde ja auch nicht ganz zu unrecht aber ich hätte mir das programm 4 milliarden mal mit dem debugger angucken können, wenn man nicht damit rechnet dass da ein falsches semikolon steht findet man (zumindest ich) nie :)

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

13.01.2007, 11:35

Zitat von »"Sk!p"«

ich hätte mir das programm 4 milliarden mal mit dem debugger angucken können, wenn man nicht damit rechnet dass da ein falsches semikolon steht findet man (zumindest ich) nie :)

Dann benutzt du den Debugger nicht richtig.
Schließlich gibt es die Möglichkeit, das Programm in Einzelschritten auszuführen (F10 bzw. F11). Dann hättest du sofort gemerkt, dass er während der Schleife gar nicht in deinen vermeintlichen Schleifenrumpf reingeht.

9

13.01.2007, 17:15

ich weiß jetzt grad nicht genau was du meinst...schleifenrumpf is doch der anweisungsblock oder? denn da geht er ja jedesmal rein, egal wie die bedinung ausgewertet wurde.

deshalb hab ich wieder mit irgendeinem speicherleck gerechnet wo er mir wieder einen boolwert umsetzt aber auf das semikolon wäre ich so schnell nicht gekommen da ich vorausgesetzt hab dass diese zeile stimmt.

aber gut man lernt nie aus :D

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

13.01.2007, 17:45

Zitat von »"Sk!p"«

ich weiß jetzt grad nicht genau was du meinst...schleifenrumpf is doch der anweisungsblock oder? denn da geht er ja jedesmal rein, egal wie die bedinung ausgewertet wurde.


der anweisungsblock wird eben IMMER GENAU EINMAL ausgeführt.
wenn du den debugger benutzt hättest, wäre dir das aufgefallen.
ich denk das hat er gemeint ;)

Werbeanzeige