2016-09-07 119 views
1

我試圖建立谷歌的液體樂趣圖書館,但在使用mingw的窗戶上我得到了一個seg故障,我有點難住。編譯失敗的方法在mingw中編譯段錯誤,但在linux上不是gcc。

void b2ParticleSystem::CreateParticlesStrokeShapeForGroup(
    const b2Shape *shape, 
    const b2ParticleGroupDef& groupDef, const b2Transform& xf) 
{ 
    float32 stride = groupDef.stride; 
    if (stride == 0) 
    { 
     stride = GetParticleStride(); 
    } 
    float32 positionOnEdge = 0; 
    int32 childCount = shape->GetChildCount(); 
    for (int32 childIndex = 0; childIndex < childCount; childIndex++) 
    { 
     b2EdgeShape edge; 
     if (shape->GetType() == b2Shape::e_edge) 
     { 
      edge = *(b2EdgeShape*) shape; 
     } 
     else 
     { 
      b2Assert(shape->GetType() == b2Shape::e_chain); 
      ((b2ChainShape*) shape)->GetChildEdge(&edge, childIndex); 
     } 
     b2Vec2 d = edge.m_vertex2 - edge.m_vertex1; 
     float32 edgeLength = d.Length(); 
     while (positionOnEdge < edgeLength) 
     { 
      b2Vec2 p = edge.m_vertex1 + positionOnEdge/edgeLength * d; 
      CreateParticleForGroup(groupDef, xf, p); 
      positionOnEdge += stride; 
     } 
     positionOnEdge -= edgeLength; 
    } 
} 

postionOnEdge + = stride;如果我發表評論說它會成功編譯,那麼會導致問題,但顯然會在運行時創建無限循環。對於爲什麼它只會在明行中導致seg故障,甚至將行更改爲positionOnEdge + = 0.0f,我都有點想法。導致它出現段錯誤。

+0

編譯期間的任何崩潰都是一個編譯器錯誤。如果您將調用上方的'positionOnEdge + = stride'行移至'CreateParticleForGroup',會發生什麼情況? – 1201ProgramAlarm

+0

感謝這個想法,不幸的是將它移動出來導致同樣的問題。我認爲這很可能是一個編譯器bug,因爲它在linux上可以正常工作。但我希望有人可以有一些工作。對我來說,看起來很奇怪,只有那條線導致了一個問題,因爲這是一個基本的操作。 – Ben

+0

只是爲了好奇;將該行更改爲'b2Vec2 p = edge.m_vertex1 +(positionOnEdge * d)/ edgeLength;' – Loreto

回答

0

恭喜您:您在編譯器中發現了一個錯誤。無論您的源代碼包含什麼,編譯器都不應該與segfault本身崩潰。

除了正式報告這個bug之外,幾乎沒有什麼可以做的。你可以試着弄清究竟是什麼讓編譯器脫離軌道,試圖繞過bug,但這最好是一個猜測遊戲。

你聲稱你隔絕編譯崩盤:

positionOnEdge += stride; 

嘗試改變代碼,以某種形式或時尚。也許「positionOnEdge = positionOnEdge + stride;」對編譯器來說是可口的。也許用一個函數調用一些外部函數替代它,通過引用傳遞這兩個變量,並在一些外部函數中執行加法,就可以實現。

而且,當然,您可以隨時檢查是否有最新版本的編譯器。如果沒有,升級,並希望你的編譯器的當前版本已經修復了這個bug。

+0

我試過對positionOnEdge = positionOnEdge + stride進行更改;但那並沒有改變任何東西。我會嘗試外部功能的想法,這是一個很好的想法。 – Ben

+0

不幸的是,外部函數嘗試仍然無法正常工作。我也嘗試讓函數返回一個float32,並且只是通過值傳遞變量,然後將positionOnEdge設置爲返回值。我確實知道,無論positionOnEdge正在更新哪裏,seg故障都會發生。 – Ben