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

Phili

unregistriert

1

24.06.2006, 10:54

Fehler bei Trees

Hallo,

Ich hab gerade angefangen mich mit Techniken wie BSP-Trees auseinanderzusetzen. Allerdings hab ich keine wirklich geeignete Lektüre und hab einfach mal versucht, selbst sowas zu machen.


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
#ifndef _PHTREE_
#define _PHTREE_

template <typename Datentyp>
class PHKnot
{
public:
    bool Exist[4];
    PHKnot<Datentyp> *Knoten[4];
    Datentyp Daten;
    PHKnot<Datentyp>();
    bool Hinzu(Datentyp DatenGesucht, Datentyp DatenHinzu);
    bool Suche(Datentyp DatenGesucht);
};
template <typename Datentyp>
PHKnot<Datentyp>::PHKnot()
{
    for(int i=0; i<4; i++)
        Exist[i]=0;
}
template <typename Datentyp>
bool PHKnot<Datentyp>::Hinzu(Datentyp DatenGesucht, Datentyp DatenHinzu)
{
    if(Daten==DatenGesucht)
        for(int i=0; i<4; i++)
            if(!Exist[i])
            {
                Exist[i]=1;
                Knoten[i]=new PHKnot;
                Knoten[i]->Daten=DatenHinzu;
                return 1;
            }
    for(int i=0; i<4; i++)
    {
        if(Knoten[i]->Exist)
        {
            if(Knoten[i]->Hinzu(DatenGesucht, DatenHinzu))
                return 1;
        }
    }
    return 0;
}
template <typename Datentyp>
bool PHKnot<Datentyp>::Suche(Datentyp DatenGesucht)
{
    if(Daten==DatenGesucht)              //Hier meldet der Debugger den Fehler

        return 1;
    for(int i=0; i<4; i++)
        if(Knoten[i]->Exist)
            if(Knoten[i]->Suche(DatenGesucht))
                return 1;
    return 0;
}

template <typename Datentyp>
class PHTree
{
public:
    PHKnot<Datentyp> StartKnoten;
};

#endif


Allerdings stürzt es irgendwie immer ab, wenn man z.B. was sucht, was nicht existiert-eigentlich sollte es dann einfach 0 zurückgeben.

Ich schätz mal ich hab irgendwo Zugriffsrechte verletzt oder keinen Speicher reserviert, oder so.

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

2

24.06.2006, 11:10

Wenn in deinen Methoden der "DatenGesucht" Parameter nicht gleich dem "Daten" Member deiner Klasse ist, greifst du ungeprüft auf die Knoten zu, die zu diesem Zeitpunkt aber durchaus noch nicht allociert sein müssen.

Ausserdem ist "if(Knoten->Exist)" in beiden Methode immer true, weil "Exists" ein Array ist, dessen Zeiger kaum NULL sein wird.

MfG,
Rainer
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

3

24.06.2006, 11:21

Das ist auch garkein BSP ^^. Es gestelltet sich ein wenig einfacher, wenn jeder Knoten wirklich nur 2 Unterknoten hat :).
Die bool var Exist stellt eine Redundanz an Informationen dar und ist damit potenzielle Fehlerquelle.

Außerdem ordnet man die Daten in einem BSP immer nach einem bestimmten Prinzip an.((1.Subnode = vorne 2. Subnode = hinten) oder (1.Subnode = links 2. Subnode = rechts ))
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.

Phili

unregistriert

4

24.06.2006, 11:48

@Nox

Wie gesagt, hab nix richtiges zum lesen und wollt trotzdem mal nen Bäumchen coden :D :lol: . hab erlichgesagt einfach irgendwas gemacht.

Außerdem wollt ichs für A* verwenden, und zwar einen, der nur nach oben, unten rechts und links gehen kann, also in 4 Richtungen.

@rklaffehn

Du hast völlig recht, muss natürlich

C-/C++-Quelltext

1
if(Exist[i])

heißen

Firefly

Alter Hase

Beiträge: 484

Wohnort: Irgendwoundnirgendwo

  • Private Nachricht senden

Phili

unregistriert

6

25.06.2006, 11:28

@Firefly

Wiso, jetzt klappts doch :D :D :D

Werbeanzeige