부스트 sparse_matrix의 액세스 요소는 프로그램을 중단하는 것으로 보입니다

StackOverflow https://stackoverflow.com/questions/1314821

  •  19-09-2019
  •  | 
  •  

문제

더 많은 경험 프로그래머가 통찰력을 가질 수 있기를 바라는 이상한 버그가 있습니다. 부스트 UBLAS 스파 스 스파 스 매트릭스, 특히 MAPPED_MATRIX를 사용하고 있으며, 결국에는 프로그램의 초기 단계에서는 그렇지 않은 간헐적 버그가 있습니다. 이것은 큰 프로그램이므로 모든 코드를 게시 할 수는 없지만 핵심 아이디어는 특정 클래스에 속하는 함수를 호출한다는 것입니다.

bool MyClass::get_cell(unsigned int i, unsigned int j) const
{
    return c(i,j);
}

변수 C는 클래스의 구성원으로 정의됩니다.

boost::numeric::ublas::mapped_matrix<bool> c;

버그가 발생하면 프로그램이 중지되는 것처럼 보이지만 (충돌하지는 않습니다). Eclipse로 디버깅을하면 프로그램이 Boost Mapped_Matrix 코드에 들어가서 std :: map, std :: _ rb_tree 및 std :: Less로 여러 레벨을 계속 유지한다는 것을 알 수 있습니다. 또한이 프로그램은 때때로 std :: map, std :: _ rb_tree 및 std :: _ Select1st로 추적됩니다. 코드가 실행되고 활성 선이 _rb_tree의 메모리 변경 사항이 변경되는 동안 실행은 STD :: MAP 수준에서 결코 반환되지 않는 것 같습니다. STD :: MAP의 라인은 프로그램이 다음과 같은 기능을 반환하는 것입니다.

const_iterator
find(const key_type& __x) const
{ return _M_t.find(__x); }

C 행렬에는 프로그램이 찾고있는 요소가있는 것 같습니다. 그러나 어떻게 든 기본 저장 메커니즘은 "잘못 배치되었습니다". 그러나 왜 또는 어떻게 고치는 지 잘 모르겠습니다. 그것은 또한 완전히 기지에서 벗어날 수 있습니다.

당신이 제공 할 수있는 모든 도움은 대단히 감사 할 것입니다. 이 질문에 올바른 정보를 포함시키지 않은 경우 누락 된 내용을 알려주십시오. 고맙습니다.

도움이 되었습니까?

해결책

코드를 디버깅하려고 시도하는 것들 (반드시 영구적 인 변경은 아닙니다) :

  • 변경 bool an int 매트릭스 유형에서 c, 매트릭스가 숫자 유형을 기대하는지 확인합니다.
  • 유사한 인터페이스, 아마도 평범한 오래된 인터페이스로 매트릭스 유형을 다른 행렬 유형으로 변경하십시오. matrix.
  • Valgrind 앱 (Linux에있는 경우)을 확인하여 메모리를 손상시키지 않습니다.

그것이 실패하면 전화를 시도 할 수 있습니다 get_cell 매트릭스를 수정하여 문제가 발생할 수있는 원인을 확인할 때마다.

실패하면 문제를 여기에 게시 할 수있는 훨씬 작은 코드의 하위 집합으로 줄여야 할 수도 있습니다.

어떤 컴파일러와 OS를 사용하고 있는지 알려 주면 도움이 될 수 있습니다.

다른 팁

이 부분은 멀티 스레드 프로그램의 일부입니까?

나는 보통 STL에서 문제를 볼 때 동기화되지 않은 액세스에 문제가되기 때문에 묻습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top