float = 4.344e-044#DEN (im Vertexbuffer)



  • Entweder du hast da genau die Daten reingeschrieben, oder die standen schon vorher drin. Schreibe einfach die korrekten Daten in den float. f'`8k

    Gruß, TGGC (\-/ has leading)



  • @TGGC

    fread bringt an dieser stelle einen fehler und ich hab mit nem Hexeditor die stelle angeschaut - die daten stehen richtig drinne

    @xindoon
    folgende funktion wird von Main 2x aufgerufen
    also pseudocode:

    x3dobj.load3dobj("test");
    x3dobj.load3dobj("tetfile");
    
    int x3dobj::load3dobj(char *filename)
    {
        int ffree;
        for(int i = 0;i<10000;i++)
        {
            if (my_3dobj_inuse[i] == false)
            {
                ffree = i;
                goto out;
            }
        }
    out:
        CHAR *tostr = new char[100];
        sprintf(tostr,"Load 3D-obj %s to %i" ,filename,ffree);
        refreshcon(tostr);
        if(filename=="test") 
        {
    //Vom directx sdk umgeschreibens funktioniert einwandfrei;
            if( FAILED( d3dDevice->CreateVertexBuffer( 50*2*sizeof(CUSTOMVERTEX),
                                                      0, D3DFVF_CUSTOMVERTEX,
                                                      D3DPOOL_DEFAULT, &my_3dobjs[ffree].VB, NULL ) ) )
    
            {
                MessageBox(NULL,"error @vblock","a",MB_OK);
                return E_FAIL;
            }
    
            if( FAILED( my_3dobjs[ffree].VB->Lock(0,0, (void**)&my_3dobjs[ffree].pVertices, 0 )))
            {
                MessageBox(NULL,"error @vblock","a",MB_OK);
                return E_FAIL;
            }
            for( DWORD i=0; i<50; i++ )
            {
                FLOAT theta = (2*D3DX_PI*i)/(50-1);
                my_3dobjs[ffree].pVertices[2*i+0].position = D3DXVECTOR3( sinf(theta),-1.0f, cosf(theta) );
    
                my_3dobjs[ffree].pVertices[2*i+0].color    = 0xffffffff;
    #ifndef SHOW_HOW_TO_USE_TCI
                my_3dobjs[ffree].pVertices[2*i+0].tu1       = ((FLOAT)i)/(50-1);
                my_3dobjs[ffree].pVertices[2*i+0].tv1       = 1.0f;
    #endif
                my_3dobjs[ffree].pVertices[2*i+1].position = D3DXVECTOR3( sinf(theta), 1.0f, cosf(theta) );
    
                my_3dobjs[ffree].pVertices[2*i+1].color    = 0xff808080;
    #ifndef SHOW_HOW_TO_USE_TCI
                my_3dobjs[ffree].pVertices[2*i+1].tu1       = ((FLOAT)i)/(50-1);
                my_3dobjs[ffree].pVertices[2*i+1].tv1       = 0.0f;
    #endif
            }    
            my_3dobjs[ffree].VB->Unlock();
            my_3dobjs[ffree].textur1_id = Loadtextur("test",D3DCOLOR_ARGB(0,255,255,255));
            my_3dobjs[ffree].an_vertex=98;
            my_3dobj_inuse[ffree]=TRUE;
    
            ZeroMemory( &my_3dobjs[ffree].mtrl, sizeof(D3DMATERIAL9) );
            my_3dobjs[ffree].mtrl.Diffuse.r = my_3dobjs[ffree].mtrl.Ambient.r = 0.5f;
            my_3dobjs[ffree].mtrl.Diffuse.g = my_3dobjs[ffree].mtrl.Ambient.g = 1.0f;
            my_3dobjs[ffree].mtrl.Diffuse.b = my_3dobjs[ffree].mtrl.Ambient.b = 0.7f;
            my_3dobjs[ffree].mtrl.Diffuse.a = my_3dobjs[ffree].mtrl.Ambient.a = 0.0f;
            FILE* x;
            int y;
    /*        x = fopen("tetfile","w");
            y = fwrite(&my_3dobjs[ffree].an_vertex,sizeof(my_3dobjs[ffree].an_vertex),1,x);
    
            for(int i=0;i<100;i++)
            {
                fseek(x,80*i+4,SEEK_SET);
                y = fwrite(&my_3dobjs[ffree].pVertices[i],80,1,x);
            }
            y = fwrite(&my_3dobjs[ffree].mtrl,sizeof(my_3dobjs[ffree].mtrl),1,x);
            fclose(x);
    */        
            return ffree;
        }
        else
        {
            FILE* x;
            x = fopen(filename,"r");
            int y;
            fseek(x,0,SEEK_SET);
            y = fread(&my_3dobjs[ffree].an_vertex,sizeof(my_3dobjs[ffree].an_vertex),1,x);
            my_3dobjs[ffree].pVertices= (CUSTOMVERTEX*)malloc( 8000);
            if( FAILED( d3dDevice->CreateVertexBuffer( 8000,0, D3DFVF_CUSTOMVERTEX,D3DPOOL_DEFAULT, &my_3dobjs[ffree].VB, NULL ) ) )
            {
                MessageBox(NULL,"error @vblock","a",MB_OK);
                return E_FAIL;
            }
            if( FAILED( my_3dobjs[ffree].VB->Lock(0,0, (void**)&my_3dobjs[ffree].pVertices, 0 )))
            {
                MessageBox(NULL,"error @vblock","a",MB_OK);
                return E_FAIL;
            }
            char *tos = new char[100];
            fseek(x,4,SEEK_SET);
             for(DWORD i=0;i<100;i++)
            {
                fseek(x,80*i+4,SEEK_SET);
                y = fread(&my_3dobjs[ffree].pVertices[i],80,1,x);
                if(y!=1)
                {
                    refreshcon("Fehler");
                }
            }
            my_3dobjs[ffree].VB->Unlock();
            my_3dobjs[ffree].textur1_id = Loadtextur("test",D3DCOLOR_ARGB(0,255,255,255));
            my_3dobj_inuse[ffree]=TRUE;
            D3DMATERIAL9 tmtrl;
            //fread(&my_3dobjs[ffree].mtrl,sizeof(my_3dobjs[ffree].mtrl),1,x);
            fseek(x,8004,SEEK_SET);    
            fread(&tmtrl,sizeof(tmtrl),1,x);
            memcpy(&my_3dobjs[ffree].mtrl,&tmtrl,sizeof(tmtrl));
            fclose(x);
        }
        if(ffree>=last3dobject)
        {
            last3dobject = ffree;
        }
        return ffree;
    }
    

    und der CUSTOMVERTEX aus der .h:

    struct CUSTOMVERTEX
    {
        D3DXVECTOR3 position; // The position 3*4 =             12
        D3DCOLOR    color;    // The color    4*1 =              4
    #ifndef SHOW_HOW_TO_USE_TCI
        FLOAT       tu1, tv1;   // The texture coordinates 2*4 = 8
    	FLOAT       tu2, tv2;   // The texture coordinates 2*4 = 8
    	FLOAT       tu3, tv3;   // The texture coordinates 2*4 = 8
    	FLOAT       tu4, tv4;   // The texture coordinates 2*4 = 8
    	FLOAT       tu5, tv5;   // The texture coordinates 2*4 = 8
    	FLOAT       tu6, tv6;   // The texture coordinates 2*4 = 8
    	FLOAT       tu7, tv7;   // The texture coordinates 2*4 = 8
    	FLOAT       tu8, tv8;   // The texture coordinates 2*4 = 8
    #endif
    };
    

    EDIT:

    habs eben mit einen Puffer versucht der fehler tritt auch hier an der selben stelle auf (beim selben abschnitt)



  • LinkeT schrieb:

    @TGGC

    fread bringt an dieser stelle einen fehler und ich hab mit nem Hexeditor die stelle angeschaut - die daten stehen richtig drinne

    Schoene Geschichte. f'`8k

    Gruß, TGGC (\-/ has leading)



  • ja nun einer ne idee ?!

    ich werds mal fstream probieren



  • dein code ist ziemlich kraut und rueben, da wird kaum einer lust haben, sich damit auseinanderzusetzen...

    grundsaetzliches:
    sizeof(CUSTOMVERTEX) = 80 ? (stichwort alignment)

    my_3dobjs[ffree].an_vertex = 100 ?

    du allokierst erstmal speicher fuer deine vertices:

    my_3dobjs[ffree].pVertices= (CUSTOMVERTEX*)malloc( 8000)
    

    und ueberschreibst den zeiger beim lock des vertexbuffers:

    VB->Lock(0,0, (void**)&my_3dobjs[ffree].pVertices, 0 )
    


  • Ohne malloc stürzt das Program (warum auch immer) ab und zwar mit ein Fehler wo hin zu schreiben.

    Kraut und/oder Rueben ... wenn der Code so sein muss ... musser halt
    oder weil ich nen schlechter kommentator bin - weil ich den sinn nicht sehe

    if(filename=="test")
    

    zB zu kommenteieren, also mein Kommentar würde da fast heissen

    //if(filename=="test") oder halt nich
    

    *G*

    ok um das Problem auf die zeilen zu reduzieren wo es fehler gibt [kann man auch ohne c++ code]:

    egal ob ich per ifstream oder fread die daten einlesse nur in dem Projekt machts fehler, wo anders nicht er liest die daten FALSCH ein (weis das auch, da y=fread(....) ergibt y == 0 bzw nicht die anzahl der zuladenen strukturen(1) ) -> datei ist korrekt (wurde ja auch mit mit fwrite erstellt), ABER sie wird falsch gelessen, speicher ist frei/schreibbar aber er wird halt nicht beschrieben

    also für mich ist das einfach nur unlogisch bzw "Windows lebt" und macht nicht was ich will - warum auch immer 😡

    wenn man den Customvertex halt mit allen "befüttert" wozu man ihn bald brauchen könnte wird der halt 80 Bytes gross, warum ich da noch kein sizefo drinne hab ist ja fast "egal" daran liegts nicht mal nen beispiel wies bei fread mit fehler war:

    er liest die anzahl der vertecies (richtig ein) liest anschliessen die vertices, und texturangaben 0 - 89 richtig ein 90 und 91 ist jeweils tu1/tv1 flasch! (aber die koordinaten sind richtig) 92 - 99 sind dann wieder korrekt anschliessend noch das material - einwandfrei ...
    effektiv waren nur 4 FLOATS dier er falsch eingelessen hat ...

    ach ja ifstream ist zwar eine alternative - bringt aber nur noch mehr fehler, und das auf mehr als nur einem rechner -> wtf mach ich falsch ...

    hatte früher das problem bei c++ das datei einlessen fehler brachte ... war ohl ein grund mich mit vb6 zu beschäftigen aber jetzt will ichs mit c++ programieren, ohne wieder diese fehler zuhaben :grml:



  • so habs eben noch mal getestet ...

    der selbe code in 2 verschiedenen Projekten sind auch 2 Ergebnisse.



  • weil ich den sinn nicht sehe zB

    if(filename=="test")
    

    zu kommenteieren

    dieser vergleich funktioniert uebrigens nur "zufaellig" deswegen, weil der compiler so nett ist, identische strings zu sammeln und beide zeiger an die gleiche adresse zeigen...

    Ohne malloc stürzt das Program (warum auch immer) ab und zwar mit ein Fehler wo hin zu schreiben.

    das waere wohl ein guter ausgangspunkt um mal den debugger zu starten...

    darueber hinaus waere es sinnvoll die datei im binaermodus ("rb", "wb") zu behandeln...

    zur weiteren fehlereingrenzung waere es hilfreich, die komponenten deiner struktur einzelnd zu verarbeiten.



  • aso na dann werd ich das mal in strcmp ändern 😉

    alles einzeln ... ok wenns den sein muss *grml*


  • Mod

    LinkeT schrieb:

    also für mich ist das einfach nur unlogisch bzw "Windows lebt" und macht nicht was ich will - warum auch immer 😡

    😮 was du betreibst hat eher mit zufaelligem ausprobieren denn mit logik zu tun, deswegen sind die resultate genau so zufaellig. du kommst damit nicht weit. nutze den debugger, step durch, vergleiche die resultate deines codes mit denen die du erwartest, zeile fuer zeile und fix es.



  • rapso schrieb:

    LinkeT schrieb:

    also für mich ist das einfach nur unlogisch bzw "Windows lebt" und macht nicht was ich will - warum auch immer 😡

    😮 was du betreibst hat eher mit zufaelligem ausprobieren denn mit logik zu tun, deswegen sind die resultate genau so zufaellig. du kommst damit nicht weit. nutze den debugger, step durch, vergleiche die resultate deines codes mit denen die du erwartest, zeile fuer zeile und fix es.

    rat ma woher ich weis das tu1 und tv1 = 4.344e-044#DEN sind 😉 [ich progge ja auch nicht seit dem ich hier registriert bin, schon seit ca 4 Jahre]
    und das der fehler nur bei 2(!!!) von 100(!!!) auftritt (und das halt bei 90/91) ... -> der code funktionier warum es aber an 90/91 fehler bringt weis der geier

    so nun hab ichs fertig ... mit nen paar umwegen und das laden dauert jetzt bestim länger ... also Code sieht jetzt so aus zumindest die lade routine:

    CUSTOMVERTEX buf;
            for(DWORD i=0;i<my_3dobjs[ffree].an_vertex+2;i++)
            {
                fseek(x,i*80+4+0,0);
                fread(&buf.position,12,1,x);
                fseek(x,i*80+4+12,0);
                fread(&buf.color,4,1,x);
                fseek(x,i*80+4+16,0);
                fread(&buf.tu1,4,1,x);
                fseek(x,i*80+4+20,0);
                fread(&buf.tv1,4,1,x);
                fseek(x,i*80+4+24,0);
                fread(&buf.tu2,4,1,x);
                fseek(x,i*80+4+28,0);
                fread(&buf.tv2,4,1,x);
                fseek(x,i*80+4+32,0);
                fread(&buf.tu3,4,1,x);
                fseek(x,i*80+4+36,0);
                fread(&buf.tv3,4,1,x);
                fseek(x,i*80+4+40,0);
                fread(&buf.tu4,4,1,x);
                fseek(x,i*80+4+44,0);
                fread(&buf.tv4,4,1,x);
                fseek(x,i*80+4+48,0);
                fread(&buf.tu5,4,1,x);
                fseek(x,i*80+4+52,0);
                fread(&buf.tv5,4,1,x);
                fseek(x,i*80+4+56,0);
                fread(&buf.tu6,4,1,x);
                fseek(x,i*80+4+60,0);
                fread(&buf.tv6,4,1,x);
                fseek(x,i*80+4+64,0);
                fread(&buf.tu7,4,1,x);
                fseek(x,i*80+4+68,0);
                fread(&buf.tv7,4,1,x);
                fseek(x,i*80+4+72,0);
                fread(&buf.tu8,4,1,x);
                fseek(x,i*80+4+76,0);
                fread(&buf.tv8,4,1,x);
                memcpy(&my_3dobjs[ffree].pVertices[i],&buf,80);
            }
    

    wenn ich das jetzt in ändere:

    CUSTOMVERTEX buf;
            for(DWORD i=0;i<my_3dobjs[ffree].an_vertex+2;i++)
            {
                fseek(x,i*80+4,0);
                fread(&buf,80,1,x);
                memcpy(&my_3dobjs[ffree].pVertices[i],&buf,80);
            }
    

    gibts wieder ein fehler - jetzt aber wird "nur" tv1 nicht eingelessen ... ich belasses bei alles nach einander dauerst halt eben länger ich werds nur auskommentieren was nicht funktioniert und dann mal schauen wieviel langsamer es ist;)



  • Du hast also falsche Werte in den floats stehen? Entweder du hast da genau die Daten reingeschrieben, oder die standen schon vorher drin. Schreibe einfach die korrekten Daten in die floats, dann muesste es gehen. f'`8k

    Gruß, TGGC (\-/ has leading)[/quote]



  • TGGC schrieb:

    Du hast also falsche Werte in den floats stehen? Entweder du hast da genau die Daten reingeschrieben, oder die standen schon vorher drin. Schreibe einfach die korrekten Daten in die floats, dann muesste es gehen. f'`8k

    Gruß, TGGC (\-/ has leading)

    @tggc scheinbar hast du das gefühl das ich dein(e) post(s) nicht gelessen hätte - irgendwie scheints mir aber andersrum 😉

    Du hast also falsche Werte in den floats stehen?

    ja

    Entweder du hast da genau die Daten reingeschrieben,

    nein

    oder die standen schon vorher drin.

    nein

    Schreibe einfach die korrekten Daten in die floats,

    wenn du mir sagst wie ich 80Bytes in ein 80Byte grossen Puffer lade ohne nen lese-fehler zu bekommen werd ich das demnächst so machen

    dann muesste es gehen.



  • Du irrst dich. f'`8k

    Gruß, TGGC (\-/ has leading)



  • TGGC schrieb:

    Du irrst dich. f'`8k

    Gruß, TGGC (\-/ has leading)

    wo?!


  • Mod

    LinkeT schrieb:

    wo?!

    das musst du durch debuggen rausfinden.



  • rapso schrieb:

    LinkeT schrieb:

    wo?!

    das musst du durch debuggen rausfinden.

    sach ma liest hier keine was ich schreibe?

    der fehler liegt (hab ich durchs DEBUGGEN herausgefunden) bei fread !!!!!! oder soll ich mir das disammbley anschauen und sagen hier ist der fehler juhey ...


  • Mod

    LinkeT schrieb:

    rapso schrieb:

    LinkeT schrieb:

    wo?!

    das musst du durch debuggen rausfinden.

    sach ma liest hier keine was ich schreibe?

    der fehler liegt (hab ich durchs DEBUGGEN herausgefunden) bei fread !!!!!! oder soll ich mir das disammbley anschauen und sagen hier ist der fehler juhey ...

    es sieht eher so aus:
    - fread ist fehlerhaft -> chancen gehen gegen 0% dass das so ist
    - fehlerhafte benutzung von filestreams -> chancen stehen gut
    - fehler woanderes -> chance ist 100%-vorherige moeglichkeit.



  • der fehler liegt bei fread

    es ist allerdings verhaeltnismaessig unwahrscheinlich in standard-funktionen die seit 20 jahren im einsatz sind, tatsaechlich noch fehler zu finden...

    dein geschildertes verhalten (codegroesse waechst -> fehler behoben / zusaetzlichen heap-speicher allokiert -> fehler verschoben) deutet auf einen fehler deinerseits hin und der muss nicht unbedingt dort lokalisierbar sein wo er auch auftritt.


  • Mod

    hellihjb schrieb:

    der fehler liegt bei fread

    es ist allerdings verhaeltnismaessig unwahrscheinlich in standard-funktionen die seit 20 jahren im einsatz sind, tatsaechlich noch fehler zu finden...

    dein geschildertes verhalten (codegroesse waechst -> fehler behoben / zusaetzlichen heap-speicher allokiert -> fehler verschoben) deutet auf einen fehler deinerseits hin und der muss nicht unbedingt dort lokalisierbar sein wo er auch auftritt.

    klingt eher nach

    darueber hinaus waere es sinnvoll die datei im binaermodus ("rb", "wb") zu behandeln...

    und

    alles einzeln ... ok wenns den sein muss *grml*

    klingt nach (edit: das es einzeln laeuft mein ich damit)

    - fehlerhafte benutzung von filestreams -> chancen stehen gut

    loesung:

    lese:

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_crt_text_and_binary_mode_file_i.2f.o.asp


Anmelden zum Antworten