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

neido

Treue Seele

  • »neido« ist der Autor dieses Themas

Beiträge: 225

Wohnort: Wien

  • Private Nachricht senden

1

10.02.2008, 13:04

Absturz beim Kopieren von Listen

in den letzten Tagen beschäftigt mich ein besonders kniffeliges Problem:
Mitten bei der STL-Funktion zum Kopieren von einer Liste in eine andere, also etwa list1 = list2, stürzt mein Programm ab. Ich habe keine Ahnung in welchem Teil des Quellcodes das Problem liegen könnte also poste ich jetzt auf gut glück mal ein paar:

achja, es ist ein kleines Schachprogramm und ziemlich blöd programmiert weil ich schnell fertig werden wollte. Das kostet mich jetzt aber natürlich wieder um so mehr zeit. Naja, vielleicht lern ichs irgendwann mal ;)

Definition:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class CPiece {
    public:
        short Color; //0 = weiß, 1 = schwarz

        short ID; //  0=König, 1=Dame, 2=Turm, 3=Läufer, 4=Springer, 5=Bauer

        short X, Y; // G5: X=6, Y=4

};
struct sPieces{    // Die Spielsteine beider Seiten

    list<CPiece> ListBlack;
    list<CPiece> ListWhite;
};
struct sBoardCopy{ // Stellungen werden gespeichert um Spielzüge vorrauszuberechnen

    sPieces Pieces;
    short bTurn;
    short DrawNumber;
};
vector<sBoardCopy> m_BoardCopy; // vorausberechnete züge


sPieces Pieces; // So stehen die Figuren gerade

sPieces *Pcs; // Zeiger auf die Figuren des letzte Elements von m_BoardCopy oder wenn leer dann auf aktuelle Stellung


und jetzt wird ein neuer Spielzug vorausberechnet

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
vector<sBoardCopy>::iterator It2;
sBoardCopy BC;
BC.Pieces = Pieces;//im Debugger sieht man, dass das Programm hier mitten beim Kopieren

                   //abstürzt, an verschiedenen Stellen, aber meistens beim zwölften schwarzen Spielstein

BC.bTurn = m_bTurn;
BC.DrawNumber = m_DrawNumber;

m_BoardCopy.push_back(BC);
It2 = m_BoardCopy.end();
It2 --;
Pcs = &It2->Pieces;


Ich arbeite mit der "Microsoft Visual C++ 2005 Express Edition", der SDL und FMOD.
Projekt neu erstellen funktioniert nicht.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

10.02.2008, 13:13

Bekommst du keine Meldung? Und an welcher Stelle im Vektor-Template gibts den Probleme? Geh halt mal schrittweise durch den Kopiervorgang.
@D13_Dreinig

neido

Treue Seele

  • »neido« ist der Autor dieses Themas

Beiträge: 225

Wohnort: Wien

  • Private Nachricht senden

3

10.02.2008, 13:17

ne, keine Meldung nur dieses Problembericht senden

Das Problem liegt laut Debugger irgendwo tief in der Listenlibrary wo es längst keinen code mehr gibt. was meinst du genau mit Vektor-Template?

// edit: den letzten code den der debugger anzeigt gibts irgendwo in der Datei "xutility":

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void __CLR_OR_THIS_CALL _Adopt(const _Container_base *_Parent)
{   // adopt this iterator by parent

if (_Mycont != _Parent)
    {   // change parentage

    _Lockit _Lock(_LOCK_DEBUG);
    _Orphan_me();
    if (_Parent != 0 && _Parent->_Myfirstiter != _IGNORE_MYITERLIST)
        {   // switch to new parent

        _Mynextiter = _Parent->_Myfirstiter;
        ((_Container_base *)_Parent)->_Myfirstiter = this;
        }
    _Mycont = _Parent;
    }
}// MYCOMMENT:geht noch ein paar ebenen tiefer aber hier stürzt es ab

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

4

10.02.2008, 15:10

Ganz ehrlich? Ich glaube nicht, dass hier der Fehler liegt. Interessant wäre die komplette Funktion in der das Kopieren geschieht und von wie diese aufgerufen wird.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Faule Socke

Community-Fossil

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

5

10.02.2008, 15:21

Jap an der stl liegts meistens net, wenn dan an der falschen verwendung der templates oder was ich vermute, du hast i-wo in nem komplexen algo mit iteratoren rumgemurkst, aber wir können nur vermuten, so lange du net mal den debugger drüber laufen lässt und uns nähere infos gibst.

Socke

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

10.02.2008, 17:13

Natürlich liegt es vermutlich nicht an der Implementierung der STL. Aber es kann aufschlussreich sein zu wissen was genau an der betreffenden Stelle passiert.
@D13_Dreinig

neido

Treue Seele

  • »neido« ist der Autor dieses Themas

Beiträge: 225

Wohnort: Wien

  • Private Nachricht senden

7

10.02.2008, 20:41

Ja, natürlich beschuldige ich nicht die STL. Ich hatte nur vorher noch nie ein ähnliches Problem

@FauleSocke: Ich verstehe nicht. Ich habe den ganauesten Punkt angegeben, den der Debugger in c++-code anzeigen kann. Was kannst du denn noch brauchen? soll ich den gesamten quellcode ins Internet stellen? Der ist ziemlich chaotisch und unschön. oder die Debug-exe?

Also: hier ist die Funktion, die einen neuen virtuellen(?) Zug startet:
Ich hab jezt ned alles kommentiert und will auch jetzt nicht jede einzelne Funktion genau erläutern, ich hoffe das wichtigste ist klar.

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
void CGame::StartTryDraw(){
    list<CPiece>::iterator It;
    vector<sBoardCopy>::iterator It2;

    if (TryDrawDebug == 0){ // TryDrawDebug enthält anzahl der virtuellen Züge

        if (m_pHand){ // Figur in der "Hand" des Spielers (die er angeklickt hat)

            m_HandCopy = *m_pHand; // OK, alles kommentiere ich jetzt nicht

            m_pHand=NULL;
        }else{
            m_HandCopy.X=-1;
        }
    }
       // Das kennt ihr ja bereits schon

    sBoardCopy BC;
    BC.Pieces = Pieces; // Absturzstelle

    BC.bTurn = m_bTurn;
    BC.DrawNumber = m_DrawNumber;

    m_BoardCopy.push_back(BC);
    It2 = m_BoardCopy.end();
    It2 --;
    Pcs = &It2->Pieces;

    for (int i=0; i<8; i++){
        for (int j=0; j<8; j++){
            m_Board[i][j] = NULL; // CPiece *m_Board[8][8] ist das Schachbrett

        }
    }
//so, jetzt wirds richtig schirch

    for (It = Pcs->ListBlack.begin(); It!=Pcs->ListBlack.end(); It++){
        if (TryDrawDebug == 0){ // Erster Virtueller Zug

            if (It->X == m_HandCopy.X && It->Y == m_HandCopy.Y)
                m_pHand = &(*It);
        }
        m_Board[It->X][It->Y] = &(*It);
    }
    for (It = Pcs->ListWhite.begin(); It!=Pcs->ListWhite.end(); It++){
        if (TryDrawDebug == 0){
            if (It->X == m_HandCopy.X && It->Y == m_HandCopy.Y)
                m_pHand = &(*It);
        }
        m_Board[It->X][It->Y] = &(*It);
    }
    for (PVIt = PVars.begin(); PVIt != PVars.end(); PVIt++){
        if (PVIt->second.X >= 0){
         // FindPieceInCopy liefert im "Virtuellsten" Zug den Spielstein mit den selben Werten

            PVIt->second = *FindPieceInCopy(&(PVIt->second));
            if (PVIt->second.X < 0) cout << "Not in Copy: "<<PVIt->first;
            else cout << "Done: "<<PVIt->first;
        }else{cout << "Nullzeiger: "<<PVIt->first;}
    }
    TryDrawDebug ++;
}

und hier wird der virtuelle Zug wieder gelöscht:
Mein Gott, furchtbar. Ich sollte vlt doch das ganze Programm neu schreiben. Aber ich bin halt schon fast fertig

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
void CGame::EndTryDraw(){
    m_bMate = false; 
    if (TryDrawDebug <= 0)
        cout << "Oups";
    vector<sBoardCopy>::iterator Pt;
    Pt = m_BoardCopy.end();
    Pt--;
    
    m_bTurn = Pt->bTurn;
    m_DrawNumber = Pt->DrawNumber;
    m_BoardCopy.pop_back();
    TryDrawDebug --;

    if (TryDrawDebug == 0){
        Pcs = &Pieces;
    }else{
        vector<sBoardCopy>::iterator Pt;
        Pt = m_BoardCopy.end();
        Pt--;
        Pcs = &Pt->Pieces;
    }

    for (int i=0; i<8; i++){
        for (int j=0; j<8; j++){
            m_Board[i][j] = NULL;
        }
    }
    list<CPiece>::iterator It;
    for (It = Pieces.ListBlack.begin(); It!=Pieces.ListBlack.end(); It++){
        if (TryDrawDebug == 0){
            if (It->X == m_HandCopy.X && It->Y == m_HandCopy.Y)
                m_pHand = &(*It);
        }
        m_Board[It->X][It->Y] = &(*It);
    }
    for (It = Pieces.ListWhite.begin(); It!=Pieces.ListWhite.end(); It++){
        if (TryDrawDebug == 0){
            if (It->X == m_HandCopy.X && It->Y == m_HandCopy.Y)
                m_pHand = &(*It);
        }
        m_Board[It->X][It->Y] = &(*It);
    }
// Im Folgenden geht es um Variablen im KI-Skript, die Spielsteine Enthalten. 

    for (PVIt = PVars.begin(); PVIt != PVars.end(); PVIt++){ 
        PVIt->second = *FindPieceInCopy(&(PVIt->second));
    }
}

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

8

11.02.2008, 13:44

Ich sehe jetz auf Anhieb nicht den Grund warum das ganze abschmiert. Kannst du die src-Dateien irgendwo hochladen, damit man das mal testen kann? Weil der Debugger hilft da doch oft weiter :)
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

neido

Treue Seele

  • »neido« ist der Autor dieses Themas

Beiträge: 225

Wohnort: Wien

  • Private Nachricht senden

9

11.02.2008, 22:25

okay, ich hab mal alles was ich gefunden hab upgeloaded. Vorsicht beim Kompillieren: am Besten neues Projekt erstellen, es war ursprünglich nicht alles im selben Ordner. :?

http://www.webfilehost.com/?mode=viewupload&id=6731345

Ich probiere diesen Filehoster zum Ersten Mal aus, also keine Ahnung ob der was taugt ;)

//Edit: mist. auch hier muss man ne Minute warten, bevor man downloaden kann. Gibt es irgendwo sowas im Web was wo man das nicht muss?

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

10

12.02.2008, 09:56

vorweg: bei sowas gehören nur die wichtigen Daten rein (Source, Projektdateien, DLLs) und nicht Ordner wie Debug und Release oder Dateien wie Debugdatabase. Die machen den Ordner nur unnötig fett. Außerdem fehlt die SDL lib (und wahrscheinlich die anderen libs auch). Auch ist die Ordnerstruktur geschreddert, aber daher erwähntest du wohl das mit dem "neues Projekt erstellen".

P.S: ohne SDL ist das ganze anscheinend auch garnicht lauffähig. Habe zwar versucht alle verweise rauszunehmen, allerdings ist die Funktionalität des Spiels damit auch komplett geschreddert. Wäre also nett wenn du das ganz mit den libs und der korrekten Ordnerstruktur und ohne die unnötigen Dateien hochladen könntest :)
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Werbeanzeige