Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    120

    access violation con un array di strutture

    Salve,
    da due giurni mi capita una cosa stranissima col programma che sto facendo (sto mettendo le mani al normalmapper della ati), siccome sono "scarsa" con gli array di strutture ho provato a controllare su libri e siti internet ma mi sembra che il mio codice sia corretto (sottolineo *mi sembra* )
    Allora il mio problema è questo:
    ho una struttura NmRawTriangle
    codice:
    typedef union
    {
       struct { float x, y, z; };
       struct { float v[3]; };
    } NmRawPoint;
      
    typedef union
    {
       struct { float u, v; };
       struct { float uv[2]; };
    } NmRawTexCoord;
    
    typedef struct
    {
       NmRawPoint vert[3];
       NmRawPoint norm[3];
       NmRawTexCoord texCoord[3];
    } NmRawTriangle;
    nel mio main creo un array di NmRawTriangle
    NmRawTriangle* tris;
    e lo passo per riferimento ad una funzione
    NmReadTriangles (fp,numTris, &tris)

    La mia funzione legge tris e lo inizializza, sarà un array di dimensione numTris
    bool
    NmReadTriangles (FILE* fp, int numTris, NmRawTriangle** tris)

    codice:
    (*tris) = new NmRawTriangle [(numTris)];
    	if ((*tris) == NULL)
    	{
    		cerr << "Unable to allocate space for " << (*tris) << " triangles\n";
    		return false;
    	}
    	printf("numtris=%d\n",numTris);
    	for(int i=0;i<numtris;i++){
    		int a,b,c;
    		fscanf(fp,"%d %d %d",&a,&b,&c);
    		
    		printf("%d %d %d %d\n",i,a,b,c);
    		tris[i]=new NmRawTriangle;
                    tris[i]->vert[0].x=vertex[a][0];
    		tris[i]->vert[0].y=vertex[a][1];
    		tris[i]->vert[0].z=vertex[a][2];
    		tris[i]->vert[1].x=vertex[b][0];
    		tris[i]->vert[1].y=vertex[b][1];
    		tris[i]->vert[1].z=vertex[b][2];
    		tris[i]->vert[2].x=vertex[c][0];
    		tris[i]->vert[2].y=vertex[c][1];
    		tris[i]->vert[2].z=vertex[c][2];
    }
    numTris è 1000 se io commento la linea di creazione di tris[i] e le successive la printf che stampa i arriva correttamente a 999.
    Invece con quella linea decommentata il programma arriva a 81.
    Nel dubbio, siccome non ero sicura di usare correttamente la new ho provato anche con la malloc:

    *tris=(NmRawTriangle *)malloc((numtris)*sizeof(NmRawTriangle *));
    tris[i]=(NmRawTriangle *)malloc(sizeof(NmRawTriangle));

    stesso identico problema: se commento tris[i] arriva correttamente a 999, se decommento si ferma a 81.
    Ho provato a debuggare, le assegnazioni sono corrette, i valori dei vertici x y e x sono corretti... quando arriva a 81 esce con una serie lunghissima di

    First-chance exception at 0x0012f3d9 in atioctree.exe: 0xC0000005: Access violation writing location 0x10c000e6

    in cui camba la locazione ed infine:
    Unhandled exception at 0x00031299 in atioctree.exe: 0xC0000005: Access violation writing location 0x10c000e6.
    Sono disperata e non so più dove sbattere la testa ho provato un pò di tutto ma senza risultati.. avete qualche idea?
    Grazie in anticipo!

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    120
    ops, ero convinta di aver messo il tag [c,c++] nel titolo, scusatemi...

  3. #3
    Ciao,
    prova con questo codice:
    codice:
    (*tris) = new NmRawTriangle [(numTris)];
    	if ((*tris) == NULL)
    	{
    		cerr << "Unable to allocate space for " << (*tris) << " triangles\n";
    		return false;
    	}
    	printf("numtris=%d\n",numTris);
            NmRawTriangle *tmp_tris = (*tris); // Ora tmp_tris è in effetti l'array
    	for(int i=0;i<numtris;i++){
    		int a,b,c;
    		fscanf(fp,"%d %d %d",&a,&b,&c);
    		
    		printf("%d %d %d %d\n",i,a,b,c);
    		//tris[i]=new NmRawTriangle; sbagliato
                    tmp_tris->vert[0].x=vertex[a][0];
    		tmp_tris->vert[0].y=vertex[a][1];
    		tmp_tris->vert[0].z=vertex[a][2];
    		tmp_tris->vert[1].x=vertex[b][0];
    		tmp_tris->vert[1].y=vertex[b][1];
    		tmp_tris->vert[1].z=vertex[b][2];
    		tmp_tris->vert[2].x=vertex[c][0];
    		tmp_tris->vert[2].y=vertex[c][1];
    		tmp_tris->vert[2].z=vertex[c][2];
                    tmp_tris++; // Punto al successivo triangolo nell'array.
    }
    La riga (*tris) = new NmRawTriangle [(numTris)]; già crea numTris triangoli...non è necessario creare un triangolo per ogni nuovo elemento. Forse ti sei confusa perchè tris è un doppio
    puntatore (necessario per allocare l'array internamente alla funzione e poi passarlo al chiamante) e quindi non puoi usare tris[i] ma devi prima dereferenziare tris per ottenere l'effettivo array di triangoli che ha allocato con la new.
    Comunque ricordati che la memoria la devi liberare dopo che l'hai usata.

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2006
    Messaggi
    120
    funziona alla perfezione grazie mille!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.