JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

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

Fehler beim kopieren von Speicherbereichen

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


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 05.06.2004, 14:37    Titel: Fehler beim kopieren von Speicherbereichen Antworten mit Zitat

Ich programmiere mir gerade einen 3D modelleditor. Nur leider macht die Exportfunktion schwierigkeiten:
Code:

void CPartlist::ExportToFile(LPCSTR Filename)
{
   //Als erstes die Gesamtzahl der Vertices/Indices ermitteln
   int iNumVertices=0;
   int iNumIndices=0;
   m_PartIt=m_Partliste.begin();
   for(int i=0; i<m_Partliste.size(); i++)
   {
      iNumVertices+=(*m_PartIt)->GetNumVertices();
      iNumIndices+=(*m_PartIt)->GetNumIndices();
      m_PartIt++;
   }
   //Jetzt entsprechene Speicher reservieren, die V und I kopieren und in eine SDatei schreiben!
   TexturedVertex* Vertices=new TexturedVertex[iNumVertices];
   TexturedVertex* pVertices=Vertices;//Schreibcursor für die Schleife
   

   //Aus vielen kleinen Vertexfelder ein großes machen:

   unsigned short* Indices=new unsigned short[iNumIndices];
   unsigned short* pIndices=Indices;//s. o.

   //Jetzt in einer Schleiffe alle VertexDaten in Vertices kopeiren
   int iTempNumIndices=0;
   m_PartIt=m_Partliste.begin();
   for(i=0; i<m_Partliste.size(); i++)
   {
      memcpy(pVertices, (*m_PartIt)->GetVertices(), sizeof(TexturedVertex)*(*m_PartIt)->GetNumVertices());
      pVertices+=(*m_PartIt)->GetNumVertices();

      memcpy(pIndices, (*m_PartIt)->GetIndices(), sizeof(unsigned short)*(*m_PartIt)->GetNumIndices());
      //Die Indices sind ja alle relativ, Dehalb müssen sie alle hochgezählt werden
      
      for(int i2=0; i<(*m_PartIt)->GetNumIndices(); i++)
      {
         pIndices[i2]+=iTempNumIndices;
      }
      iTempNumIndices+=(*m_PartIt)->GetNumVertices();

      pIndices+=(*m_PartIt)->GetNumIndices();//Den Schreibcursor weiter setzten

      m_PartIt++;
   }

   //Jetzt alle Vertices und Indices in die Datei schreiben
   char cDateiname[16], cTexturname[16];
   sprintf(cTexturname, "default.png");
   sprintf(cDateiname, "%s.c3m", Filename);
   FILE* Datei=fopen(cDateiname, "w");

   fwrite(&iNumVertices, sizeof(int), 1, Datei);
   fwrite(Vertices, sizeof(TexturedVertex), iNumVertices, Datei);

   fwrite(&iNumIndices, sizeof(int), 1, Datei);
   fwrite(Indices, sizeof(unsigned short), iNumIndices, Datei);

   fwrite(cTexturname, sizeof(char), 16, Datei);
   fclose(Datei);

   //Den temporären Speicher wieder freigeben
   delete[] Vertices;
   delete[] Indices;
}


Wenn ich die ein Modell exportiere, und anschließend verscuh zu laden, stimmen die Daten nicht mehr. Komischerweise sind die Vertexdaten bis zu einem bestimmetne Punkt richtig, danach enthalten sie nur noch Quatsch. Bei den Indexdaten ist es genau das selbe.
Der Texturname kann allerdings fehlerfrei gelesen weden.
Es scheint also so, als ob die Schleife, die die Speicherbereich zusammenkopieren soll, bei den ersten 2 Durchgängen funktioniert und ab dann nicht mehr. Hat jemand ne Ahnung woran das liegen könnte?
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 05.06.2004, 14:43    Titel: Antworten mit Zitat

Wie man sehen kann, hab ich versucht für den neuen Speicherbereich so ne Art Schreibcursor zu benutzen. Gerade bei einem Test, konnte er die erste Gruppe problemlos schreiben, bei der 2 waren alle Werte nur noch Blödsinn. Liegt es also evtl. am Schreibcursor?
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 14.06.2004, 15:57    Titel: Antworten mit Zitat

OK, ich hab das Problem jetz ein bischen anders gelöst. Die neue Funkltion sieht so aus:
Code:

void CPartlist::ExportToFile(LPCSTR Filename)
{
   //Als erstes die Gesamtzahl der Vertices/Indices ermitteln
   int iNumVertices=0;
   int iNumIndices=0;
   m_PartIt=m_Partliste.begin();

   for(int i=0; i<m_Partliste.size(); i++)//Schleife durchgehen und Teilzahlen zu Gesamtzahl addieren
   {
      iNumVertices+=(*m_PartIt)->GetNumVertices();
      iNumIndices+=(*m_PartIt)->GetNumIndices();
      m_PartIt++;
   }

   //Jetzt alle Vertices und Indices in die Datei schreiben

   //Datei öffnen
   char cDateiname[16], cTexturname[16];
   sprintf(cTexturname, "default.png");
   sprintf(cDateiname, "%s.c3m", Filename);
   FILE* Datei=fopen(cDateiname, "wb");//fehlt: Wenn Datei nicht geöffnet werden konnte...

   
   
   //Alle Vertices speichern
   fwrite(&iNumVertices, sizeof(int), 1, Datei);
   m_PartIt=m_Partliste.begin();
   for(i=0; i<m_Partliste.size(); i++)
   {
      fwrite((*m_PartIt)->GetVertices(), sizeof(TexturedVertex), (*m_PartIt)->GetNumVertices(), Datei);
      m_PartIt++;
   }

   //alle Indices speichern
   fwrite(&iNumIndices, sizeof(int), 1, Datei);

   int iTempNumIndices=0;
   unsigned short *pIndices=NULL, *pIndex=NULL;
   m_PartIt=m_Partliste.begin();
   for(i=0; i<m_Partliste.size(); i++)
   {
      //Die Indices müssen noch umgerechnet werden!
      pIndices=new unsigned short[(*m_PartIt)->GetNumIndices()];
      if(NULL==pIndices)
      {
         Error("Kein Speicher vorhanden");
      }
      pIndex=(*m_PartIt)->GetIndices();

      //Die Indexdaten kopieren und umrechnen
      for(int i2=0; i2<(*m_PartIt)->GetNumIndices(); i2++)
      {
         pIndices[i2]=pIndex[i2]+(unsigned short)iTempNumIndices;
      }
      iTempNumIndices+=(*m_PartIt)->GetNumVertices();
      Error(iTempNumIndices);

      fwrite(pIndices, sizeof(unsigned short), (*m_PartIt)->GetNumIndices(), Datei);
      delete[] pIndices;
      pIndices=NULL;
      m_PartIt++;
   }
   fwrite(cTexturname, sizeof(char), 16, Datei);
   fclose(Datei);
}


Der Fehler liegt in der for() Schleife in der die Indices kopiert und umgerechnet werden. Wenn ich die Addition auslasse (vor dem Plus ein ; und dann // ), werden die Daten korrekt gespeichert.
Wenn ich allerdings die Addition vorneheme, ird ein Teil der Daten korrekt berechnet, aber irgendwann steht dann nur noch Nullen oin der Datei, und die Textur kann auch nocht mehr richtig gelesen werden. Das bedeutet ja, das irgendwie die Speichergröße verändert wird, so dass der Lesecursor beim lesen (oder eher schreiben) des Texturnamens nicht an der richtigen Stelle steht.
Kann mir jemand helfen?
Ich bin so verzifelt! Sad
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 15.06.2004, 19:26    Titel: Antworten mit Zitat

Seltsamerweise tritt das Problem nur auf, wenn die Modelle aus zu vielen Gruppen bestehen, bzw. zu komplex sind. Wenn ich einfach nur einen Würfel oder so mache, gehts alles wunderbar, aber ich hab jetz an einem Modell immer weiter verfeinert und jetztb gehts auf einmal nicht meh! Warum???
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 27.06.2004, 16:10    Titel: Antworten mit Zitat

Tja, wenn ihr mir schon nicht helfen könnt, wisst ihr an wen ich mich sonst richten könnte? Den das Problem ist echt wichtig, wenn ich das nicht löse, kann ich gleich mit 3D aufhören. Und dabei hab ich doch grade erst angefangen.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 27.06.2004, 18:32    Titel: Antworten mit Zitat

An gut. Also ich hab jetz mal folgendes herausgefunden:
Code:

dwChunkSizeTest+=fread(&iNumIndices, sizeof(int), 1, Datei)*sizeof(int);
         dwChunkSizeTest+=fread(&dwIndexFormat, sizeof(DWORD), 1, Datei)*sizeof(DWORD);
         if(dwIndexFormat==sizeof(unsigned short))//Testen ob die Indices dads richtigeFormat haben!
         {
            Indices=new unsigned short[iNumIndices];
            dwChunkSizeTest+=fread(Indices, sizeof(unsigned short), iNumIndices, Datei)*sizeof(unsigned short);
         }
         else
         {
            Error("Modell::Laden");
            Error(Dateiname);
            Error("CT_INDICES speichert Indices im falschen Format!");
         }

         //ChunkSizeTest
         if(dwChunkSizeTest!=ChunkHeader.dwChunkSize)
         {
            Error("Falsche Chunkgröße: CT_INDICES");
            Error("angegeben:");
            Error(ChunkHeader.dwChunkSize);
            Error("gelesen:");
            Error(dwChunkSizeTest);
            Error("Anzahl Indices angegeben:");
            Error(iNumIndices);
         }

Der Fehler ist beim laden der Indices. Die Errorausgabe lautet:
Code:

Falsche Chunkgröße: CT_INDICES
angegeben:
104.000000
gelesen:
98.000000
Anzahl Indices angegeben:
48.000000


Das Problem ist folglich, das die fread() Funktion 6 byte zuwenig ließt, obwohl die Größe exakt angegeben ist. Den sizeof(unsigned short)*iNumindices=96, 96 plus die beiden int bzw. DWORD ergibt 104 Byte, also die korrekte Größe. Und diese 104 Byt wurden auch in die Datei geschrieben. Nun also die Frage, wie kann es sein, das fread zuwenig ließt???
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Chewie
Super JLI'ler



Anmeldedatum: 17.07.2003
Beiträge: 382

Medaillen: Keine

BeitragVerfasst am: 27.06.2004, 20:30    Titel: Antworten mit Zitat

kann dir leider auch nicht direkt helfen, weil ich immer streams verwende...solltest du dir mal anschauen, mit denen ist dateiarbeit um einiges einfacher. kleines beispiel:

string Data;
ifstream Input("datei.txt");

getline(Input, Data);
int iNumIndices = atoi(Data.c_str());

wirf mal die suchfunktion an, es wurden eh schon einige beispiele gepostet.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 27.06.2004, 20:35    Titel: Antworten mit Zitat

Aber Streams sind doch für Textdateien und nicht für Binärdateien, oder? Und komplexe Strukturen sollte man doch besser in binärdateien speichern, verschwendet weniger Platz und dürfte einfacher sein.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Chewie
Super JLI'ler



Anmeldedatum: 17.07.2003
Beiträge: 382

Medaillen: Keine

BeitragVerfasst am: 27.06.2004, 20:41    Titel: Antworten mit Zitat

achso, gut, ich habs mir da leichter gemacht...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
abc_d
JLI Master Trainee


Alter: 35
Anmeldedatum: 27.01.2003
Beiträge: 615

Medaillen: Keine

BeitragVerfasst am: 27.06.2004, 20:53    Titel: Antworten mit Zitat

Die kann man auch in binäre Dateien reinschmeissen:

http://www.cplusplus.com/ref/iostream/ofstream/open.html
_________________
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
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 01.07.2004, 16:46    Titel: Antworten mit Zitat

also, jetzt gehts endlich. Es lag daran das ich die binär datei mit wb und rb öffnen musste.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail 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