2012-07-24 3 views
0

그래서 난 내 응용 프로그램을 디버깅하고이 디버거가 나에게 말한 경우 :매우 이상한 처리되지 않은 예외 오류에 문

  if(p_IS_TRUE(playerid,CHECK_INACTIVITY)) 

으로 정의된다 : 라인에서

enter image description here

을 이 :

//global 
#define CHECK_SPAWNKILL   (128) // 0000 0000 0000 0000 0000 0000 1000 0000 
#define CHECK_INACTIVITY  (256) // 0000 0000 0000 0000 0000 0001 0000 0000 
#define CHECK_TELEPORT   (512) // 0000 0000 0000 0000 0000 0010 0000 0000 
#define CHECK_AIRBREAK   (1024) // 0000 0000 0000 0000 0000 0100 0000 0000 

unsigned long p_CheckForStuff[MAX_PLAYERS]; 
#define p_IS_TRUE(playerid,check)  (p_CheckForStuff[playerid] & check) 
list<int> PlayerLoopList; 

//When a player connects 
    PlayerLoopList.push_back(playerid); 
    p_CheckForStuff[playerid] =-1;//enable all checks 

//When a player disconnects 
    PlayerLoopList.remove(playerid); 

//ProcessTick 
    int playerid = 0; 
    int ProcessTicksize = 0; 
    int ProcessTickindex = 0; 
    for (list <int>::iterator i = PlayerLoopList.begin(); i != PlayerLoopList.end(); ++i) 
    { 
     playerid = *i; 
     int playerstate = GetPlayerState(playerid); 
     int vid = GetPlayerVehicleID(playerid); 
     if(g_IS_TRUE(CHECK_INACTIVITY)) 
     { 
      if(p_IS_TRUE(playerid,CHECK_INACTIVITY)) 
      { 
       if(p_AcivityInfo[playerid].Reported == false) 
       { 

그것은 다음과 같이 재현 할 수 있습니다 :

1) 서버 2) 출구/쫓아 낼 수 조인? 3) 다시 가입하십시오. 4) 충돌이 발생했습니다.

왜 이런 일이 일어나는 지 알고 계십니까? 코드는 나에게 완벽 해 보입니다.

+1

디버그 빌드를 시도하고 변수 값을 확인해야합니다. 특히'playerid'는'p_CheckForStuff'에 유효한 인덱스입니까? –

+1

왜'PlayerLoopList'에 대한 벡터가 있지만'p_checkForStuff'에 대한 벡터가 없습니까? 'playerid'가 항상 'MAX_PLAYERS'보다 작습니까? – RedX

+0

반복마다이 문제가 발생합니까? p_IS_TRUE에서 playerid의 int 값을 수동으로 지정하려고 시도 했습니까? – madu

답변

2

액세스 위반은 일반적으로 null 포인터 또는 초기화되지 않은 포인터를 통해 읽거나 배열의 끝을 읽는 시도에서 발생합니다.

이 경우 배열 값을 읽으므로 playerid 값이 배열의 MAX_PLAYERS보다 크거나 같을 수 있습니다.

+0

예, 문제가 있습니다. 이제 수정 사항을 찾아야합니다. 그것은 쉽지만, 나는 생각한다. 나는리스트가 아닌 다른 것으로 바꿀 것이다. –