Ü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ß