 |
JLI Spieleprogrammierung
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Chewie Super JLI'ler
Anmeldedatum: 17.07.2003 Beiträge: 382
Medaillen: Keine
|
Verfasst am: 19.07.2004, 18:07 Titel: Stack Overflow |
|
|
ich hab folgende funktion, die überprüft, ob eine linie die dreiecke in einem vector schneidet. findet eine kollision statt, wird die funktion rekursiv aufgerufen. funktioniert auch ganz gut, nur sobald ich mehr als 2 kollisionen habe, bekomm ich einen stack overflow. der debugger steht dann bei:
Code: |
reference operator[](size_type _P)
{return (*(begin() + _P)); }
|
ich nehme also an, das ich den vector ungültig indiziere, nur frag ich mich wo...
hier die funktion:
Code: |
bool CBoard::MainCollision(D3DXVECTOR3* pvPos, D3DXVECTOR3 vOldPos)
{
D3DXVECTOR3 vPos, vTemp, vPlaneNorm;
D3DXPLANE plane, planeE;
float fDistO, fDistN, fDist1, fDist2, fDist3;
bool bColl = false;
vPos = *pvPos;
for (int i=0; i < m_iCNumVerts; i+=3)
{
D3DXPlaneFromPoints(&plane, &m_vCollVerts[i], &m_vCollVerts[i+1], &m_vCollVerts[i+2]);
fDistO = D3DXPlaneDotCoord(&plane, &vOldPos);
fDistN = D3DXPlaneDotCoord(&plane, &vPos);
// linie schneidet ebene
if ((fDistO >= 0.3f) && (fDistN < 0.3f))
{
vPlaneNorm = D3DXVECTOR3(plane.a, plane.b, plane.c);
D3DXVec3Normalize(&vPlaneNorm, &vPlaneNorm);
// die seitenebenen
vTemp = m_vCollVerts[i] - vPlaneNorm;
D3DXPlaneFromPoints(&planeE, &vTemp, &m_vCollVerts[i], &m_vCollVerts[i+1]);
fDist1 = D3DXPlaneDotCoord(&planeE, &vPos);
vTemp = m_vCollVerts[i+1] - vPlaneNorm;
D3DXPlaneFromPoints(&planeE, &vTemp, &m_vCollVerts[i+1], &m_vCollVerts[i+2]);
fDist2 = D3DXPlaneDotCoord(&planeE, &vPos);
vTemp = m_vCollVerts[i+2] - vPlaneNorm;
D3DXPlaneFromPoints(&planeE, &vTemp, &m_vCollVerts[i+2], &m_vCollVerts[i]);
fDist3 = D3DXPlaneDotCoord(&planeE, &vPos);
// vor allen ebenen
if ((fDist1 >= -0.3f) && (fDist2 >= -0.3f) && (fDist3 >= -0.3f))
{
vPos = vPos + (vPlaneNorm * (0.3f - fDistN));
bColl = true;
break;
}
}
}
// rekursiv
if (bColl)
{
MainCollision(&vPos, vOldPos);
*pvPos = vPos;
return true;
}
return false;
}
|
|
|
Nach oben |
|
 |
Kampfhund Super JLI'ler
Alter: 42 Anmeldedatum: 20.07.2002 Beiträge: 408
Medaillen: Keine
|
Verfasst am: 19.07.2004, 18:40 Titel: |
|
|
Ein Stack Overflow kann durch eine Endlosrekursion entstehen.
Könnte also gut sein, dass hier eine Endlosrekursion zustande kommt. _________________ Kochen ist ein NP-schweres Optimierungsproblem. |
|
Nach oben |
|
 |
Chewie Super JLI'ler
Anmeldedatum: 17.07.2003 Beiträge: 382
Medaillen: Keine
|
Verfasst am: 20.07.2004, 00:17 Titel: |
|
|
hmm...sollte eigentlich nicht zustande kommen, da bei einer kollision die positionen gleich angepaßt werden. aber ich werd mal versuchen das zu checken, weil eine falsche indizierung kann ich nicht vorstellen. |
|
Nach oben |
|
 |
Hazel JLI MVP


Alter: 40 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 20.07.2004, 10:12 Titel: |
|
|
Es braucht nicht unbedingt eine Endlosrekursion für einen Stack Overflow und nichtmal unbedingt eine Rekursion. ;)
Chewie: Am besten du schreibst alle Funktionsaufrufe in eine Datei. Anders lässt sich eine Rekursion nur schwer analysieren. _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 41 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 20.07.2004, 13:02 Titel: |
|
|
Welchen Wert beherbergt m_iCNumVerts ? _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
 |
Chewie Super JLI'ler
Anmeldedatum: 17.07.2003 Beiträge: 382
Medaillen: Keine
|
Verfasst am: 20.07.2004, 19:48 Titel: |
|
|
danke für eure bemühungen.
mir is generell schon klar, was ein stack overflow ist, was mich stutzig gemacht hat war, dass der debugger beim operator [] vom vector stehengeblieben ist.
seis drum, es war eine endlosrekursion, wahrscheinlich durch einen rundungsfehler bei floats. ich hab den punkt bei einer kollision um 0.3 vor das poly gesetzt, beim nächsten durchlauf wars aber wieder < 0.3.
die funktionsaufrufe in eine datei schreiben, ist aber eine gute idee, merk ich mir fürs nächste mal.
zur vollständigkeit: m_iCNumVerts ist die anzahl der vertizen, da könnte auch m_vCollVerts.size() stehen. |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
Powered by phpBB © 2001, 2005 phpBB Group Deutsche Übersetzung von phpBB.de
|