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
|
Verfasst am: 04.01.2004, 21:11 Titel: Ungefragte Variablenänderungen in STL-Vector |
|
|
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
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 |
|
|
MadMax82 Mini JLI'ler
Anmeldedatum: 31.12.2003 Beiträge: 9
Medaillen: Keine
|
Verfasst am: 04.01.2004, 22:11 Titel: |
|
|
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 |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 05.01.2004, 12:15 Titel: |
|
|
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 |
|
|
Mazze JLI'ler
Alter: 39 Anmeldedatum: 02.01.2004 Beiträge: 145
Medaillen: Keine
|
Verfasst am: 05.01.2004, 16:06 Titel: |
|
|
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 |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 05.01.2004, 21:28 Titel: |
|
|
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
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 |
|
|
Mazze JLI'ler
Alter: 39 Anmeldedatum: 02.01.2004 Beiträge: 145
Medaillen: Keine
|
Verfasst am: 06.01.2004, 21:37 Titel: |
|
|
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 ))
...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 |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 06.01.2004, 21:46 Titel: |
|
|
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 |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 06.01.2004, 22:11 Titel: |
|
|
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 |
|
|
Jörg JLI MVP
Anmeldedatum: 19.07.2002 Beiträge: 182 Wohnort: Siegen/NRW Medaillen: Keine
|
Verfasst am: 07.01.2004, 11:01 Titel: |
|
|
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? _________________ www.messiahzone.de.vu |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 07.01.2004, 12:05 Titel: |
|
|
Sorry, hab ausversehen was beim Posten weggelassen
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 |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 07.01.2004, 15:07 Titel: |
|
|
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 |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 07.01.2004, 20:58 Titel: |
|
|
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 _________________ 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 |
|
|
|