JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.phpMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Stack Overflow

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Chewie
Super JLI'ler



Anmeldedatum: 17.07.2003
Beiträge: 382

Medaillen: Keine

BeitragVerfasst am: 19.07.2004, 18:07    Titel: Stack Overflow Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Kampfhund
Super JLI'ler


Alter: 42
Anmeldedatum: 20.07.2002
Beiträge: 408

Medaillen: Keine

BeitragVerfasst am: 19.07.2004, 18:40    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Chewie
Super JLI'ler



Anmeldedatum: 17.07.2003
Beiträge: 382

Medaillen: Keine

BeitragVerfasst am: 20.07.2004, 00:17    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Hazel
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 20.07.2004, 10:12    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Fallen
JLI MVP
JLI MVP


Alter: 41
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 20.07.2004, 13:02    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Chewie
Super JLI'ler



Anmeldedatum: 17.07.2003
Beiträge: 382

Medaillen: Keine

BeitragVerfasst am: 20.07.2004, 19:48    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
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

Impressum