 |
JLI Spieleprogrammierung
|
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
|
Verfasst am: 05.06.2004, 14:37 Titel: Fehler beim kopieren von Speicherbereichen |
|
|
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 |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 05.06.2004, 14:43 Titel: |
|
|
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 |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 14.06.2004, 15:57 Titel: |
|
|
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!  _________________ https://jonathank.de/games/ |
|
Nach oben |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 15.06.2004, 19:26 Titel: |
|
|
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 |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 27.06.2004, 16:10 Titel: |
|
|
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 |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 27.06.2004, 18:32 Titel: |
|
|
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 |
|
 |
Chewie Super JLI'ler
Anmeldedatum: 17.07.2003 Beiträge: 382
Medaillen: Keine
|
Verfasst am: 27.06.2004, 20:30 Titel: |
|
|
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 |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 27.06.2004, 20:35 Titel: |
|
|
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 |
|
 |
Chewie Super JLI'ler
Anmeldedatum: 17.07.2003 Beiträge: 382
Medaillen: Keine
|
Verfasst am: 27.06.2004, 20:41 Titel: |
|
|
achso, gut, ich habs mir da leichter gemacht... |
|
Nach oben |
|
 |
abc_d JLI Master Trainee

Alter: 35 Anmeldedatum: 27.01.2003 Beiträge: 615
Medaillen: Keine
|
|
Nach oben |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 01.07.2004, 16:46 Titel: |
|
|
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 |
|
 |
|
|
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
|