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

Anonymous

unregistriert

1

24.07.2005, 20:28

Frage zu Verkettete Listen

ich hab ein Problem. Nach dem er diese schleife das 2. mal durchläuft stürzt das programm ab.



C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
CSegment* p = Last(Listenkopf);
    
while (p->Vorgaenger != NULL)
{
    p->Daten = p->Vorgaenger->Daten;
->Hier is dann der Fehler<-
    if (p->Vorgaenger != NULL)
    {

        p = p->Vorgaenger;
    }
}


Die Klasse CSegment sieht soo aus( mit der Daten-Strucktur:

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
#include "Sprite.h"

struct Data
{
    int PositionX;
    int PositionY; 
};

class CSegment : public CSprite
{
    public:
        CSegment* Last(CSegment Listenkopf);
        BOOL DeleteList(CSegment Listenkopf);
        void NewSegment(CSegment Listenkopf);

        CSegment* Nachfolger;
        CSegment* Vorgaenger;
        Data* Daten;

        void Move(int Direction, CSegment Listenkopf);
        
        
        
    private:
        
        DIRECTION m_CurrentDirection;
};


Heir die Erstellung des ListenKpofes und 2er Segmente:

C-/C++-Quelltext

1
2
3
CSegment Snake;
Snake.NewSegment(Snake);
Snake.NewSegment(Snake);


Ach ja. hier NewSegment und Last:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
CSegment* CSegment::Last(CSegment Listenkopf)
{
    CSegment* p = &Listenkopf;

    while(NULL != p->Nachfolger)
    {       
        p=p->Nachfolger;
    }
    return p;
}

void CSegment::NewSegment(CSegment Listenkopf)
{
    CSegment* Segment = new CSegment;
    Segment->Nachfolger = NULL;
    Segment->Vorgaenger = Last(Listenkopf);
    Last(Listenkopf)->Nachfolger = Segment;
}


ich hoffe des langt fürn anfach.

Doch warum der Fehler???

Phil_GDM

Alter Hase

Beiträge: 443

Wohnort: Graz

Beruf: Student-Softwareentwicklung u. Wissensmanagement

  • Private Nachricht senden

2

25.07.2005, 08:40

1.) CSegment braucht einen Konstruktor
Ohne Konstruktor kam ich nicht mal in die Funktion NewSegment

2.) und einen Kopierkonstruktor,
beim Aufruf von Last, wird vom übergebenen CSegment-Objekt eine Kopie erstellt. Da du keinen Kopierkonstruktor implementiert hast, sind alle Zeiger der Instanz Listenkopf wieder NULL => Last kann nicht richtig funktionieren.

mfg Philipp

Anonymous

unregistriert

3

25.07.2005, 19:56

und was sollte so in dem Konstruktor stehen (Kopierkonstruktor)?

Steven77

Alter Hase

Beiträge: 515

Wohnort: Münster - Gievenbeach

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

25.07.2005, 21:01

Man kann sich etliche Beispiele vorstellen. Hier ist eines:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class CSegment
{
    public:
        // Standardkonstruktor

        CSegment() { }
        // Konstruktor mit expliziten Parametern

        CSegment(CSegment* n, CSegment* v, Data* d) : Nachfolger(n), Vorgaenger(v), Daten(d) { }
        // Kopierkonstruktor

        CSegment(const CSegment& s) : Nachfolger(s.Nachfolger), Vorgaenger(s.Vorgaenger), Daten(s.Daten) { }

        CSegment* Nachfolger;
        CSegment* Vorgaenger;
        Data* Daten;

        void Move(int Direction, CSegment Listenkopf);
}; 


Grundsätzlich ist ein Konstruktor (auch der Kopierkonstruktor) dafür da, die Member-Attribute der Struktur/Klasse zu initialisieren (ggf. nur mit Dummy-Werten, die schnell wieder überschrieben werden).
Der Kopierkonstruktor ist speziell dafür gut geeignet, ein Objekt anhand eines anderen bestehenden Objekts zu initialisieren, wobei es von der Semantik abhängt, ob die Struktur komplett 1-zu-1 kopiert wird oder nur teilweise oder eine sonstige Art der "Kopie" durchgeführt wird.

Mich wundert allerdings, dass Du scheinbar noch nix davon gehört hast...? ???

Anonymous

unregistriert

5

25.07.2005, 21:16

nee hab ich noch net :-( .Hab ich wohl was wichtiges verpasst.
Also könntest du mir des nochmal erklären und wie ich des dann schreiben muss?

danke!

mfg
ein kleiner unwissender programmierer

Anonymous

unregistriert

6

25.07.2005, 21:17

ach ja in meine C++ buch wird der Knoten als Strucktur bezeichnet=> mit Klassen=Neu

Anonymous

unregistriert

7

26.07.2005, 21:25

soll ich liber meine finger von lassen und des mit strukturen mach'n :rolleyes: ?

Steven77

Alter Hase

Beiträge: 515

Wohnort: Münster - Gievenbeach

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

27.07.2005, 12:50

Zitat von »"Gast"«

Also könntest du mir des nochmal erklären und wie ich des dann schreiben muss?

Bor, dazu habe ich jetzt nicht sooo die Zeit (in zwei Wochen vielleicht ;)), aber das kannste auch in jedem C++-Buch nachlesen...

Zitat von »"Gast"«

soll ich liber meine finger von lassen und des mit strukturen mach'n

Da gibt es keinen Grund für. Benutze ruhig Klassen.

Werbeanzeige