2013-07-20 3 views
1

처음에는 내 프로그램이 구조체와 두 개의 int 변수가 포함 된 구조체와 클래스를 만듭니다. 그 후 개체 포인터를 사용하는 동안 액세스 위반 읽기

는 주요 부분에서, I는 선언 개체의 변경을 따라 RGB 디스플레이 용 컨테이너 및 오브젝트 포인터 배열로 tiles를 사용하는 2 차원 배열을 생성한다. ( main() 지금) 그 후

int i, j; 

tiles fieldd[fullwidth][fullheight]; 

Units* DetectorField[fullwidth][fullheight]; 

Units Objects[10]; 

, 나는 그것에 대해 문제를 피하고, 유효한 값으로 배열을 모두 업로드 할 수 있습니다. 포인터에 대한 객체 메모리 ADRESS를 추가 객체 +와 같은

for (j=0;j<fullheight;j++) 
{ 
    for (i=0;i<fullwidth;i++) 
    { 
     fieldd[i][j] = BASE; 
     DetectorField[i][j] = NULL; 
    } 
} 

DetectorField 통해 그들을 식별 할 수 있어야합니다 :

for (i=0; i<9;i++) 
{ 
Objects[i].X_Pos = i+2; //just some values, not important yet 
Objects[i].Y_Pos = 2*i+2; 
DetectorField[Objects[i].X_Pos][Objects[i].Y_Pos] = &Objects[i]; 
} 

하는 대부분의 확실히,이 아직 괜찮습니다. 그러나 문제는 지금 온다! 다음 코드에서는 DetectorField의 모든 요소를 ​​확인합니다. 선택한 요소가 아직 NULL이 아니라면 (이는 객체의 메모리 주소 일 수 있음을 의미합니다. 다른 값을 얻을 수 없으므로 - 잘 아는 경우) MapColour 변수를 배열에 넣습니다. 구조. 나는 그것을 실행하려고하면이 시점에서

for (j=0;j<fullheight;j++) 
{ 
    for (i=0;i<fullwidth;i++) 
    { 
     if(DetectorField[i][j] != NULL) 
     { 
      fieldd[i][j] = DetectorField[i][j]->MapColour; 
     } 
    } 
} 

는 MSVC이 오류 메시지를 제공합니다 : 처리되지 않은 예외를 0x00411ed7에서 타락 Star.exe : 0xC0000005 : 액세스 위반 읽기 위치 0xccccccdc을.

내가 뭘 잘못 했니? 이 상태에서의 수술은 나에게 맞는 것처럼 보입니다. 문제는 내가 사용하는 방식으로 fieldd일까요?

+4

슬픔을 피하고'tiles'의 "char * name"을'std :: string'으로 대체하십시오. –

+0

위반이 발생했을 때'i'와'j'의 값은 무엇입니까? –

+0

팁 주셔서 감사합니다; 그러나 슬프게도'std :: string'을 사용하면 스택 오버플로가 발생합니다. 어쨌든 : fullheight와 fullwidth를 변경하더라도 충돌이 발생합니다. –

답변

2

for (i=0; i<10; i++) 

또는 더 나은 원하는 생각합니다. 액세스 위반이 어디에서오고 있는지 알아 내기 위해 Stepping Into와 Stepping Over로 코드를 디버깅해야합니다. 액세스 위반은 NULL 참조를 참조하려고합니다. 객체에 액세스하기 전에 객체에 메모리를 할당해야합니다.

DetectorField [i] [j] = NULL을 지정하는 for 루프가있어 location [i] [j]가 NULL 참조임을 나타냅니다. 그런 다음 참조 DetectorField [Objects [i] .X_Pos] [Objects [i] .Y_Pos]가 있습니다. 거기에 몇 가지 액세스 위반이있을 수 있습니다.

1

이 루프 :이 Objects 10 개 요소이고, 당신은 그 중 9 초기화하기 때문에

for (i=0; i<9;i++) 
{ 
    Objects[i].X_Pos = i+2; //just some values, not important yet 
    Objects[i].Y_Pos = 2*i+2; 
    DetectorField[Objects[i].X_Pos][Objects[i].Y_Pos] = &Objects[i]; 
} 

는, 전체 초기화를하지 않는 것 같습니다.

은 당신이 당신은 간단하게 액세스 위반이

for (i=0; i<(sizeof(Objects)/sizeof(Objects[0])); i++) 
+0

그러나 배열은 0에서 시작됩니다. 그렇지 않습니까? 따라서 초기화시 [10]의 경우 [0]에서 [9]까지 카운트됩니다 - 아닌지? –

+1

내가 9보다 작 으면서 루프를 돌린다 ... 당신은'Objects [8]'을 통해'Objects [0]'을 초기화한다. 'Objects [9]'는 초기화하지 않습니다. for 루프에서 정지 조건으로'i <10' 또는'i <= 9'를 사용했다면, Objects [9]도 초기화 할 것입니다. – llakais

+0

알겠습니다. 감사; 그러나 오류가 여전히 발생했습니다. –

관련 문제