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부분만 바꾸니 에러가 나지않을걸로봐서 인덱싱에러가 맞는것같아 왜 이런건가 해 질문 드립니다.

설명하자니 매우 길고 모호한것 같은데 혹 답변 해주실수 있으신 분 계시다면 부탁드립니다.

  

seico75   4년 전

이 함수가 어떻게 쓰이고 배열에 어떤 수들이 들어갈 수 있는지 잘 모르겠지만..

input_order 안에 전부다 0이 들어가면 어떻게 되나요? 음수도 나올 수 있다면 0과 0보다 작은 수만 있으면...

이때 destination 이 0 이면 index 가 벗어날 수도 있지 않을까요?

atagkim   4년 전

아 제가 조건을 좀 부실하게 적어놨네요. 분명 그렇게만 된다면 저 코드상으로는 인덱싱에러를 막을수 없겠지만 애초에 input_order안의 값들 범위와 destination의 값 범우가 1 이상입니다. 그래서 아마 input_order와 destination이 0인경우는 없을것으로 보입니다. 답변 감사합니다.

댓글을 작성하려면 로그인해야 합니다.