C 언어 코드 파이썬으로 옮길 때 주의할 점

andysheep의 이미지


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'은 아니라고 생각합니다. 그리고 글 전체적으로 쓰신 '옳'바르다도 '올'바르다가 맞습니다.

neuron의 이미지

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.

홈패이지 개편 전에 저것 말고 직접적으로 '데브원으로 읽습니다' 라는 글을 본 것 같은데 찾아보려해도 찾아 볼 수 가 없네요.

익명 사용자의 이미지

아, 감사합니다. 볼 때마다 궁금했습니다 ))

익명 사용자의 이미지

같은 문제를 겪을 수 있는 분들께 좋은 정보가 될 것 같네요.
수고 하셨습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.