Hallo zusammen
Ich habe eine Schleife in der in jeder Iteration folgender Code aufgerufen wird:
Dabei verläuft im ersten Durchgang dieser Schleife alles noch völlig problemlos, u.Size ist 388, anschliessend werden diese Daten ausgelesen und curPos ist nach dem ersten Durchgang korrekt 396. Anschliessend im zweiten Durchgang habe ich folgenden Ablauf:
Ich liess den Debugger mal noch weiter laufen und erhielt für den dritten Schleifendurchlauf folgendes Ergebnis:
Ich sehe hier absolut keine Regel warum das passiert. Die ausgelesenen Mengen sind zwar jeweils korrekt, aber der Dateizeiger wird einfach absolut willkürlich in der Datei rumbewegt. Was könnte denn die Ursache dafür sein? Ich bin echt ratlos.
/EDIT:
Um das ganze etwas klarer zu formulieren habe ich ein externes Programm erstellt:
Ausgabe:
Grüsse
Cromon
Ich habe eine Schleife in der in jeder Iteration folgender Code aufgerufen wird:
C++:
struct { uint32 ID, Size; } u;
auto read = fread(&u, 1, sizeof(u), f);
auto curPos = ftell(f);
unsigned char* navData = (unsigned char*)dtAlloc(u.Size, DT_ALLOC_PERM);
read = fread(navData, 1, u.Size, f);
curPos = ftell(f);
status = mesh->addTile(navData, u.Size, DT_TILE_FREE_DATA, 0, nullptr);
Dabei verläuft im ersten Durchgang dieser Schleife alles noch völlig problemlos, u.Size ist 388, anschliessend werden diese Daten ausgelesen und curPos ist nach dem ersten Durchgang korrekt 396. Anschliessend im zweiten Durchgang habe ich folgenden Ablauf:
C++:
read = fread(&u, 1, sizeof(u), f); // <- read == 8
// u.Size == 572
curPos = ftell(f); // 404 (= 396 + 8) -> korrekt
read = fread(navData, 1, u.Size, f); // read == 572 -> korrekt
curPos = ftell(f); // 4201 -> WTF?
Ich liess den Debugger mal noch weiter laufen und erhielt für den dritten Schleifendurchlauf folgendes Ergebnis:
C++:
read = fread(&u, 1, sizeof(u), f); // read == 8 -> korrekt
// u.Size == 2341234252 erwartungsgemäss falsch, da ja der offenbar willkürlich in der Datei ist
curPos = ftell(f); // 4209 -> das ist wiederum "richtig"
read = fread(navData, 1, u.Size, f); // read == 2403 -> kompletter Schwachsinn
curPos = ftell(f); // curPos == 82315
Ich sehe hier absolut keine Regel warum das passiert. Die ausgelesenen Mengen sind zwar jeweils korrekt, aber der Dateizeiger wird einfach absolut willkürlich in der Datei rumbewegt. Was könnte denn die Ursache dafür sein? Ich bin echt ratlos.
/EDIT:
Um das ganze etwas klarer zu formulieren habe ich ein externes Programm erstellt:
C++:
FILE* f = fopen("Out\\1_39_28.nav", "r");
fseek(f, 0, SEEK_END);
uint32 size = ftell(f);
fseek(f, 0, SEEK_SET);
uint32 realFilePosition = 0;
while(!feof(f)) {
struct { uint32 ID, Size; } u;
auto read = fread(&u, 1, sizeof(u), f);
realFilePosition += read;
std::cout << "Read struct, returned " << read << " bytes." << std::endl;
std::cout << "Struct expects " << u.Size << " bytes." << std::endl;
std::vector<char> data(u.Size);
read = fread(data.data(), 1, u.Size, f);
realFilePosition += read;
std::cout << "Read " << read << " bytes of nav data." << std::endl;
std::cout << "File expected to be at " << realFilePosition << " (is at: " << ftell(f) << ")" << std::endl;
std::cout << std::endl;
}
fclose(f);
Ausgabe:
Code:
Read struct, returned 8 bytes.
Struct expects 388 bytes.
Read 388 bytes of nav data.
File expected to be at 396 (is at: 396)
Read struct, returned 8 bytes.
Struct expects 572 bytes.
Read 572 bytes of nav data.
File expected to be at 976 (is at: 4201)
Read struct, returned 8 bytes.
Struct expects 2017789394 bytes.
ERROR: Finished with error:
exception -> bad allocation
Grüsse
Cromon
Zuletzt bearbeitet: