전역변수로 배열을 잡아 놓고 여기에 접근하던 중 런타임 에러가 났었는데 해결은 했습니다만 이해가 가질 않아 질문드립니다.
코드를 보면 input_order라는 배열이 있고 이 input_order는 sorting이 돼있습니다. 그리고 vertex_add는 input_order에서 값이 같은 원소들의 첫번째 주소를 저장하는 곳입니다.
예를 들어,
{2, 3, 3, 3, 4, 5, 5} 이런 배열이 있고 이 배열의 첫번째 주소를 alpha라고 한다면,
vertex_add는
{ 0(0값을 가지는 원소의 첫번째 주소값),
0(1값을 가지는 원소의 첫번재 주소값),
alpha(2값을 가지는 원소의 첫번째 주소값),
alpha+1(3값을 가지는 ~~),
alpha+4(4값을 가지는~~),
alpha+5(5값을 가지는~~),
0,
0
...
0}
이렇게 됩니다.
그 뒤 찾고자하는 값이 3이라면 vertex_add[3] 값을 가져와 input_order에 있는 3번값을 가지고 있는 곳에 바로 접근하고 또 다른 3번의 값의 위치 또한 주소값에 +1을 더하는 방식으로 접근합니다.
이 과정에서 현재 코드에 보이는 주석처리된 boundary부분은 원래 없었고 없었을땐 런타임 에러가 났습니다. vertex_add의 주소값을 가져온뒤 input_order에서 주소값에 수를 더해가며 다음 값에 접근할때 input_order의 범위를 넘어간다면 인덱싱 에러가 나는거라 생각을 하고 boundary라는 input_order[input_order의 max 개수(100000개) + 1]의 주소값을 가져와 그 주소값보다 작을때라는 기준을 넣었습니다. 이렇게 하니 런타임 에러가 나지 않았는데 근데 여기서 이해가 가지않습니다.
애초에 접근 자체가 바로 다음항에 한해있고 선언한 전역변수의 범위는 100005, input_order의 max 개수는 100000개 입니다. 그럼 100000의 범위를 넘어서 100001이던 100002던 다음 항에 접근한다해도 애초에 선언된 전역변수의 범위안에 해당하며 값또한 0으로 초기화 돼있고 코드 조건상 0값이 나오면 break 하게 돼있기에(destination은 0값이 없음) 그 뒤에 100003이던 100004던 100005의 범위안을 벗어날수는 없습니다. 그렇다보니 인덱싱 에러가 날일 없을것 같은데 런타임 에러가 어쨋든 났고 저 boundary부분만 바꾸니 에러가 나지않을걸로봐서 인덱싱에러가 맞는것같아 왜 이런건가 해 질문 드립니다.
atagkim 4년 전
전역변수로 배열을 잡아 놓고 여기에 접근하던 중 런타임 에러가 났었는데 해결은 했습니다만 이해가 가질 않아 질문드립니다.
코드를 보면 input_order라는 배열이 있고 이 input_order는 sorting이 돼있습니다. 그리고 vertex_add는 input_order에서 값이 같은 원소들의 첫번째 주소를 저장하는 곳입니다.
예를 들어,
{2, 3, 3, 3, 4, 5, 5} 이런 배열이 있고 이 배열의 첫번째 주소를 alpha라고 한다면,
vertex_add는
{ 0(0값을 가지는 원소의 첫번째 주소값),
0(1값을 가지는 원소의 첫번재 주소값),
alpha(2값을 가지는 원소의 첫번째 주소값),
alpha+1(3값을 가지는 ~~),
alpha+4(4값을 가지는~~),
alpha+5(5값을 가지는~~),
0,
0
...
0}
이렇게 됩니다.
그 뒤 찾고자하는 값이 3이라면 vertex_add[3] 값을 가져와 input_order에 있는 3번값을 가지고 있는 곳에 바로 접근하고 또 다른 3번의 값의 위치 또한 주소값에 +1을 더하는 방식으로 접근합니다.
이 과정에서 현재 코드에 보이는 주석처리된 boundary부분은 원래 없었고 없었을땐 런타임 에러가 났습니다. vertex_add의 주소값을 가져온뒤 input_order에서 주소값에 수를 더해가며 다음 값에 접근할때 input_order의 범위를 넘어간다면 인덱싱 에러가 나는거라 생각을 하고 boundary라는 input_order[input_order의 max 개수(100000개) + 1]의 주소값을 가져와 그 주소값보다 작을때라는 기준을 넣었습니다. 이렇게 하니 런타임 에러가 나지 않았는데 근데 여기서 이해가 가지않습니다.
애초에 접근 자체가 바로 다음항에 한해있고 선언한 전역변수의 범위는 100005, input_order의 max 개수는 100000개 입니다. 그럼 100000의 범위를 넘어서 100001이던 100002던 다음 항에 접근한다해도 애초에 선언된 전역변수의 범위안에 해당하며 값또한 0으로 초기화 돼있고 코드 조건상 0값이 나오면 break 하게 돼있기에(destination은 0값이 없음) 그 뒤에 100003이던 100004던 100005의 범위안을 벗어날수는 없습니다. 그렇다보니 인덱싱 에러가 날일 없을것 같은데 런타임 에러가 어쨋든 났고 저 boundary부분만 바꾸니 에러가 나지않을걸로봐서 인덱싱에러가 맞는것같아 왜 이런건가 해 질문 드립니다.
설명하자니 매우 길고 모호한것 같은데 혹 답변 해주실수 있으신 분 계시다면 부탁드립니다.