problem bei speicherreservierung
-
hi
ich habe da mal ein problem:gegeben ist...
...eine struct CMD2Vertex
struct CMD2Vertex { float x,y,z; };.. und eine struct CMD2Frame
struct CMD2Frame { CMD2Vector3 scale; CMD2Vector3 translate; char name[16]; CMD2Vertex *vertex; };jetz habe ich mal speicher für frames bereitgestellt:
CMD2Frame *frame; frame = new CMD2Frame[frames];geht wunderbar.
aber in der struct "CMD2Frame" gibt es das OBject "*vertex". dazu benutze ich eine schleife um jedes *vertex Object in jedem Frame speicher zu reservieren:
frame[i].vertex = new CMD2Vertex[vertices];aber jetzt kommt ein runtime-error! warum denn das?
-
Fachmann schrieb:
frame.vertex = new CMD2Vertex[vertices];aber jetzt kommt ein runtime-error! warum denn das?*
Wenn an dieser Stelle wirklich ein Fehler auftritt, dann liegt das entweder daran, dass [i]i* ein ungültiger Index ist. Beachte, dass i < frames (echt kleiner) sein muss.
Andere, aber unwahrscheinliche möglichkeit ist, dass der Arbeitsspeicher voll ist und du keinen neuen reservieren kannst.
Aber an dem Code, den du gezeigt hast, lässt sich nichts mit Sicherheit sagen. Benutz mal einen Debugger und schau genauer nach.
-
ok also der debugger sagt:
"Unhandled exception at 0x004019b8 in main.exe: 0xC0000005: Access violation writing location 0x00000029."
aber warum gibst da "access violation"? sowas dummes... und warum ist da eigentlich ein unhandled exeption? ich hab in meinem code nicht mit trough,try,catch,usw gearbeitet

-
Fachmann schrieb:
ok also der debugger sagt:
"Unhandled exception at 0x004019b8 in main.exe: 0xC0000005: Access violation writing location 0x00000029."
aber warum gibst da "access violation"? sowas dummes... und warum ist da eigentlich ein unhandled exeption? ich hab in meinem code nicht mit trough,try,catch,usw gearbeitet

ProgChild hat dir bereits geschrieben, wo das Problem ist.
Und das unhandled exeption kommt eben genau weil di throw, try, catch nicht benutzt hast..
-
wo ist das problem?
i<frames OK
arbeitsspeicher voll? un warum konnte ich das billige programm nicht starten aber danoch noch so ein hardcore-programm wie photoshop
naja ok ich bau ma through,catch,try exeptions ein. hab das noch nie grbruacht. runtime errors sind bei mir bisher nur mit divide by 0 , zugriff auf undefinierten zeiger oder sonstigen scheiss entstanden.
-
Zeig die Schleife und wie gross frames ist.
Und es heisst: throw!!
-
Fachmann schrieb:
naja ok ich bau ma through,catch,try exeptions ein.
Das kannst du gerne tun, aber das hilft dir bei diesem Problem nicht.
-
Wie sieht denn nun die Schleife aus? Und wie hoch ist vertices?
-
schleifenkopf:
for (i = 0; i < header.frames; i++)frames = 10
vertices = 24
joar und beim ersten schleifendurchgang ist i=0.
dh1. durchgang:
frame[0].vertex = new CMD2Vertex[24];aber das ist alles irrelevant denn:
frame[i].vertex = NULL;...gibt auch ein fehler
-
Mehr Code.
-
aber das ist alles irrelevant denn:
frame[i].vertex = NULL;...gibt auch ein fehler
Das heißt, dass es NICHT am allokieren liegt - sondern daran:
frame[i].vertexVersuch mal das davor zu schreiben:
frame[0]; //bzw frame[i]Ich wette, dass es schon da den Zugriffsfehler gibt...
Du machst also vor der Schleife schon irgendwas 'komisches' mit dem Objekt, weil all das, was du gepostet hast nicht der fehler ist ^^ also geh doch ma punkt für punkt den quellcode durch und guck immer, welche adresse und inhalte 'frame[0]' denn hat...
Debugger sind schon toll... :p
-
mmh hier nochmal alles auf einen schlag:
struct CMD2Vertex { float x,y,z; }; ... struct CMD2Frame { CMD2Vector3 scale; CMD2Vector3 translate; char name[16]; CMD2Vertex *vertex; }; ... class CMD2Model { public: CMD2Frame *frame; int frames; ... }; bool CMD2Model::Load(...) { ... frames = header.frames; frame = new CMD2Frame[header.frames]; printf("header.frames: %d",header.frames); //Ausgabe: header.frames: 10 printf("\nheader.vertices: %d",header.vertices); //ausgabe: header.v = 24 for (i = 0; i < header.frames; i++) { printf("i=%d",i); frame[i].vertex = NULL; //Error ... } ... }so, frame wurde nicht richtig allokiert oder so aber warum? bei den anderen speichern ging es doch auch und die sehen auch so aus
-
Kann es sein, dass dein CMD2Model nicht richtig erstellt wurde bzw. schon wieder gelöscht wurde, wie unskilled schon geschrieben hat? Setz mal Breakpoints im Kon- und Destruktor, und überprüf, dass die Adresse des Objektes stimmt.
-
ich hab den this zeiger im konstructor und in der load-methode abgerufen:
zwei unterschiedliche werte.
hier wird die classe deklariert (keine argumente an konstruktor) und die load-methode gestartet:CMD2Model model2;
if(model2.Load("C:\\animation.md2","",GL_LINEAR)==false)
puts("\n ERROR loading MD2");
-
Dann finde doch mal mit deinem Debugger raus, wo sich genau die Addresse deines Objektes ändert.
-
untersuche den Inhalt von frame unmittelbar vor der Zuweisung, die die beschriebene Ausnahme erzeugt.
Unhandled exception at 0x004019b8 in main.exe: 0xC0000005: Access violation writing location 0x00000029.
Diese Ausnahmen haben nichts mit C++-Exceptions zu tun. Diesem Fehler zufolge, wird ein Schreibzugriff auf die Adresse 41 versucht - falls tatsächlich die obige Zuweisung die betreffende Stelle ist, kann das eigentlich nur an einem fehlerhaften Wert in frame liegen (allerdings wohl nicht genau 0, denn vertex als Zeiger müsste eigentlich entsprechend (wohl auf 4 Byte) ausgerichtet sein). Letzlich kann dir nur der Debugger mehr verraten. Eine fehlgeschlagene Speicherreservierung kann dafür allerdings nicht verantwortlich sein, denn dann würde die Programmausführung diesen Punkt nie erreichen (weil eine echte C++-Exception vom Typ std::bad_alloc (oder davon abgleitet) geworfen würde).
-
der debugger sagt:
bei dem "vertex" objekt in der struct "Frame"
Error CXX0017 : symbol "" not found
gegooglet, rumprobiert, hab noch nicht gescheites dadrüber gesehen
komisch find ich das:
wenn ich in der klasse stattCMD2Frame *frame;schreibe, eine richtige array deklarier:
CMD2Frame frame[20];dann sieht der debugger kein error mehr beim object "vertex" aber der altbekannte error "unhandled exeption" kommt immernoch

-
boar ey...
jz schreib doch einfach mal nen bissl quellcode hier her...bye!
-
was soll ich den schreiben?? das problem ist doch nur. ich reserviert speicher für eine structure. den bereich kann ich aber nicht ansprechen:
hier das ganze: (*.h)struct CMD2Vector3 { float p[3]; }; typedef struct CMD2Vertex { float x; float y; float z; }; struct CMD2TexCoord { short s; short t; }; struct CMD2Skin { char name[64]; }; struct CMD2Triangle { unsigned short vertex[3]; unsigned short st[3]; }; struct CMD2Frame { CMD2Vector3 scale; CMD2Vector3 translate; char name[16]; CMD2Vertex *vertex; }; struct CMd2Header { int ident; int version; int skinwidth; int skinheight; int framesize; int skins; int vertices; int st; int triangles; int glcmds; int frames; int offset_skins; int offset_st; int offset_tris; int offset_frames; int offset_glcmds; int offset_end; }; class CMD2Model { public: CMD2Triangle *triangle; int triangles; int skins; CMD2Skin *skin; int texcoords; CMD2TexCoord *texcoord; CTga tex; char *tex_filename; CMD2Frame *frame; int frames; char *filename; //// CMD2Model(); bool Load(char *arg_md2_filename,char *arg_texture_filename, unsigned int arg_tex_flag); ~CMD2Model(); }; #endifund hier *.cpp datei...
bool CMD2Model::Load(char *arg_md2_filename, char *arg_texture_filename, unsigned int arg_tex_flag) { int i=0; filename = (char*) malloc(strlen(arg_md2_filename)+1); tex_filename = (char*) malloc(strlen(arg_texture_filename)+1); strcpy(filename,arg_md2_filename); strcpy(tex_filename, arg_texture_filename); printf("\n%s",arg_md2_filename); FILE* f_md2; f_md2 = fopen(arg_md2_filename,"rb"); if(f_md2 == NULL) return false; CMd2Header header; fread(&header,1,sizeof(header),f_md2); if ((header.ident != 844121161) || (header.version != 8)) return false; triangles = header.triangles; triangle = new CMD2Triangle [triangles]; skins =header.skins; skin = new CMD2Skin [skins]; frames = header.frames; ///hier wird frame allokiert://///////////////////////////// frame = new CMD2Frame[header.frames]; ////////////////////////////////////////////////////////////// printf("header.frames: %d",header.frames); texcoords = header.st; texcoord = new CMD2TexCoord[texcoords]; fseek (f_md2, header.offset_skins, SEEK_SET); fread (&skin, sizeof (struct CMD2Skin),skins, f_md2); fseek (f_md2, header.offset_st, SEEK_SET); fread (&texcoord, sizeof (CMD2TexCoord),texcoords, f_md2); fseek (f_md2, header.offset_tris, SEEK_SET); fread (&triangle, sizeof (CMD2Triangle),triangles, f_md2); fseek (f_md2, header.offset_frames, SEEK_SET); printf("\nheader.vertices: %d",header.vertices); for (int i = 0; i < 10; i++) { printf("i=%d",i); /////hier gibts denn error://///////////////////////////////// printf("%s",frame[i].vertex); ////////////////////////////////////////////////////////// //frame[i].vertex = new CMD2Vertex[header.vertices]; fread (&frame[i].scale, sizeof (CMD2Vector3), 1, f_md2);puts("OKl"); fread (&frame[i].translate, sizeof (CMD2Vector3), 1, f_md2);puts("OKl"); fread (&frame[i].name, sizeof (char), 16, f_md2);puts("OKl"); fread (&frame[i].vertex, sizeof (CMD2Vertex),header.vertices, f_md2);puts("OKl"); } fclose (f_md2); return true; }
-
also - wenn du das ganze so lassen willst, dann solltest du im C forum posten - das ist ALLES c - kein stück C++... ok - die news sind C++ ^^
fread (&skin, sizeof (struct CMD2Skin),skins, f_md2); //falsch?! => fread (&skin, sizeof (CMD2Skin),skins, f_md2); UND: guck dir ma streams an... std::istream datei; //vll auch ostream ^^ weiß ich nicht, weil ich verwends niemals ^^ datei.open (".\\dateiname.endung"); // gleiches verzeichnis datei >> skins; // skins aus datei auslesen...so rum is natürlich nicht all zu intelligent...
printf("%s",frame[i].vertex); frame[i].vertex = new CMD2Vertex[header.vertices]; => frame[i].vertex = new CMD2Vertex[header.vertices]; std::cout << frame[i].vertex[0] << std::endl; //#include <iostream>btw: wenn du new verwendest, solltest du auch delete verwenden... sonst is bissl doof, wenn du nur speicher anforderst und nie freigibst...
filename = (char*) malloc(strlen(arg_md2_filename)+1); tex_filename = (char*) malloc(strlen(arg_texture_filename)+1); => char *r = new char [laenge+1]; oder noch besser: std::string var ("beliebiger inhalt................................");bye...
PS: ich seh kein stück durch da... man kann auch fkt und klassen schreiben in c++. das macht es zumindest nicht verworrener - nur leserlicher, logischer, .... - besser eben ; )