I have a strange problem with a part of my code. I wrote an .ASE file loader to my application with the help of a book, but when I try to start my code without Debuging, it says that: "Unhandled exception at 0x77a737b7 in gl5.exe: 0xC0000374: A heap has been corrupted." I started to debug my code and i found stranges errors :S Most of the error messages are: "CXX0030: Error: expression cannot be evaluated". It's about pointers which i was deleted before. I tried everything, but can't find the problem. I need your help! Here's my code:
ase.cpp:
#include <iostream>
#include <stdio.h>
#include "ase.h"
using namespace std;
MODEL::MODEL(){mdl_objects = NULL;max_objects = 0;}
MODEL::~MODEL(){}
int countStrings (char *buffer, char *szo);
bool MODEL::Load(char * name){
FILE * file = NULL;
long filesize;
char *buffer;
char *tmp,token[] = " \\\":\t\r\n";
long cur_object = -1;
Release();
file = fopen(name,"rb");
fseek(file,0,SEEK_END);
filesize = ftell(file); //fájl mérete
buffer = new char[filesize+5];
strcat(buffer," EOF");
fseek(file,0,SEEK_SET);
fread(buffer,1,filesize,file);
fclose(file);
max_objects = countStrings(buffer,"*GEOMOBJECT");
mdl_objects = new MODEL_OBJECT[max_objects+1];
tmp = strtok(strdup(buffer),token);
while(strcmp(tmp,"EOF")){
if(strcmp(tmp,"*GEOMOBJECT") == 0){
cur_object++;
mdl_objects[cur_object].max_vertices = 0;
mdl_objects[cur_object].max_triangles = 0;
//mdl_objects[cur_object].max_uv_coord = 0;
mdl_objects[cur_object].vertex = NULL;
mdl_objects[cur_object].triangle = NULL;
//mdl_objects[cur_object].uv_coord = NULL;
mdl_objects[cur_object].max_facenormal = 0;
mdl_objects[cur_object].face_normal = NULL;
}
else if(strcmp(tmp,"*MESH_NUMVERTEX") == 0)
{
mdl_objects[cur_object].max_vertices = strtol(strtok(NULL,token),NULL,10);
mdl_objects[cur_object].vertex = new MODEL_VERTEX[mdl_objects[cur_object].max_vertices+1];
}
else if(strcmp(tmp,"*MESH_NUMFACES") == 0){
mdl_objects[cur_object].max_triangles = strtol(strtok(NULL,token),NULL,10);
mdl_objects[cur_object].max_facenormal = mdl_objects[cur_object].max_triangles;
mdl_objects[cur_object].triangle = new MODEL_TRIANGLE[mdl_objects[cur_object].max_triangles+1];
mdl_objects[cur_object].face_normal = new MODEL_FACE_NORMAL[mdl_objects[cur_object].max_facenormal+1];
}
else if(strcmp(tmp,"*MESH_VERTEX") == 0){
long cur_vertex = strtol(strtok(NULL,token),NULL,10);
sscanf(strtok(NULL,token),"%f",&mdl_objects[cur_object].vertex[cur_vertex].xyz[0]);
sscanf(strtok(NULL,token),"%f",&mdl_objects[cur_object].vertex[cur_vertex].xyz[2]);
sscanf(strtok(NULL,token),"%f",&mdl_objects[cur_object].vertex[cur_vertex].xyz[1]);
}
else if(strcmp(tmp,"*MESH_FACE") == 0){
long cur_tri = strtol(strtok(NULL,token),NULL,10);
strtok(NULL,token);
mdl_objects[cur_object].triangle[cur_tri].point[0] = strtol(strtok(NULL,token),NULL,10);
strtok(NULL,token);
mdl_objects[cur_object].triangle[cur_tri].point[1] = strtol(strtok(NULL,token),NULL,10);
strtok(NULL,token);
mdl_objects[cur_object].triangle[cur_tri].point[2] = strtol(strtok(NULL,token),NULL,10);
}
/*else if(strcmp(tmp,"*MESH_NUMTVERTEX") == 0){
mdl_objects[cur_object].max_uv_coord = strtol(strtok(NULL,token),NULL,10);
mdl_objects[cur_object].uv_coord = new MODEL_UV_COORD[mdl_objects[cur_object].max_uv_coord+1];
}
else if(strcmp(tmp,"*MESH_TVERT") == 0){
long cur_tver = strtol(strtok(NULL,token),NULL,10);
sscanf(strtok(NULL,token),"%f",&mdl_objects[cur_object].uv_coord[cur_tver].uv[0]);
sscanf(strtok(NULL,token),"%f",&mdl_objects[cur_object].uv_coord[cur_tver].uv[1]);
}*/
else if(strcmp(tmp,"*MESH_FACENORMAL") == 0){
long cur_fnormal = strtol(strtok(NULL,token),NULL,10);
sscanf(strtok(NULL,token),"%f",&mdl_objects[cur_object].face_normal[cur_fnormal].xyz[0]);
sscanf(strtok(NULL,token),"%f",&mdl_objects[cur_object].face_normal[cur_fnormal].xyz[1]);
sscanf(strtok(NULL,token),"%f",&mdl_objects[cur_object].face_normal[cur_fnormal].xyz[2]);
}
tmp = strtok(NULL,token);
}
delete [] buffer;
buffer = NULL;
return true;
}
int countStrings (char *buffer, char *szo){
char token[] = " \\\":\t\r\n";
char *ptr = strtok(strdup(buffer),token);
int i = 0;
while (strcmp(ptr,"EOF")){
if(strcmp(ptr,szo) == 0) i++;
ptr = strtok(NULL,token);
}
return i;
}
void MODEL::Release(){
if( max_objects > 0){
for(long obj = 0; obj < max_objects; obj++){
if(mdl_objects[obj].max_vertices > 0) delete [] mdl_objects[obj].vertex;
if(mdl_objects[obj].max_vertices > 0) delete [] mdl_objects[obj].triangle;
if(mdl_objects[obj].max_facenormal > 0) delete [] mdl_objects[obj].face_normal;
// if(mdl_objects[obj].max_vertices > 0) delete [] mdl_objects[obj].uv_coord;
}
delete [] mdl_objects;
mdl_objects = NULL;
max_objects = 0;
}
}
ase.h
/*struct MODEL_MATERIAL{
char *file_name;
long tex_id;
};*/
struct MODEL_VERTEX{
float xyz[3];
};
/*struct MODEL_UV_COORD{
float uv[5];
};*/
struct MODEL_TRIANGLE{
long point[3];
long uv_point[3];
};
struct MODEL_FACE_NORMAL{
float xyz[3];
};
struct MODEL_OBJECT{
long max_triangles;
long max_facenormal;
long max_vertices;
//long max_uv_coord;
//long material;
MODEL_FACE_NORMAL *face_normal;
MODEL_VERTEX *vertex;
MODEL_TRIANGLE *triangle;
//MODEL_UV_COORD *uv_coord;
};
class MODEL{
public:
MODEL();
~MODEL();
MODEL_OBJECT *mdl_objects;
long max_objects;
bool Load(char *file_name);
void Release();
};