 |
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
abc_d JLI Master Trainee

Alter: 35 Anmeldedatum: 27.01.2003 Beiträge: 615
Medaillen: Keine
|
Verfasst am: 26.07.2003, 13:23 Titel: Probleme beim Laden von Klassen von Dateien |
|
|
Ich arbeite im moment an einem Lvl editor für ein Rollenspiel und schreibe gerade eine Klasse die die Lvl's verwaltet.
Bei 2 Klassen die mit fwrite(&Klassenname,sizeof(Klasse),1,dataFile); speichern will stürtzt es beim laden ab:
Bei dem Spielfeld (STL-Vektoren) bekomme ich folgenden Fehler:
Microsoft Visual C++ Debug Library
Program: D:\...
File: dbgheap.c
Line 1011
Expression: _CrtlsValidHeapPointer(pUserData)
For information ... see the Visual C++ dokumentation ...
Beenden Wiederholen Ignorieren
Das andere ist eine STL Liste die die Klasse Creature beinhaltet.
Da bekomme ich ein Schutzfehler der wenn ich auf Debug klicke auf
-> {return (iterator(_Acc::_Next(_Head))); }
zeigt.
Die Klasse die das Spielfeld benutz sieht so aus(ursprünglich was sie generisch, ich dachte aber das sei der Fehler und änderte sie):
Code: |
#include <vector>
using namespace std;
//Klasse die das Spielfeld verwaltet
class Matrix
{
public:
//Erstellt die Matrix
void Init(int x,int y,char *Fuellen)
{
Hoehe=y;
Breite=x;
Vektor.resize(Hoehe);
for(int i=0;i<Hoehe;i++)
{
Vektor[i].resize(Breite);
for(int z=0;z<Breite;z++)
Vektor[i][z]=Fuellen;
}
}
//Ändert die Größe ohne Felder zu verändern
void SetSize(int x,int y,char *Standart)
{
Vektor.resize(y);
for(int i=0;i<y;i++)
{
Vektor[i].resize(x);
for(int s=0;s<x;s++)
{
if((s>Breite)||(i>Hoehe))Vektor[i][s]=Standart;
}
}
Hoehe=y;
Breite=x;
}
//Löscht die Matrix
void CleanMatrix(int x,int y,char *Fuellen)
{
for(int w=0;w<Hoehe;w++)
{
for(int f=0;f<Breite;f++)
Vektor[w].pop_back();
Vektor[w].~vector();
}
Hoehe=y;
Breite=x;
Vektor.resize(Hoehe);
for(int i=0;i<Hoehe;i++)
{
Vektor[i].resize(Breite);
for(int z=0;z<Breite;z++)
Vektor[i][z]=Fuellen;
}
}
//Gibt die Matrix aus
void GiveOut()
{
for(int i=0;i<Hoehe;i++)
{
for(int z=0;z<Breite;z++)
cout <<Vektor[i][z]<<" ";
cout <<endl;
}
}
//Gibt die Höhe zurück
int GetHoehe()
{
return Hoehe;
}
//Gibt die Breite zurück
int GetBreite()
{
return Breite;
}
//Gibt der Wert des Feldes zurück
char *GetField(int x,int y)
{
return Vektor[y][x];
}
//Setzt ein Feld
void SetField(int x,int y,char *Set)
{
if(!((x>Breite)||(y>Hoehe)))
Vektor[y][x]=Set;
}
private:
//Vektor Klasse
vector<vector<char*> > Vektor;
//Höhe
int Hoehe;
//Breite
int Breite;
};
|
Die Kreaturen liste besteht aus:
//Kreaturen-Liste+Iterator
list<Creature> CreaturesList;
list<Creature>::iterator it;
Code: |
//Klasse die die Kreaturen verwaltet
class Creature
{
public:
//Setzt die Attribute
void SetAttributes(int iX,int iY,int iType,int iStrenght,int iLive,int iArmor);
//Setzt das Ziel
void SetTarget(int Target);
//Setzt die Zeit bis zur nächsten attacke
void SetTimeSLAttack(int Time);
//Gibt den Typ zurück
int GetType(){return Type;}
//Gibt x zurück
int GetX(){return x;}
//Gibt y zurück
int GetY(){return y;}
//Gibt Strenght zurück
int GetStrenght(){return Strenght;}
//Gibt Armor zurück
int GetArmor(){return Armor;}
//Gibt Live zurück
int GetLive(){return Live;}
//Gibt das Ziel zurück
int GetTarget(){return Target;}
//Gibt das Ziel zurück
int GetTimeSLAttack(){return TimeSLAttack;}
private:
//Gibt die Stärke der Kreatur an
int Strenght;
//Gibt das Leben der Kreatur an
int Live;
//Gibt die Rüstungsklasse(Armor) der Kreatur an
int Armor;
//Koordinaten der Kreatur
int x,y;
//Typ der Kreatur
int Type;
//Zeit bis zur nächsten attacke
int TimeSLAttack;
//Ziel zu dem es laufen soll
int Target;
};
|
Noch eine andere Frage:
wie überlade ich den Operator [] so das ich keine Klammern mehr brauche? _________________ http://mitglied.lycos.de/sarti/linuxisevil.gif Linux is evil - get the fact.
Never touch a running System - der Systemling |
|
Nach oben |
|
 |
abc_d JLI Master Trainee

Alter: 35 Anmeldedatum: 27.01.2003 Beiträge: 615
Medaillen: Keine
|
|
Nach oben |
|
 |
abc_d JLI Master Trainee

Alter: 35 Anmeldedatum: 27.01.2003 Beiträge: 615
Medaillen: Keine
|
Verfasst am: 31.07.2003, 09:41 Titel: |
|
|
Beim auskommentieren von vector<vector<char*> > Vektor; geht es. Kann es sein das ich keinen Zeiger-Vektor benutzen darf? Und wieso kann ich es nur nicht benutzen wenn ich es aus einer Datei laden will? _________________ http://mitglied.lycos.de/sarti/linuxisevil.gif Linux is evil - get the fact.
Never touch a running System - der Systemling |
|
Nach oben |
|
 |
Christian Rousselle Site Admin

Alter: 48 Anmeldedatum: 19.07.2002 Beiträge: 1630
Medaillen: Keine
|
Verfasst am: 31.07.2003, 09:58 Titel: |
|
|
Hallo,
du solltest Vectoren von Vecoten von char* nutzen können. Was aber nicht funktioniert, ist diese Klasse dann einfach mit fwrite wegschreiben. Es werden dann zwar die Werte der Pointer gespeichert, aber auf keinen Fall die Werte auf die sie verweisen....
Der Fehler sieht nach einem Speicherproblem aus (du überschreibst was oder gibst was falsch frei...). Dass man den Destruktor so aufrufen kann, wußte ich ehrlich gesagt nicht. Nimm lieber delete.
Christian |
|
Nach oben |
|
 |
|
|
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
|