私は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にします。
コンパイル中のクラッシュはコンパイラのバグです。あなたが 'CreateParticleForGroup'の呼び出しの上に' positionOnEdge + = stride'行を移動するとどうなりますか? – 1201ProgramAlarm
残念ながらそれを動かしていただきありがとうございます。同じ問題が発生します。私はそれがLinuxでうまく動作するので、おそらくコンパイラのバグであると考えました。しかし、私は誰かがいくつかの問題を抱えていることを期待していました。そのような基本操作なので、その行だけが問題を引き起こすのは本当に奇妙なようです。 – Ben
好奇心のためだけ。 'b2Vec2 p = edge.m_vertex1 +(positionOnEdge * d)/ edgeLength;に行を変更してください。 – Loreto