Ik zit me hier helemaal kapot te zweten op een fijne SIGBUS, waar ik geen touw aan weet te knopen omdat de GDB output zichzelf compleet tegenspreekt.
matrices is een vector ala <Matrix*>, en in de rest van de for loop worden de matrices niet gewijzigd (alleen maar uitgelezen). De app wordt op het moment geinitialiseerd met drie matrices, zodat ik zeker weet dat er echt drie zijn (vandaar de first/second/last, dit om even in GDB de locaties te kunnen zien). Deze verwijzen allemaal naar hetzelfde Model, dus deze moet hetzelfde blijven gedurende de loop.
Welnu, als ik i=1 doe, en dus 1 & 2 benader, loopt alles goed af, as in:
matrix[1] = secondMatrix, Model* verwijst naar het model, matrix[2] = lastMatrix, Model* verwijst nog steeds naar het model.
Alleen als ik i=0 doe (en dus de eerste matrix benader) gebeurd er het volgende:
matrix[0] = firstMatrix, Model* is het model, dan matrix[1] = secondMatrix, en veranderd Model* in 0x1.
Als ik dan het volgende doe:
Zie ik secondModel ook naar 0x1 springen (van het correcte adres) het moment dat de for voor de tweede keer wordt uitgevoerd. Indien ik de for begin met i=1 gebeurd dit niet.
Het enige wat ik me kan bedenken is dat er ergens toch iets gewijzigd wordt aan de matrices in de andere classes, maar ten eerste zijn er geen functies die iets wijzigen, en ten tweede roep ik niet eens functies aan van andere classes in de for.
Het andere wat me binnen schiet is dat ik 0 || 1 wegschrijf in 'visible', vandaar dat ik die init code ook even heb geinclude. Als ik dat stuk comment werkt het namelijk wel, dus ik heb het idee dat ik gewoon over m'n geheugen zit weg te schrijven ipv m'n eigenlijke visible array. Maar ik zie daar niks fout in?
Heeft iemand suggesties wat ik moet controleren om de fout te vinden? Ik ben compleet clueless.
Edit: Ik bedenk me net dat m'n topic titel redelijk vaag is. Als een mod een betere omschrijving weet mijn dank hiervoor Complete stickie is hiervoor. Oops, even gemist. "[C++] Dynamisch geallocceerde array wijst naar bestaand object?" misschien?
Edit2: Even als followup: Wanneer ik de volgende regel in m'n code plant;
Dan zie ik dat dit naar hetzelfde adres verwijst als m'n tweede matrix indien i=0. Vaagheid
Oh en nog even hoe alles gedeclareerd is;
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
| // Init code for visible & lights (in case new matrices are created after last call) if(numObjects < (int) matrices.size()) { for(i = 0; i < numObjects; i++) { delete visible[i]; delete lights[i]; } if(visible != NULL) delete visible; if(lights != NULL) delete lights; numObjects = matrices.size(); visible = new int*[numObjects]; lights = new GLfloat*[numObjects]; for(i = 0; i < numObjects; i++) { visible[i] = new int[matrices[i]->model->triangles->numTriangles]; lights[i] = new GLfloat[4]; } } // Fills lights array with translated values (light relative to object) light->translateLight(matrices, lights); // Walk through planes, see if they're lit or not for(i = 1; i < matrices.size(); i++) { Matrix *firstMatrix = matrices[0]; Matrix *secondMatrix = matrices[1]; Matrix *lastMatrix = matrices[2]; Matrix *curMatrix = matrices[i]; Model *curModel = curMatrix->model; for(j = 0; j < curModel->triangles->numTriangles; j++) { // normal calc is fixed to the cube model, temp for debugging GLfloat *cur_nor = curModel->normals->normals + (j / 2)*3; GLfloat cur_pla = curModel->shadowModel->planeDistances[j]; GLfloat side = cur_nor[0] * lights[i][0] + cur_nor[1] * lights[i][1] + cur_nor[2] * lights[i][2] + cur_pla * lights[i][3]; if(side > 0) visible[i][j] = 1; else visible[i][j] = 0; } } |
matrices is een vector ala <Matrix*>, en in de rest van de for loop worden de matrices niet gewijzigd (alleen maar uitgelezen). De app wordt op het moment geinitialiseerd met drie matrices, zodat ik zeker weet dat er echt drie zijn (vandaar de first/second/last, dit om even in GDB de locaties te kunnen zien). Deze verwijzen allemaal naar hetzelfde Model, dus deze moet hetzelfde blijven gedurende de loop.
Welnu, als ik i=1 doe, en dus 1 & 2 benader, loopt alles goed af, as in:
matrix[1] = secondMatrix, Model* verwijst naar het model, matrix[2] = lastMatrix, Model* verwijst nog steeds naar het model.
Alleen als ik i=0 doe (en dus de eerste matrix benader) gebeurd er het volgende:
matrix[0] = firstMatrix, Model* is het model, dan matrix[1] = secondMatrix, en veranderd Model* in 0x1.
Als ik dan het volgende doe:
C++:
1
2
3
4
5
6
7
8
9
10
| for(i = 0; i < numObjects; i++) { Matrix *firstMatrix = matrices[0]; Model *firstModel = matrices[0]->model; Matrix *secondMatrix = matrices[1]; Model *secondModel = matrices[1]->model; Matrix *lastMatrix = matrices[2]; Model *lastModel = matrices[2]->model; Matrix *curMatrix = matrices[i]; ... |
Zie ik secondModel ook naar 0x1 springen (van het correcte adres) het moment dat de for voor de tweede keer wordt uitgevoerd. Indien ik de for begin met i=1 gebeurd dit niet.
Het enige wat ik me kan bedenken is dat er ergens toch iets gewijzigd wordt aan de matrices in de andere classes, maar ten eerste zijn er geen functies die iets wijzigen, en ten tweede roep ik niet eens functies aan van andere classes in de for.
Het andere wat me binnen schiet is dat ik 0 || 1 wegschrijf in 'visible', vandaar dat ik die init code ook even heb geinclude. Als ik dat stuk comment werkt het namelijk wel, dus ik heb het idee dat ik gewoon over m'n geheugen zit weg te schrijven ipv m'n eigenlijke visible array. Maar ik zie daar niks fout in?
Heeft iemand suggesties wat ik moet controleren om de fout te vinden? Ik ben compleet clueless.
Edit: Ik bedenk me net dat m'n topic titel redelijk vaag is. Als een mod een betere omschrijving weet mijn dank hiervoor Complete stickie is hiervoor. Oops, even gemist. "[C++] Dynamisch geallocceerde array wijst naar bestaand object?" misschien?
Edit2: Even als followup: Wanneer ik de volgende regel in m'n code plant;
C++:
1
| int *foo = visible[i]; |
Dan zie ik dat dit naar hetzelfde adres verwijst als m'n tweede matrix indien i=0. Vaagheid
Oh en nog even hoe alles gedeclareerd is;
C++:
1
2
3
4
5
6
7
8
9
10
| class Shadow { public: int **visible; GLfloat **lights; int numObjects; Shadow(void) { visible = NULL; numObjects = 0; } void calcShadow(Light *light, std::vector<Matrix*> matrices); void drawShadow(Light *light, std::vector<Matrix*> matrices); }; |
[ Voor 20% gewijzigd door wacco op 26-07-2006 18:08 ]