2010-08-02 5 views
0

я обнаружил, что мое приложение падает с нулевым опорным исключением прямо здесь, в 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, иногда что вызывает мое приложение к сбою. Как я могу изменить источник, чтобы предотвратить его сбой приложения?

Благодаря

+0

Может быть, 'RegionBelow()' возвращает 'null' при ошибке? – Bobby

ответ

1

Вы должны смотреть в источник для RegionBelow и посмотреть, если и когда он может возвращать NULL указатель. Между вашим звонком до RegionBelow и вашим де-ссылкой regLo, выполните проверку regLo == NULL. Вы можете сделать это с помощью assert или путем исключения исключения (на C++). Скорее всего, если RegionBelow может вернуть NULL при ошибке, будет использоваться другой метод, который вы можете использовать для определения того, что такое ошибка и как ее обрабатывать. Вам нужно будет ознакомиться с исходным кодом или документацией для RegionBelow, чтобы найти эту информацию.

 Смежные вопросы

  • Нет связанных вопросов^_^