ptrarr()의 이용

기본적으로 IDL에서 readf를 할 때 가장 많이 어려워 하시는 점이 배열을 그대로 이용하지 못한다는 점입니다. 배열로 readf를 하면 call by value가 되기 때문에 변수의 입력이 안되서 생기는 이 문제 때문에 많은 분들이 질문을 하시기도 하지요.

이 문제를 해결하는 것은 개별적인 변수를 만들어서 하나하나 만드는 방법이었습니다. 이것에 대한 내용은 제가 이전에 썼던 tip인 Call by value와 Call by reference 에 대한 글에 설명이 되어있습니다.

하지만 이번에는 접근방법을 달리 하려고 합니다. 배열은 이미 데이터의 형태가 정해져 있어서 배열에 있는 하나의 변수만을 바꾸는 것은 문법적으로 문제가 있었습니다. 이것은 배열의 일부의 형태가 바뀔 수 없기 때문에 나타나는 문제였지요. 하지만 배열에 직접 저장하는 방식이 아니라면 데이터를 배열에 넣을 수 있게 됩니다. 즉 값들의 주소(나 참조)가 배열로 존재한다면, 변수들은 주소에 의해 연결되어 있지만 실제로는 다른 위치에 존재하는 값이라는 결론에 도달합니다. 이것을 가능하게 해주는 것이 ptrarr()함수입니다.

ptrarr()함수는 포인터의 배열을 생성하는 함수입니다. 따라서 변수들이 가지는 주소들의 배열인 것이지요. 즉 이 주소를 찾아간 값은 우리가 평소에 알던 배열이 아닌 변수입니다. 즉 Call by reference를 이용하는데 문제가 없는 변수가 된다는 뜻이지요.

글을 계속 보시면 아시겠지만 이것도 완전한 방법은 아닙니다. 그래도 IDL을 이용하는데 많은 도움이 될 것입니다.

그러면 우선 예전에 있었던 결과가 제대로 안나오는 오류가 있는 함수를 다시 살펴봅시다.

위 코드의 문제는 readf,lun,time[i],theory[i],observe[i] 입니다. 이부분에서 Call by reference가 안되기 때문에 readf의 함수 안에서 바뀐 값이 time[i],theory[i],observe[i]에 입력되지 않는 것이지요.

원래는 대신 입력을 받는 변수를 생성해서 time[i],theory[i],observe[i]에 일일히 대입했었는데요. 이번에는 기본적으로 입력을 대신 받는 변수를 생성해서 각 위치에 옮기는 것 대신에 ptrarr을 이용한 방법을 보여드리도록하겠습니다.

코드에서도 보이지만 IDL의 포인터도 C같은 다른 언어처럼 변수명 앞에 *을 붙이는 것으로 주소가 가리키는 변수를 찾게됩니다. 따라서 *time[i]는 time[i]포인터가 가르키는 변수를 이야기 하게 됩니다. 이것은 배열에 속한 것이 아니므로, Call by reference가 가능합니다. 따라서 이렇게 작성하더라도 변수는 제대로 입력되게 됩니다.

하지만 위의 코드에서도 보이겠지만 이러한 방법에는 큰 단점도 존재합니다. 실제 변수가 아닌 각 변수의 주소인 포인트가 배열로 존재하기 때문에 변수를 이용해서 배열 연산을 할 수 없다는 점인데요. 그러한 이유로 불편하지만 변수를 출력할 때 for문이 들어갈 수 밖에 없었습니다. 이것을 통해 직관적으로 이해하는 것은 쉽지만, 배열을 처리하는데 강한 IDL의 장점은 죽이는 코드방식이라고 할 수 있겠습니다.

기본적으로 이용하는 방식과는 장단점이 각각 있습니다. 따라서 전에 있던 강의인 Call by value와 Call by reference를 참조해서 다시 한 번 보시는 것도 좋을 것 같습니다.

오늘은 올해 첫 눈이 내렸는데요. 날씨가 추워지는 만큼 User Group여러분도 건강에 유의하시기를 바라겠습니다.

감사합니다.