퇴근하기전에 해결하지 못한 코드를 다음 날로 미루고 퇴근한 바로 그 다음날인 오늘, 다시 문제의 코드를 살펴보는데, 도무지 모르겠더라.. 여차저차 해서 문제가 발생하는 방향과 문제가 발생하지 않은 방향은 알게 되었는데.. 그 원인이 무엇인지는 여전히 모르겠더라..
Need는 3DS 파일을 로딩하여 화면상에 표시하는 어느 외국(DigiBen, digiben@gametutorials.com)인 잘만들어 공개해 놓은 소스 코드를 사용하려고 하는데.. 핵심적인 사용은 클래스 하나와 구조체 하나를 조합하여 사용하는 것이었다.
문제는 시험차원에서 만들어 놓은 코드는 잘작동을 하는데, 실제 프로젝트에 적용을 해보면 프로그램이 뻗어 버렸다. 여차저차해서 겨우 문제가 발생하는 경우와 발생하지 않는 경우를 알게되었는데..
문제가 발생하지 않는 경우는 제공되는 클래스 하나와 구조체 하나를 전역으로 선언해 놓고 사용하는 경우고, 문제가 발생하는 경우는 지역이나 힙에 할당해서 사용하는 경우였다.
OOP의 규칙중에 최대한 전역적인 요소를 제거해야 하는 바 절대 전역으로 선언해서 사용해서는 않되었기에 new에 의한 힙 할당으로 사용하려고 했지만 계속 뻗어 버리고.. 뭐가 원인인지도 모르고, 나중에는 제작자의 불순한 의도가 아니겠는가하는 의심까지 들고… 역시 세상에 꽁짜가 없다느니하는 생각이 들더랬다.
제작자의 불순한 의도로 방향을 몰고 가던중에, 소스 코드까지 제공했다면 그 불순한 의도 역시 소스 코드 어디엔가 나를 비웃고 있겠지 하는 생각에.. 반듯이 잡아 족치리라 생각하고 코드 한줄 한줄 디버깅 해 들어갔다. 문제를 발생시키는 함수는 asm 소스로 된 memcpy라는 Ansi C 함수였다. 다시 memcpy가 받은 인자의 값을 살펴보니 웬 쓰레기값?
불현듯… 몽롱한 과거 까까머리로 C/C++을 학습하던 시절에 전역 변수는 자동으로 초기화가 되지만 그외의 경우는 자동으로 초기화가 되지 않는다는 성경말씀이 생각나.. 이것이구나! 라는 생각에 제공되는 클래스와 구조체 중에 구조체의 맴버 변수의 값들을 모두 0으로 설정하고 다시 돌려보니 잘되더라는…. 원인을 알고보니 참으로 어처구니가 없더라는… 하지만 원이 무엇이듯 잘해결이 되니 참으로 감격스러웠다..
이런 감격에 오늘의 교훈을 잊지 않고자 기록에 남긴다. 역시 90%의 오류는 오직 내 안에 있다는 것을… 또한 다른 이의 선행을 확실한 근거 없이 오해하지 말자라고….