처음에는 내 프로그램이 구조체와 두 개의 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
일까요?
슬픔을 피하고'tiles'의 "char * name"을'std :: string'으로 대체하십시오. –
위반이 발생했을 때'i'와'j'의 값은 무엇입니까? –
팁 주셔서 감사합니다; 그러나 슬프게도'std :: string'을 사용하면 스택 오버플로가 발생합니다. 어쨌든 : fullheight와 fullwidth를 변경하더라도 충돌이 발생합니다. –