황당한 code error

((case1))

class tetgenio {

 ...

 typedef struct {
  int *vertexlist;
  int numberofvertices;
 } polygon;

<strong> typedef struct {
  polygon *polygonlist;
  int numberofpolygons;
  double *holelist;
  int numberofholes;
 } facet;</strong>
 ...

};

((case2))

class tetgenio {
 ...

 typedef struct {
  int *vertexlist;
  int numberofvertices;
 } polygon;

<strong> typedef struct {
  double *holelist;
  polygon *polygonlist;
  int numberofpolygons;
  int numberofholes;
 } facet;</strong>
 ...

};

MStatus FXTetGen::compute( const MPlug& plug, MDataBlock& data ) {

 MStatus stat;

 tetgenio in;

 if( plug == outTemp ) {

  ...

  in.facetlist = new tetgenio::facet[numFaces];

  ...

 }

}

((case1))의 tetgenio.facet struct를 사용하게 되면, FXTetGen node의 output 출력에 문제가 생긴다.

((case2))의 tetgenio.facet struct 선언처럼,

double *holelist; → polygon *polygonlist; 순서로 써주어야 한다.

예전에도 한 번 이것과 비슷한 경우가 있었는데,

class의 멤버 변수 중에서

user defined data type (즉, 새로 정의한 struct나 class)의 포인터를 가질 경우

그 포인터가 가르치는 struct나 class의 크기 순서(작은 것부터 큰 것 순서)대로 써주지 않으면

예기치 못한 결과가 나타난다.

예전에 Visual C++ 6.0에서 비슷한 문제가 발생했었던 기억이 난다.

Visual Studio.NET 2005에서도 아직 이러한 문제가 남아 있는 것으로 보아

Microsoft Visual Studio의 문제만은 아닌 듯

답글 남기기