본문 바로가기

Lazy Coder

파이썬에서 C코드로 컴파일 된 모듈 불러쓸 때 오류 발생

C 코드로 작성한 알고리즘을 파이썬에서 사용할 일이 생겼습니다.

 

Anaconda Python 2.7에서 C코드를 컴파일하려면 Visual Studio 2008의 컴파일러가 필요하더랬습니다. 다행히 Visual Studio 2008은 마이크로소프트에서 무료로 공개하여 다운로드 받을 수 있었습니다.

 

문제는, 파이썬 문서를 참고하여 C extending을 이용, C 코드를 컴파일하고 실행시켰는데 알고리즘이 제대로 동작하지 않더군요. 원인을 찾으며 한참을 헤맸습니다.

 

C 코드가 잘못됐나 해서 따로 C 프로젝트를 만들어 코드를 실행시켰을 땐 정상적으로 동작했습니다. 분명 함수의 입력값을 동일하게 줬는데 출력되는 값이 엉망이었습니다. 콘솔창에서 python 명령어로 C 코드를 컴파일 하느라 파이썬에서 돌아가는 C 코드의 디버깅도 불가능했습니다. 여러가지를 시도해보다가 결국엔 코드를 한 줄 한 줄 분석해보기로 했습니다.

 

C 코드 중간 변수 값들을 파일에 로그로 기록하면서 일일이 값을 대조해나갔습니다. 반복문에 플래그를 줘서 특정 구간에서만 로그를 출력하게 하여 모든 반복문을 따라갔고 마침내 문제가 발생하는 코드를 찾았습니다.

 

//diff = fmax(diff, (float)fabs(*img_vec_x_iter++ - old));  //img_vec_x_iter++ cause +2 instead of +1. I don't know why this is happen.
diff = fmax(diff, (float)fabs(*img_vec_x_iter - old));
img_vec_x_iter = img_vec_x_iter + 1;

 

위 코드에 주석처리되어 있는 명령어를 주석 아래처럼 수정하니 정상적으로 동작합니다.

 

 

img_vec_x_iter++   이 코드가 img_vec_x_iter 포인터를 한 칸이 아니라 두 칸을 건너뛰어 버립니다.

img_vec_x_iter = img_vec_x_iter + 1;  이렇게 명령어를 수정하니 C에서 실행했을 때와 동일한 결과를 출력합니다.

 

파이썬 모듈이 오작동 한걸까요 아니면 Visual Studio 2008의 컴파일러에 문제가 있는 걸까요.

 

지금껏 코딩을 해오면서 이런 황당한 경우는 처음 겪습니다.