C 언어 코드 파이썬으로 옮길 때 주의할 점
글쓴이: andysheep / 작성시간: 금, 2016/05/06 - 11:38오후
10년 전에 한 프로그래머가 오픈 소스로 공개한 C언어로 짠 공학 프로그램을 사용하다가
최근에 파이썬으로 옮기면서 부딪힌 버그인데 해결하는데 3일 걸렸네요.
혼자 알고 넘어가긴 쓴 시간이 아까워 간단히 올립니다.
환경: 64비트 AMD 커널 데브원 리눅스
파이썬 (3.x) 기준
포인터 변수에 값 넘기는 함수
ptAdd()는 Point 구조체 변수 a, b를 더해 c에 넘긴다고 하자.
Point *a, Point *b, Point *c;
a = &in->vertices[face[0]];
b = &in->vertices[face[1]];
c = ptAdd(a, b)
/** * Add two 3-d points together. */ void ptAdd(const Point *a, const Point *b, Point *out) { out->x = a->x + b->x; out->y = a->y + b->y; out->z = a->z + b->z; }
ptAdd()를 아래처럼 out 변수에 주도록 하면 out에 파이썬이 쓰레기 값 넣는다.
# Add two Points def ptAdd0(a, b, out): out.x = _f6(a.x + b.x) out.y = _f6(a.y + b.y) out.z = _f6(a.z + b.z)
옳바른 방법
a = Point(...)
b = Point(...)
c = ptAdd(a, b)
# Add two Points def ptAdd(a, b): x = _f6(a.x + b.x) y = _f6(a.y + b.y) z = _f6(a.z + b.z) return Point(x, y, z)
클래스 Dome에 딸린 함수로 add_vertex()는 Point 객체를 V란 리스트에 더한다.
def add_vertex(self, other): self.V.append(other) self.nvert = len(self.V)
/** * Return the index of the vertex that matches this one. Insert if * needed. */ static int match_vtx(Point *vtx, Dome *dome, int *nv) { int i; for(i=0; i < *nv; ++i) if( ptDist(vtx, &dome->vertices[i]) < .1 ) return i; if( *nv >= dome->nvert ) { fprintf(stderr, "Internal error: out of vertices in tesselate\n"); return 0; } dome->vertices[*nv] = *vtx; return (*nv)++; }
위 C로 짠 match_vtx()를 파이썬으로 다음과 같이 옮겼다. target이란 Point 객체가 V 리스트에 없으면
add_vertex()를 불러 target을 V에 넣는다. 문제는 동작은 잘하지만
V 리스트에 쓰레기 값 가진 Point 객체를 지멋대로 집어넣는다.
def match_vtx(self, target): # ... pos = self.vtx_find0(target) if pos != -1: return pos # Add new vertex - Point object self.add_vertex(target)
옳바른 방법은 새 Point 객체를 만들어 V 리스트에 넣는다.
# Point object def add_vertex(self, other): t = Point(other.x, other.y, other.z) self.V.append(t)
Forums:
데브원은 dev'one'이지 dev'uan'은
데브원은 dev'one'이지 dev'uan'은 아니라고 생각합니다. 그리고 글 전체적으로 쓰신 '옳'바르다도 '올'바르다가 맞습니다.
devuan? dev-one!
Spread the word! a simple way to spell “Devuan” is “dev dash one dot org” both dev-one.org and dev-1.org point here.
홈패이지 개편 전에 저것 말고 직접적으로 '데브원으로 읽습니다' 라는 글을 본 것 같은데 찾아보려해도 찾아 볼 수 가 없네요.
아, 감사합니다. 볼 때마다 궁금했습니다 ))
아, 감사합니다. 볼 때마다 궁금했습니다 ))
좋은 정보
같은 문제를 겪을 수 있는 분들께 좋은 정보가 될 것 같네요.
수고 하셨습니다.
댓글 달기