2012-07-28 4 views
-2

안녕하세요, 경연을위한 게임을 개발하는 데 몇 주간의 시간이 걸렸습니다. (나는 코딩에 익숙하지만 조금은 그렇지 않다).C++ 게임 exe가 작동을 멈췄습니다. 많은 수업이있었습니다. 비주얼 C++로 작업하기

저는 Visual C++로 게임을 작성하고 있습니다. Visual C++에서 릴리스 모드로 실행하면 문제없이 실행되지만 .exe에서 시도하면 "* * .exe가 작동을 멈췄습니다"라는 메시지가 나타납니다. 나는 그 오류를 알고 있지만 그것을 고치는 법을 모른다. 벡터가 많아서 오류가 팝업됩니다. 게임에서 실행되는 프로그램에서 크기를 조정하는 일부 벡터를 삭제하면 anyting, wall, box 벡터가 될 수 있습니다. 중요하지 않습니다. 그러나 나는 그것이 정말로 이상하다고 생각한다. 왜냐하면 내가 작업 관리자를 들여다 볼 때 게임은 2 만개의 메모리 만 차지하기 때문이다.

결론적으로 게임에서 일부 벡터를 삭제하면 게임 exe가 실행되고 그렇지 않은 경우 Visual C++에서만 실행됩니다. 어떻게해야합니까? 나는 정말로 길을 잃었다.

///////////////////////////////////////////////////////////////////////////// ///////////////////////

네 벡터 목록의 크기를 조정하면 .exe가 실행되지만 4 이상 크기를 조정하면 exe에서 오류가 발생하지만 Visual C++ 인스턴스는 계속 실행됩니다.

class Level 
{ 

public: 

    int LevelWidth; 
    MapElements::Background Background; 

    //OBJETS SUR MAP 
    Array<MapElements::Ground> Grounds; 
    Array<MapElements::Wall> Walls; 
    Array<MapElements::Platform> Platforms; 
    Array<MapElements::Box> Boxs; 

    //ENNEMIS et JOUEUR 
    Array<Gameplay::Droite> Droites; 
    Array<Gameplay::Cercle> Cercles; 
    Gameplay::Player Player; 
}; 

이 작동합니다

void Level::InitializeMap(int MaxGround, int MaxWall, int MaxPlatforms, int MaxBox) 
{ 
    Grounds.Element.resize(MaxGround); 
    Walls.Element.resize(MaxWall); 
    Platforms.Element.resize(MaxPlatforms); 
    Boxs.Element.resize(MaxBox); 
} 

이되지 않습니다

void Level::InitializeMap(int MaxGround, int MaxWall, int MaxPlatforms, int MaxBox, int  MaxCercles) 
{ 
    Grounds.Element.resize(MaxGround); 
    Walls.Element.resize(MaxWall); 
    Platforms.Element.resize(MaxPlatforms); 
    Boxs.Element.resize(MaxBox); 
    Cercles.Element.resize(MaxCercles); 
} 

Array 클래스 : 만 4 벡터가있는 경우

template <typename T> class Array 
{ 
public: 
    std::vector<T> Element; 
    Array(); 

}; 
template <typename T> Array<T>::Array() 
{ 
} 

크기 변경이 작동합니다. resize()이며, 변수 (벽, 상자 등), w 모자가 오류의 원인입니까?

+0

exe ​​파일을 어떻게 컴파일합니까? 16 비트 모드? 제한된 방법으로 건물을 짓지 않는 한 수업의 수에는 제한이 없습니다. – stark

+0

내 생각 엔 런타임에 필요한 파일이있을 것입니다.이 파일은 Visual Studio에서 실행할 때 런타임에 사용할 수 있지만 exe를 실행할 때는 사용할 수 없습니다. 실행 파일과 동일한 디렉토리에 게임에 필요한 모든 리소스가 있습니까? – ctor

+0

와우 왜 아래로 투표합니까? 아니 누락 된 파일이 없습니다, 나는 클래스에 대한 제한이 없다는 것을 알고 있지만 컴파일을 살펴볼 것입니다. – user1236892

답변

2

오류의 원인에 대해 틀렸어. 창문에 *.exe has stopped working. 일반적으로 신청서에 segmentation faulted이있는 것을 의미합니다.

이 어떤 읽기에 의해 발생 또는 일반적으로 당신이 free()/delete로 엉망이 의미 메모리 경계에서 쓸 수 있습니다하는 malloc()/new, 또는 어딘가에 NULL,하지만 더 코드, 또는하지 않고 자세한 설명 , 나는 더 이상 진단 할 수 없다.

+0

감사! 나는 이것들 중 어느 것도 사용하지 않았기 때문에 나는 많은 것들을 엉망으로 만들었습니다 ... 나는 그것들을 사용하는 방법에 관한 기사를 찾았습니다. 그래서 그것을 시험해 봅니다. 하지만 그것은 Visual C++에서 정상적으로 실행되며 exe에서는 실행되지 않습니다. 그것은 여전히 ​​동일한 프로그램의 권리입니까? 두 사람의 차이점은 무엇입니까? – user1236892

+0

주요 문제가 업데이트되었습니다. – user1236892

0

게임을 vc에서 실행하면 변경하지 않은 경우 작업 디렉토리의 기본값은 프로젝트 디렉토리입니다. 당신이 .EXE에서 실행할

는 작업 디렉토리는 .EXE가 존재하는 경우는 그 디렉토리입니다.

게임이 올바르게시에 위치 할 수없는 무언가에 의존한다면 아마도 당신은 확인할 수 있습니다 직접 실행하십시오.

+0

나는 모든 DLL과 그래픽이 꽤 있음을 확신한다. 내 문제는 이것과 관련이 있습니까? http://stackoverflow.com/questions/1763739/problem-retuning-a-vector-from-ac-dll-to-another-c-exe – user1236892

+0

@ user1236892, 프로그램이 스택을 과도하게 사용하여 스택 오버플로? 기본 스택 크기는 1MB 여야합니다. 프로그램이 ide에서 실행될 때 예약 된 스택 크기가 더 클 수 있습니까? –

0

기본적으로 Vector를 잘못 사용하고 있습니다. 그에 따라 크기를 조정하는 대신 가능한 최대 크기로 크기를 조정합니다. 아마도 사용 가능한 메모리를 모두 날려 버릴 것입니다.

아마 이렇게 좋을 것이다 :

class Level 
{ 

public: 

    int LevelWidth; 
    MapElements::Background Background; 

    //OBJETS SUR MAP 
    MapElements::Ground Grounds[MAXGROUNDS]; 
    MapElements::Wall Walls[MAXWALLS]; 
    MapElements::Platform Platforms[MAXPLATFORMS]; 
    MapElements::Box Boxs[MAXBOXES]; 

    //ENNEMIS et JOUEUR 
    Array<Gameplay::Droite> Droites; 
    Array<Gameplay::Cercle> Cercles; 
    Gameplay::Player Player; 
}; 

그리고는 수준의 메모리를 초기화하는 수준의 할당에 의존하고 있습니다.

지금. 나는 MaxCercles가 무엇인지 모른다. 그러나 당신은 당신이 너무 많은 메모리를 사용하지 않는다는 것을 확실히 할 필요가 있습니다 (일명 각 클래스가 얼마나 큰지에 따라 조금씩 어려움을 겪을 수 있습니다).

벡터를 사용하려는 경우 벡터를 기본 중간 크기 (예 : 100 또는 무언가)로 설정하고 추가 한 내용에 따라 크기를 조정할 수 있습니다.