я обнаружил, что мое приложение падает с нулевым опорным исключением прямо здесь, в sweep.c в исходном коде GLU:Зачем GLU рушится на этом месте?
static void ConnectLeftVertex(GLUtesselator *tess, GLUvertex *vEvent)
/*
* Purpose: connect a "left" vertex (one where both edges go right)
* to the processed portion of the mesh. Let R be the active region
* containing vEvent, and let U and L be the upper and lower edge
* chains of R. There are two possibilities:
*
* - the normal case: split R into two regions, by connecting vEvent to
* the rightmost vertex of U or L lying to the left of the sweep line
*
* - the degenerate case: if vEvent is close enough to U or L, we
* merge vEvent into that edge chain. The subcases are:
* - merging with the rightmost vertex of U or L
* - merging with the active edge of U or L
* - merging with an already-processed portion of U or L
*/
{
ActiveRegion *regUp, *regLo, *reg;
GLUhalfEdge *eUp, *eLo, *eNew;
ActiveRegion tmp;
/* assert(vEvent->anEdge->Onext->Onext == vEvent->anEdge); */
/* Get a pointer to the active region containing vEvent */
tmp.eUp = vEvent->anEdge->Sym;
/* __GL_DICTLISTKEY */ /* __gl_dictListSearch */
regUp = (ActiveRegion *)dictKey(dictSearch(tess->dict, &tmp));
regLo = RegionBelow(regUp);
eUp = regUp->eUp;
eLo = regLo->eUp; //CRASHES RIGHT HERE SINCE RegLo is = 0x000000 FOR SOME REASON
/* Try merging with U or L first */
if(EdgeSign(eUp->Dst, vEvent, eUp->Org) == 0) {
ConnectLeftDegenerate(tess, regUp, vEvent);
return;
}
/* Connect vEvent to rightmost processed vertex of either chain.
* e->Dst is the vertex that we will connect to vEvent.
*/
reg = VertLeq(eLo->Dst, eUp->Dst) ? regUp : regLo;
if(regUp->inside || reg->fixUpperEdge) {
if(reg == regUp) {
eNew = __gl_meshConnect(vEvent->anEdge->Sym, eUp->Lnext);
if (eNew == NULL) longjmp(tess->env,1);
} else {
GLUhalfEdge *tempHalfEdge= __gl_meshConnect(eLo->Dnext, vEvent->anEdge);
if (tempHalfEdge == NULL) longjmp(tess->env,1);
eNew = tempHalfEdge->Sym;
}
if(reg->fixUpperEdge) {
if (!FixUpperEdge(reg, eNew)) longjmp(tess->env,1);
} else {
ComputeWinding(tess, AddRegionBelow(tess, regUp, eNew));
}
SweepEvent(tess, vEvent);
} else {
/* The new vertex is in a region which does not belong to the polygon.
* We don''t need to connect this vertex to the rest of the mesh.
*/
AddRightEdges(tess, regUp, vEvent->anEdge, vEvent->anEdge, NULL, TRUE);
}
}
Кажется, что eRegLo является указателем NULL, иногда что вызывает мое приложение к сбою. Как я могу изменить источник, чтобы предотвратить его сбой приложения?
Благодаря
Может быть, 'RegionBelow()' возвращает 'null' при ошибке? – Bobby