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의 컴파일러에 문제가 있는 걸까요.
지금껏 코딩을 해오면서 이런 황당한 경우는 처음 겪습니다.
'Lazy Coder' 카테고리의 다른 글
윈도우 caffe 비주얼스튜디오로 새로운 레이어 추가 정의하기 (0) | 2019.07.23 |
---|---|
윈도우 caffe 로그파일 위치 (0) | 2017.10.19 |
윈도우 파이썬 caffe로 딥러닝 시작하기 2 (0) | 2017.09.27 |
윈도우 파이썬 caffe 로 딥러닝 시작하기 1 (8) | 2017.09.25 |
윈도우 파이썬에서 C코드 사용하기 (0) | 2017.09.08 |