2016-09-07 3 views
1

私はGoogleの液体の楽しいライブラリを構築しようとしていますが、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;私はそれが正常にコンパイルされることをコメントしているが、明らかに実行中に無限ループを作成する場合、問題の原因となっているものです。私は、なぜそれが行をpositionOnEdge + = 0.0fに変更するだけであっても、誤ってsegフォールトを引き起こすのではないかと思っています。それをsegfaultにします。

+0

コンパイル中のクラッシュはコンパイラのバグです。あなたが 'CreateParticleForGroup'の呼び出しの上に' positionOnEdge + = stride'行を移動するとどうなりますか? – 1201ProgramAlarm

+0

残念ながらそれを動かしていただきありがとうございます。同じ問題が発生します。私はそれがLinuxでうまく動作するので、おそらくコンパイラのバグであると考えました。しかし、私は誰かがいくつかの問題を抱えていることを期待していました。そのような基本操作なので、その行だけが問題を引き起こすのは本当に奇妙なようです。 – Ben

+0

好奇心のためだけ。 'b2Vec2 p = edge.m_vertex1 +(positionOnEdge * d)/ edgeLength;に行を変更してください。 – Loreto

答えて

0

おめでとうございます:あなたのコンパイラにバグが見つかりました。あなたのソースコードが何を含んでいても、コンパイラはsegfault自体でクラッシュするべきではありません。

このバグを正式に報告する以外に、実行できることはほとんどありません。あなたはコンパイラがバグを回避しようとするためにどのような手間をかけるのかを正確に突き止めてみることができますが、これはせいぜい推測ゲームに過ぎません。あなたはあなたがコンパイルクラッシュを分離しまし主張

positionOnEdge += stride; 

は、何らかの形または方法で、コードを変更してみてください。たぶん "positionOnEdge = positionOnEdge + stride;"コンパイラにとって魅力的です。たぶんそれをいくつかの外部関数への関数呼び出しで置き換え、参照によって両方の変数を渡し、いくつかの外部関数で加算を実行することは、そのトリックを行います。

もちろん、最新のコンパイラが最新であることを常に確認できます。もしそうでなければ、あなたのコンパイラの現在のバージョンがすでにバグを修正したことをアップグレードし、願ってください。

+0

私はpositionOnEdge = positionOnEdge + strideに変更しようとしました。しかしそれは何も変わらなかった。私は良い考えである外部機能のアイデアを試してみます。 – Ben

+0

残念ながら、外部機能の試みはまだ機能しませんでした。また、関数がfloat32を返し、変数を値渡ししてからpositionOnEdgeを戻り値に設定することも試みました。私は、positionOnEdgeが更新されているどこでもsegフォールトが確実に発生することを知りました。 – Ben

関連する問題