JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=9697ec0e397f0dc18ba011e65cfa5882Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Ungefragte Variablenänderungen in STL-Vector

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 04.01.2004, 21:11    Titel: Ungefragte Variablenänderungen in STL-Vector Antworten mit Zitat

Hi,

ich hab mal wieder ein sehr mysteriöses Problem: Die Membervariablen einer Klasse werden komischerweise immer an der selben Stelle von selbst geändert.
Ich habe eine Klasse für die Zaubersprüche(CLASSspells). Alle Zaubersprüche des Spiels werden in einem Vector gespeichert(vergangene Zauber werden wieder gelöscht).
Code:
vector<CLASSspells> spells;

Dieser Vector ist global verfügbar. Wenn ich nun einen Zauberspruch starten will(beispielsweise den Spruch auf spells[0]), der aus mehreren gleichen Teilen besteht, stoße ich auf das Problem.
In der Memberfunktion zum fortbewegen der Zaubersprüche sollen in regelmäßigen Abständen Zaubersprüche hinzugefügt werden(CAddSpellpart). In dieser Memberfunktion wird der Teil des Zauberspruchs wie ein gewöhlicher ganz normal gestartet:
Code:
//Initialisierungen
CLASSspells newspell(blabla);

//Zauberspruch abfeuern
newspell.CStartSpell(X,Y,Direction,false);

Doch wenn ich diesen neuen Spruch(ist dann spells[1]) jetzt hinter spells[0] dem vector hinzufügen will, ändern sich plötzlich die Parameter des Zauberspruchs spells[0] bzw. Dessen Membervariablen.
Code:
//Zauberspruch dem allg. Vector hinzufügen
spells.push_back(newspell);

Nach dieser Stelle haben alle Membervariablen des Typs short den Wert –8739(eine enum-variable hat den Wert –572662307).

Ich hab schon alles Mögliche probiert, inklusive debuggen, aber ich kann mir einfach nicht helfen Sad
Wie ist so was möglich?

Hier noch mal eine vereinfachte Darstellung:
Zitat:
Begin des Programms:
VECTOR
- CLASSspells VectorElement1:
-> short var1=0;
-> short var2=0;

Nach hinzufügen des Zauberspruchteils:
VECTOR
- CLASSspells VectorElement1:
-> short var1=–8739;
-> short var2=–8739;

- CLASSspells VectorElement2:
-> short var1=0;
-> short var2=0;

_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
MadMax82
Mini JLI'ler



Anmeldedatum: 31.12.2003
Beiträge: 9

Medaillen: Keine

BeitragVerfasst am: 04.01.2004, 22:11    Titel: Antworten mit Zitat

Nur mal eine Vermutung, ich kenne mich mit der STl nicht so genau aus.
Bei einem Vector haben wir ja eine Hintereinander liegenden Speicherbereich also muss man beim Verlängern des Arrays das alte Array verwerfen und neuen Speicher in der gewünschten länge anfordern. Ich könnte mir vorstellen das hier keine richtige Copy der Klasse ersellt wird.Vieleicht klappt es wen du den CopyConstructor der Klasse umschreibst.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 05.01.2004, 12:15    Titel: Antworten mit Zitat

MadMax82 hat Folgendes geschrieben:
Ich könnte mir vorstellen das hier keine richtige Copy der Klasse ersellt wird.Vieleicht klappt es wen du den CopyConstructor der Klasse umschreibst.

Möglich, aber wie sieht denn so ein Kopierkonstruktor aus? (Im Buch hab ich nix gefunden)

PS: Vielleicht sollte ich noch dazu sagen, dass die Werte NICHT verändert werden, wenn ich von WinMain() aus oder von jeder beliebigen anderen Funktion einen Zauberspruch so hinzufüge:
Code:
//Initialisierungen
CLASSspells newspell(blabla);

//Zauberspruch abfeuern
newspell.CStartSpell(X,Y,Direction,false);

Die Veränderungen passieren nur, wenn ich das von einer Memberfunktion der Klasse selbst ausführen will.
_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Mazze
JLI'ler


Alter: 39
Anmeldedatum: 02.01.2004
Beiträge: 145

Medaillen: Keine

BeitragVerfasst am: 05.01.2004, 16:06    Titel: Antworten mit Zitat

Nen Copy-Ckonstrukt is nichts wieteres als ein Konstruktor der als Parameter z.b. eine Konstante Referenz auf ein Objekt gleichen Typs erwartet z.b.

Code:

Foo::Foo(const Foo &bar) {
  //Hier dann einfach bar nach this kopieren!
}


Vllt.mal nach Memory Leak suchen..vllt wird irgendwo speicher nicht richtig Freigeben oder nicht genug Bereitgestellt, irgendwo im Programm?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 05.01.2004, 21:28    Titel: Antworten mit Zitat

thx,
kannst du mir noch ein Beispiel geben, wie der Konstruktor im Inneren aussieht?
Ich habe this noch nie benutzt und weiß auch nicht, wie mans verwendet Rolling Eyes Embarassed
BTW: Wird dieser Konstruktor automatisch beim Kopieren aufgerufen>?

Mazze hat Folgendes geschrieben:
Vllt.mal nach Memory Leak suchen..vllt wird irgendwo speicher nicht richtig Freigeben oder nicht genug Bereitgestellt, irgendwo im Programm?

Das glaube ich eher nicht. Ich hab auch bisher keines gefunden.
PS: Wäre das überhaupt ein Grund für eine Änderung ver Member?
_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Mazze
JLI'ler


Alter: 39
Anmeldedatum: 02.01.2004
Beiträge: 145

Medaillen: Keine

BeitragVerfasst am: 06.01.2004, 21:37    Titel: Antworten mit Zitat

Hm....naja this ist ja im Wesentlich nur ein Pointer auf die Klasse selbst, also müsstest du einfach nur die Daten der Referenz an "this" übergeben...da kannste z.b. einfach die member-variabelen "manuell" kopieren....oder halt das ganze "direkt" kopieren...aber da weis ich jetzt so auf anhieb nicht wie das geht....(kann mich aber nochmal schlau machen...)

2tes: naja...ich weis es nicht 100%, aber ich würde es auch nicht umbedingt ausschließen, hatte auch ein ähnliches Problem vor kurzem, die Lösung war das ich den Code an einigen stellen einfach nochmal neu geschrieben habe Wink))
...also ich würd einfach mal nen Leak-Tracer benutzen...und mal sehen was der sagt, vielleicht findet sich ja was....
für Windows kenn ich nur leider keinen...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 06.01.2004, 21:46    Titel: Antworten mit Zitat

Heißt das dann in etwa so:
Code:
CLASSklasse::CLASSklasse(const CLASSklasse & Referenz)
{
   this=Referenz;
}

...oder muss man this noch irgendwie definieren?
_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 06.01.2004, 22:11    Titel: Antworten mit Zitat

this ist immer das Objekt selber. Das brauchst du nicht definieren.
_________________
"I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse."
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jörg
JLI MVP
JLI MVP



Anmeldedatum: 19.07.2002
Beiträge: 182
Wohnort: Siegen/NRW
Medaillen: Keine

BeitragVerfasst am: 07.01.2004, 11:01    Titel: Antworten mit Zitat

The Lord of Programming hat Folgendes geschrieben:
PS: Vielleicht sollte ich noch dazu sagen, dass die Werte NICHT verändert werden, wenn ich von WinMain() aus oder von jeder beliebigen anderen Funktion einen Zauberspruch so hinzufüge:
Code:
//Initialisierungen
CLASSspells newspell(blabla);

//Zauberspruch abfeuern
newspell.CStartSpell(X,Y,Direction,false);

Die Veränderungen passieren nur, wenn ich das von einer Memberfunktion der Klasse selbst ausführen will.


Nur zum Verständnis: Wo wird hier der Zauberspruch hinzugefügt? Wink
_________________
www.messiahzone.de.vu
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 07.01.2004, 12:05    Titel: Antworten mit Zitat

Sorry, hab ausversehen was beim Posten weggelassen Embarassed
Wie ich im ersten Post geschrieben habe, wird der Zauberspruch dann so hinzugefügt:
Code:
//Zauberspruch dem allg. Vector hinzufügen
spells.push_back(newspell);

_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Hazel
JLI MVP
JLI MVP


Alter: 39
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 07.01.2004, 15:07    Titel: Antworten mit Zitat

Kopierkonstruktor:

Code:

class Foo
{
   float m_Float;
   int * m_IntAry;
   int m_Size;

public:
   Foo();
   Foo(float a);
   Foo(float a, int b);
   Foo(const Foo & ref);
   virtual ~Foo();
};

Code:

Foo::Foo() : m_Float(0), m_Size(10)
{
   m_IntAry = new int[m_Size];
}

Foo::Foo(float a) : m_Float(a), m_Size(10)
{
   m_IntAry = new int[m_Size];
}

Foo::Foo(float a, int b) : m_Float(a), m_Size(b)
{
   m_IntAry = new int[m_Size];
}

Foo::Foo(const Foo & ref)
{
   m_Float = ref.m_Float;
   m_Size = ref.m_Size;

   m_IntAry = new int[m_Size];
   // TODO: m_IntAry kopieren
}

Foo::~Foo()
{
   delete[] m_IntAry;

   m_IntAry = m_Float = m_Size = 0;
}


Ich hoffe der Code ist selbsterklärend. :)
_________________
*click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
The Lord of Programming
Living Legend


Alter: 37
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 07.01.2004, 20:58    Titel: Antworten mit Zitat

thx @all.
Ich hab den Kopierkonstruktor jetzt so geschrieben und er wird auch aufgerufen und korrekt ausgeführt. Komischerweise ändern sich danach trotzdem noch die Variablen.
Nachdem ich jetzt statt einem vector eine liste verwendet habe, funktioniert alles einwandfrei Smile
_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum