*jiriki*: C++: Corruption of heap error bei fclose()

Beitrag lesen

Über das fclose kommt er jetzt drüber hinweg. Kann mich nicht dran erinnern, was ich eigentlich geändert hab, aber das klappt jetzt. Wo es jetzt hakt, ist, wenn er die eingelesenen Faces wieder zur Berechnung derer Normalen aufrufen möchte.

Was ich jetzt beim Testen herausgefunden hab: Ich kann komischerweise nicht mehr als 468 caras/faces (im folgenden caras) abspeichern. Unabhängig von der Anzahl der eingelesenen caras bzw. numcara bzw. des abhängig von numcara allocierten Speichers. Ich hab gemerkt, dass wenn ich mehr als 468 caras einlese, die Index-Werte der Vertices der einzelnen caras nach dem ersten cara[0] (also ab cara[1]) auf ziemlich willkürliche Werte verweisen. Wenn ich den allokierten Speicherbereich verdopple, tut sich da leider nichts.

Der zugehörige Code ist:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++

  
// Calculating the normals  
for (i=0; i< objektuptr->numcaras; i++) {  
  
  bektorea3 v1, v2; // Vektoren  
  
  // Reading out values of vertices  
  i0 = objektuptr->tablacaras[i].tablaindvert[0];  
  i1 = objektuptr->tablacaras[i].tablaindvert[1];  
  i2 = objektuptr->tablacaras[i].tablaindvert[2];  
  
  // Calculating two vectors out of three vertices  
  v1.x= objektuptr->tablavert[i0].koord.x - objektuptr->tablavert[i1].koord.x ;  
  v1.y= objektuptr->tablavert[i0].koord.y - objektuptr->tablavert[i1].koord.y ;  
  v1.z= objektuptr->tablavert[i0].koord.z - objektuptr->tablavert[i1].koord.z ;  
  v2.x= objektuptr->tablavert[i1].koord.x - objektuptr->tablavert[i2].koord.x ;  
  v2.y= objektuptr->tablavert[i1].koord.y - objektuptr->tablavert[i2].koord.y ;  
  v2.z= objektuptr->tablavert[i1].koord.z - objektuptr->tablavert[i2].koord.z ;  
  
// Calculating the vectors out of two vectors  
// Cross product  
...  
}  

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Wenn das Modell also mehr als 468 caras hat, kommen ab i=1 Fabelwerte für i0 bis i2 heraus, und beim entsprechenden tablavert[i0] bricht das Programm mit der Fehlermeldung ab, dass es die angegebene Adresse verständlicherweise nicht finden kann.

Hallo,

for (i=0;i<numvert;i++) {
  tablavert[i].zenbataurpegitan=0;
..
}


> zu prüfen wäre, ob für `tablavert`{:.language-c}   numvert Records allociert sind und `k<numvert`{:.language-c} bleibt.  
  
Ja, der zugehörige Code sieht so aus:  
  
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  
~~~c
  
tablavert=(vertice *)malloc(numvert*sizeof(vertice));  
tablacaras=(cara *)malloc(numcaras*sizeof(cara));  
tablanormales= (puntua3 *)malloc(numcaras*sizeof(puntua3));  
tablatexturas = (puntua2 *)malloc(numtext*sizeof(puntua2));  

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

wobei vertice,cara,puntua3 und puntua2 in der Header-File definierte Strukte sind:

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

  
typedef struct {  
  double x,y;  
} puntua2;  
  
typedef struct {  
  double x,y,z;  
} puntua3;  
  
typedef struct {  
  puntua3 koord; // Koordinaten  
  int zenbataurpegitan; // Anzahl Caras  
  bektorea3 normala; // Normale  
} vertice;  
  
typedef struct {  
  int numvert; // Anzahl der Vertices  
  int *tablaindvert; // Index der zugehörigen Vertices  
  int *tablaindtext; // Index der zugehörigen Texturkoordinaten  
} cara;  

im folgenden wird nicht geprüft, ob  m oder j den zulässigen Bereich überschreiten. Die Logik kann man anhand dieser Codeschnipsel nicht erkennen. Müsstest also noch suchen wieviel Speicher für tablatexturas und tablacaras allociert ist.

Ich habe oben den Link zum ganzen Code gepackt: zur wavefront.pdf.

Gruß plan_B

Danke und Gruß