2014-12-30 6 views
0

렌더링 기능을 사용하기 위해 객체를 목록 (또는 벡터)에 동적으로 추가 할 수 있어야하는 DirectX 프로그램을 만듭니다. "[]"연산자를 통해 이러한 객체에 액세스 할 수 있어야하므로 목록 대신 벡터가 사용됩니다. 문제는 push_back을 사용하여 객체를 추가 할 때 객체를 두 번 저장한다는 것입니다. 예를 들어; 벡터가 비어 있고 첫 번째 객체를 추가하면 해당 객체가 색인 0과 색인 1에 저장됩니다.이 객체는 모든 객체를 순환하여 렌더링해야하는 내 렌더링 함수에 문제를 만듭니다. 결과적으로 각 객체가 두 번 렌더링됩니다. CPP에있는 객체를 통해 루프C++ vector.push_back은 한 번 객체를 추가 할 때 객체를 두 번 추가합니다. * 해결 된 내용 *

bool Level1::LoadContent()//funtion in the Level1 class 
{ 
    Sprite1 Sprite_1({0.0f, 0.0f, 3.0f});//Define Sprite Object 
    SpriteList2.push_back(Sprite_1);//Add Sprite Object to Vector 

    Sprite1 Sprite_2({ 100.0f, 00.0f, 2.0f });//Define Sprite Object 
    SpriteList2.push_back(Sprite_2);//Add Sprite Object to Vector 

    Sprite1 Sprite_3({ 100.0f, -50.0f, 1.0f });//Define Sprite Object 
    SpriteList2.push_back(Sprite_3);//Add Sprite Object to Vector 
    return true; 
} 

코드 : CPP 파일에있는 개체를 추가 할 수

class Level1 : public Dx11DemoBase// Define Level1 Class 
{ 
public: 
    vector<Sprite1> SpriteList2;//Define Vector 
}; 

코드 : 헤더 파일에있는 벡터 (SpriteList2)를 정의

코드 파일 :

void Level1::Render()//funtion in the Level1 class 
{ 
    for (Sprite1 sprite : SpriteList2)//Loop through Vector 
    { 
     //Code to use the "sprite" object in rendering functions 
     worldMat = sprite.GetWorldMatrix();//Retrieve values from each sprite object 
    } 
} 

참고 개체를 추가하는 코드 (위 그림 참조)는 별도의 cpp 파일에 있으며 벡터는 헤더 파일에 정의되어 있습니다.

동일한 결과를 사용하여 다른 유형 (예 : int)으로 시도했습니다. 벡터가 헤더 파일 외부에서 정의되었지만 벡터가 헤더 파일 내부에서 정의되어 렌더링 기능에서 액세스 할 수 있어야하는 경우에는이 문제가 발생하지 않습니다.

+0

이 코드로 재생산 할 수 없습니다. 문제를 재현하기 위해 컴파일 할 수있는 최소 및 완전한 * 예제를 만드십시오. – cdhowie

+2

"문제는 push_back을 사용하여 객체를 추가 할 때 객체가 두 번 저장된다는 것입니다."- C++ 표준 라이브러리에서이 버그를 발견 한 첫 번째 인물은 무엇입니까? 당신의 _own_ 코드에 버그가있을 가능성을 대비하십시오 :-) – paxdiablo

+0

다른 사람들이 말했듯이, 여러분은 우리에게 보여주지 않는 코드 어딘가에 버그가 있습니다. vector 클래스는 당신이 그것을 삽입 할 때마다 모든 아이템을 두 번 저장하지 않는다. 당신이 생각하는 것보다'push_back()'을 두 번 호출해야한다. 아니면 어딘가에서 프로그램의 메모리 손상이있을 수도 있습니다. –

답변

1

오브젝트를 두 번 삽입하는 코드는 없으므로 일부 구식 디버깅 기술이 필요합니다. (필요하면 cout 아닌 다른 디버그 방법을 사용하여)

bool Level1::LoadContent() { 
    std::cout << "Enter LoadContent with size " << SpriteList2.size() << '\n'; 

    Sprite1 Sprite_1({0.0f, 0.0f, 3.0f});//Define Sprite Object 
    SpriteList2.push_back(Sprite_1);//Add Sprite Object to Vector 

    Sprite1 Sprite_2({ 100.0f, 00.0f, 2.0f });//Define Sprite Object 
    SpriteList2.push_back(Sprite_2);//Add Sprite Object to Vector 

    Sprite1 Sprite_3({ 100.0f, -50.0f, 1.0f });//Define Sprite Object 
    SpriteList2.push_back(Sprite_3);//Add Sprite Object to Vector 

    std::cout << "Exit LoadContent with size " << SpriteList2.size() << '\n'; 

    return true; 
} 

: 처음에는 뭔가처럼되고 로더 기능을 변경합니다. 이 잘하면 어떤 일이에서 일어나고있는 순서가 분명 할 것이다 그것은 당신이 볼 수 있다는 매우 가능성이있다 :.

Enter LoadContent with size 0 
Exit LoadContent with size 6 

훨씬 더 당신이 그 코드를 외부에 뭔가를 보여줍니다 다른 조합을 볼 가능성이 높습니다 함수를 두 번 이상 호출하거나 함수의 외부에서 벡터에 영향을주는 등의 문제를 일으키고 있습니다.