problem bei speicherreservierung



  • mh das ist doch eine class "CMD2Model"

    das prinzip ist, die Klasse CMD2Model soll eine md2-datei (3d-model-datei, mit animation) laden.

    dazu werden die ganzen strukturen erstellt (zb CMD2Texture)

    in der CMD2Model-Klasse werden dann zeiger auf die strukturen deklariert.
    nun wird der header der datei gelesen.
    daraus wird entnommen wieviel Vertices, Frames, Skins, usw in der Datei sind.
    Dementsprechend wird der Platz reserviert:

    ...
    triangle = new CMD2Triangle [triangles];
        skins =header.skins;
        skin = new CMD2Skin [skins];
    ...
    

    nun werden die daten in die reservierten speicher geladen:

    ...
    fseek (f_md2, header.offset_st, SEEK_SET);
        fread (&texcoord, sizeof (CMD2TexCoord),texcoords, f_md2);
    ...
    

    für jedes frame wird nun ein schleifendurchgang vorgenommen in dem platz für die vertices in einem frame einen speicherplatz reserviert bekommen und die daten in diesen platz geschrieben werden.
    bei der allokaliesierung (oder so) von "frame" gibt es vermutlich einen fehler, sodass nicht zugegriffen wernden kann. aber warum?

    (this-zeiger ist immmer gleich)

    ich hab mir gedacht, wenn es da ein fehler bei der allokalisierung von frames gibt, dann schaff ich das einfach ab. sprich: ich leg eine array für die ganzen frames fest:

    CMD2Frame frame[20];

    und schreib dann in der schleife darein die frame-daten

    in der Hoffnung dass der Fehler nichtmehr vorkommt.
    aber er kommt trotzdem
    warum kommt dieser scheiss fehler? der pisst mich an. son scheiss hat ich noch nie

    ps: class = c++ , new = c++,
    der rest ist c weil ich das jetz mal übersichtlicher fand. für ein amateur reichts, solang es keine fehler verursacht, zumindest keine fatalen



  • wenn es übersichtlich wäre, dann würdest du den fehler finden...

    #include <string>
    #include <fstream>
    #include <iostream>
    
    bool CMD2Model::Load(const std::string &arg_md2_filename, const std::string &arg_texture_filename, size_t arg_tex_flag) 
    { 
        filename, tex_filename; //als std::string deklarieren (dafür brauchste nen #include <string>)
    
    	//strcpy ist eh deprecated... guckst du msdn... das aktuelle sollte strcpy_s sein
        filename = arg_md2_filename; //mit strings geht das so schön einfach, wahrscheinlich fast genau so schnell, sicherer, komfortabler und vor allem nicht so fehleranfällig
        tex_filename = arg_texture_filename; 
    
    	std::cout << arg_md2_filename << std::endl; //ausgabe....
    
    	std::ifstream f_md2; //#include <ifstream>
    	if (!f_md2.open (arg_md2_filename))
            return false; 
    
        CMd2Header header; 
    
    	f_md2 >> header;
    
        if ((header.ident != 844121161) || (header.version != 8))  //was auch immer ^^
            return false; 
    
        triangles = header.triangles; //was auch immer - ich nehm mal an size_t
    	//vll solltest du das auch triangle_count nennen - ist übersichtlicher und deutlicher...
        triangle = new CMD2Triangle [triangles]; //typ wirst du scho wissen und wird scho stimmen...
        skins = header.skins; //den sinn hiervon seh ich auch gerad nicht...
        skin = new CMD2Skin [header.skins];
        frames = header.frames; 
        frame = new CMD2Frame [header.frames]; 
    
    	std::cout << "header.frames: " << header.frames << std::endl; 
        texcoords = header.st; 
        texcoord = new CMD2TexCoord [texcoords]; 
    
    	f_md2.seekg (header.offset_skins, std::ios::beg);
    	f_md2 >> skin;
    	//die beiden zeilen könnte man auch in ne fkt zusammen packen...
    /*
    	so in etwa:
    	template <T> void readout (ifstream &dateistream, T &ausgabe, size_t offsetwert)
    	{
    		dateistream.seekg (offsetwert, std::ios::beg);
    		dateistream >> ausgabe;
    	}
    */
    //usw...
    
    	std::cout << "header.vertices: " << header.vertices << std::endl; 
        for (size_t i (0); i < 10; ++i) 
        { 
    		std::cout << "i= " << i << std::endl;
    		frame[i].vertex = new CMD2Vertex [header.vertices]; 
    		std::cout << frame[i].vertex << std::endl;
    
    		ifstream >> frame[i].scale; std::cout >> "\tOK1" >> std::endl;
    		ifstream >> frame[i].translate; std::cout >> "\tOK2" >> std::endl;
    		ifstream >> frame[i].name; std::cout >> "\tOK3" >> std::endl;
    		ifstream >> frame[i].vertex; std::cout >> "\tOK4" >> std::endl;
        } 
    
        return true; 
    }
    

    guck dir das mal an - sind bestimmt noch 1 oder 2 fehler drin - aber versuchs ma so weit zu ändern und sag, was dann passiert...



  • ok hat ein bisschen gedauert weil noch weitere, andere probleme entstanden sind aber hier nun der code:

    typedef struct C3DVertex
    {
    	float x,y,z,u,v;
    }C3DVertex;
    

    un hier das sorgenkind:

    C3DVertex *vertex =NULL;
    	vertex = new C3DVertex[head.num_vertices]; 
    
    	int vi = 0;
    	for(i=0;i<pModel->nNumMeshes;i++)
    	{
    		for(int j=0; j<pModel->pMeshes[i].nNumVertices;i++)
    		{
    			MBFLAG  /// MESSAGEWINDOW
    
    			vertex[vi+j].x = pModel->pMeshes[i].pVertices[j].Vertex[0];
    			vertex[vi+j].y = pModel->pMeshes[i].pVertices[j].Vertex[1];
    			vertex[vi+j].z = pModel->pMeshes[i].pVertices[j].Vertex[2];
    			vertex[vi+j].u = pModel->pMeshes[i].pVertices[j].u;
    			vertex[vi+j].v = pModel->pMeshes[i].pVertices[j].v;
    
    			MBFLAGS   ////  MESSAGEWINDOW mit S
    		}
    		vi = j+1;
    	}
    

    nun gibt es einen runtime-error nachdem MBFLAG 3x aufgerufen wurde. sprich: der error entsteht im 2. durchgang der schleife.
    das ist allerdings nur so wenn head.num_vertices==2.
    wenn head.num_vertices größer ist dann durchläuft es mehrer durchgänge bis zum error.
    dass der RAM voll ist glaub ich aber wohl kaum. das kann nicht sein


Anmelden zum Antworten