JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

Probleme beim Laden von Klassen von Dateien

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik
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

BeitragVerfasst am: 26.07.2003, 13:23    Titel: Probleme beim Laden von Klassen von Dateien Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
abc_d
JLI Master Trainee


Alter: 35
Anmeldedatum: 27.01.2003
Beiträge: 615

Medaillen: Keine

BeitragVerfasst am: 27.07.2003, 16:44    Titel: Antworten mit Zitat

Kann mir niemand helfen?
_________________
http://mitglied.lycos.de/sarti/linuxisevil.gif Linux is evil - get the fact.

Never touch a running System - der Systemling
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
abc_d
JLI Master Trainee


Alter: 35
Anmeldedatum: 27.01.2003
Beiträge: 615

Medaillen: Keine

BeitragVerfasst am: 31.07.2003, 09:41    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Christian Rousselle
Site Admin


Alter: 48
Anmeldedatum: 19.07.2002
Beiträge: 1630

Medaillen: Keine

BeitragVerfasst am: 31.07.2003, 09:58    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Fragen, Antworten und Kritik 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