2016-09-07 4 views
1

나는 Google의 액체 재미있는 라이브러리를 만들려고 노력하고 있지만, mingw를 사용하는 Windows에서는 약간의 문제가 발생합니다. 이 방법에서는 컴파일이 실패합니다.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; 라인은 성공적으로 컴파일 될 것이라고 말하면 문제가 발생하지만, 실행하면 무한 루프가 발생합니다. 나는 왜 그것이 단지 mingw에서 seg fault를 일으키는 지에 대한 아이디어를 잃어 버렸다. positionOnEdge + = 0.0f로 라인을 변경한다. 그것이 segfault하게 만든다.

+0

컴파일 중의 크래쉬는 컴파일러의 버그입니다. 'positionParticleForGroup'에 대한 호출 위에'positionOnEdge + = stride' 행을 이동하면 어떻게됩니까? – 1201ProgramAlarm

+0

불행히도 그것을 움직이는 아이디어를 주셔서 감사합니다 같은 문제가 발생합니다. 나는 그것이 리눅스에서 잘 작동하기 때문에 컴파일러 버그 일 가능성이 높다고 생각했다. 하지만 누군가가 어떤 일을 할 수 있기를 바랬습니다. 그런 기본적인 작업이기 때문에 그 라인 만이 문제를 일으킨다는 것은 나에게 정말로 이상하게 보인다. – 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