2011-04-28 2 views
0

내가이 구조체가 실패표준 : : 벡터 어설 션 (벡터 반복자는 호환되지 않는)

Assertion failed (vector iterators incompatible)

벡터 생성 코드 :

instInFrustumData.reserve(mNumInstances); 

벡터 갱신 코드 :

void Terrain::updateInstances() 
{ 
    mNumInstancesInFrustum = 0; 

    if(instInFrustumData.size() != 0) 
     instInFrustumData.clear(); 

    mpMxMInstInFrustumB->Map(D3D10_MAP_WRITE_DISCARD, NULL, (void**) &instInFrustumData); 

    for(int x = 0; x < mNumInstances; x++) 
    { 
     if(mpCamera->point2DInFrustum(instData[x].mTransform + 
      D3DXVECTOR2(instData[x].mSpacing/2 + mpCamera->getPosition().x, instData[x].mSpacing/2 + mpCamera->getPosition().z), instData[x].mSpacing/2) 
      != OUTSIDE) 
     { 
      instInFrustumData.push_back(instData[x]); 
      mNumInstancesInFrustum++; 
     } 
    } 

    mpMxMInstInFrustumB->Unmap(); 
} 

무엇이 그렇게 할 수 있습니까?

그리고 내 클래스의 소멸자

내가 여기 추측의 명확한()

+1

게시 된 코드는 게시 할 수 없습니다. – Erik

+0

다른 것을 찾았습니다 : 벡터를 생성 한 후에 크기 = 용량으로 크기를 조정합니다.나는 clear()와 ok를 호출하기 때문에 size = 0 capacity = 100, 그 다음에는 8 개의 값으로 채우고 두 번째 시간에 다시 clear를 호출하면 오류가 발생합니다. –

+0

const 및 non-const 이터레이터를 서로 바꾸어 사용할 수 있습니다. 그러나 실제 코드를 게시하려면 여기에있는 것이이 오류의 원인이 아니기 때문에 게시해야합니다. – AJG85

답변

2

std::vectorhttp://www.cplusplus.com/reference/stl/vector/과 같이 사용하거나 좋은 STL 서적을 구입할 때 참고 자료를 확인하십시오. 당신은 내가 비범 한 방법으로 생각할 몇 가지 방법을 사용하고 있습니다. 벡터 요소가있는 경우

  • 사용 empty() 확인하기
  • 사용 로컬 변수를 범위 (일반 비어 있지는 더 나은 읽는 경우) 경우 (범위에 머물 필요가 없습니다 일해야되지 않음) 가능
  • 사용 STL 반복자 또는 컨테이너 크기 루프에서하는 (필요한 하나 개의 루프에서이 개 증가 정수를 데?)
  • 사용하여 구현을위한 "최고" STL 컨테이너 (당신이 벡터를 원하거나 여기에 매핑 할?)
  • 피를 C 스타일의 캐스트와 객체의 오용 당신은 누구의 정의뿐만 아니라 알 수없는 방법 Map()UnMap() 알 수 여전히 원래의 오류와 관련된 반복자를 사용하여 코드를 표시하지 않은 많은 멤버 변수가

((void**) &instInFrustumData는 아주 나쁜 생각입니다). instData[x]의 사용은 위험하고 문제가 있으며 일반적으로 루프가 구성되는 방식이라고 생각합니다. STL 컨테이너가 아닌 STL 컨테이너를 취급하고 싶지는 않습니다. (void**) &instInFrustumData 같은 것들은 문제를 일으킬 수 있으므로 피해야합니다.

DirectX 나 그래픽 및 게임 엔진을 모두 사용하기 전에 C++을 먼저 배우는 것이 좋습니다.

+0

Map() 및 Unmap() 메서드는 directX ID3D10Buffer 메서드입니다 (thats why 내가 혼란을 일으킬 것이라는 것을 알았 기 때문에이 질문을 처음 썼을 때 전체 코드를 게시하지 않았다. 그래서 캐스트 (void **) 및 instInFrustumData를 수행해야한다. –

+1

좋습니다. 나중에 그리기 위해 쓸 메모리의 매개 변수가 필요할 수 있습니다. 마음에 STL로 설계되지 않은 무언가에 의해 직접 쓰여지는 STL 벡터의 내부를 폭로하는 것은 좋은 생각이 아닙니다. ** 반드시 ** & instInFrustumData.data()를 사용해야하지만 솔직히이 경우 바이트 배열을 사용하여 제어하는 ​​코드에 내 벡터를 채우는 것을 선호합니다. – AJG85

+1

방금 ​​방금 방법을 찾았습니다 ...'Map()'과'Unmap()'은 버퍼의 잠금 메카니즘처럼 보입니다. 'boost :: mutex'와'boost :: mutex :: scoped_lock' 행이나 벡터에 대한 쓰기 접근을 제어하기위한 다른 뮤텍스 기반 잠금을 사용하는 것이 더 좋을 수도 있습니다. 그렇지 않으면'& instInFrustumData.data()'를 대신 사용해보십시오. 실제로는 벡터의 메모리가 할당 된 내부 버퍼의 포인터이기 때문입니다. – AJG85

2

종류를 호출하지만 어쩌면 문제는이 라인 :

mpMxMInstInFrustumB->Map(D3D10_MAP_WRITE_DISCARD, NULL, (void**) &instInFrustumData); 

당신은 벡터에 대한 포인터를 전달하는이 자체적으로이 Map 함수에 적용했는데, 내부 함수 중 일부를 덮어 쓰는 것 같아요? 설명서가 없지만 벡터에 대한 포인터를 기대하는 함수처럼 보이지는 않습니다.

+0

오류가 발생할 수 있는지 확인하려고합니다 : D –