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

Werwofl

Treue Seele

  • »Werwofl« ist der Autor dieses Themas

Beiträge: 100

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

1

26.10.2011, 11:14

Vectoren aus Pointern einen Pointer auf NULL setzen

Moin moin zusammen,

ich habe folgendes Problem: Ich versuche einen Pointer aus einem vector zu löschen und auf NULL zu setzten aber irgendwie fehlt mir der Ansatzpunkt für dieses Problem(bzw. eine Erklärung warum es nicht funktioniert).

Hier ein bisschen Code:

Wenn eine Ressource auf dem Feld vorhanden ist gib diese zurück sonst gibt er NULL zurück

C-/C++-Quelltext

1
2
3
4
5
6
7
Ressource* TileMap::getRessource(int xPos,int yPos){
    ressources.resize(5);
    for(int i= 0;i<5;i++){
        ressources[i].resize(5);
    }
    return ressources[xPos][yPos];
}

in der Game-Schleife ein event das auf dem momentenen Tile prüft ob eine Ressource darauf vorhanden ist. Nachdem löschen (s.u.) ist das gelöschte Element nicht NULL

C-/C++-Quelltext

1
2
3
 if(getRessource(player.getTileXPosition(),player.getTileYPosition()) != NULL){ 
          player.pickUp(getRessource(player.getTileXPosition(),player.getTileYPosition()));
}

Die Methode die die Ressource löscht und einfach den Zähler hoch zählt,

C-/C++-Quelltext

1
2
3
4
5
6
void Player::pickUp(Ressource* res){
    std::string rn = res->getName();
    ressources[rn]++;
    delete res;      // ab hier fehlt mir der Ansatzpunkt
    res = NULL;
}


Standardmäßig wird jedes Element aus Vector ja erstmal mit NULL belegt. Nur wie setze ich ein Element auf NULL und lösche ein Element des Vectors wieder aus dem Speicher, nachdem ich auf dieser Stelle des Vectors ein Objekt erzeugt habe?

Werwofl

Treue Seele

  • »Werwofl« ist der Autor dieses Themas

Beiträge: 100

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

2

26.10.2011, 21:58

Falls es keiner verstanden haben sollte was ich will:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Container{
    void doSomething(){
        std::vector<std::vector<Object*> > objects;  // Alle Objekte sind NULL
        objects[1][1] = new Object(); // nur Stelle 1/1 ist nicht NULL
   }
    Object* getElement(int x,int y){
           return objects[x][y];
   }
}

class OtherClass{
      void resetObj(Object* obj){        // per getElement ein Element holen z.B. 1/1
                // Objekt auf NULL setzen
      }
}

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

26.10.2011, 22:28

Ja das geht so eben nicht. Wenn du das Element im Container auf 0 setzen willst, dann musst du es oder zumindest den Container auch kennen!?

Werwofl

Treue Seele

  • »Werwofl« ist der Autor dieses Themas

Beiträge: 100

Beruf: Fachinformatiker für Anwendungsentwicklung

  • Private Nachricht senden

4

26.10.2011, 22:44

Hm , das heißt ich muss es quasi mit nem erase aus dem Element löschen? Der Pointer soll ja nur NULL beeinhalten, wieso muss der vector davon was wissen, der besitzt doch auch nur den Pointer. Ob ich mir den Pointer jetzt explizit raushole und dann delete oder das Element mit nem erase lösche, kannst du mir den Unterschied erklären?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

26.10.2011, 22:56

Der Unterschied ist, dass das erase den Pointer aus dem vector löscht, während das NULL setzen ihn nur auf NULL setzt. Und das delete löscht das Objekt auf das der Pointer zeigt. Das sind 3 völlig verschiedene Dinge, die absolut nichts miteinander zu tun haben. Wenn du nur das Element löscht, dann ist einfach nur der Pointer aus dem vector weg. Wenn du das Element im vector auf NULL setzt, dann hat es danach einfach nur den Wert NULL. Nichts davon hat irgendeinen Einfluss auf das mit new erzeugte Objekt, auf das der Pointer zeigt. Erst ein delete löscht dieses Objekt. Das delete wiederum hat aber keinen Einfluss auf irgendwelche Pointer, die vielleicht mal dort hingezeigt haben.

Vor allem übergibst du z.B. da:

C-/C++-Quelltext

1
void Player::pickUp(Ressource* res)

Auch nur den Wert eines Pointers und nicht den Pointer selbst. D.h. wenn du da im Aufruf dieser Funktion auch ein Objekt aus deinem vector angibst, dann wird trotzdem nur der Wert und nicht das Objekt im vector selbst übergeben. Ich glaub du hast da wohl noch ein paar Verständnisprobleme. Schau dir vielleicht nochmal genau an, was der Unterschied zwischen Call-by-value und Call-by-referece ist.

Btw: In C++ verwendet man üblicherweise kein NULL, sondern einfach nur 0, oder jetzt neu: nullptr.

Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von »dot« (26.10.2011, 23:07)


Werbeanzeige