2010-07-14 3 views
1

이상한 일이 발생했습니다. 나는 완벽하게 작동하도록되어있는 라이브러리 (오픈 소스 Netgen mesher의 nglib)를 사용하고 있습니다. ,Visual Studio에서 void로 보인 포인터 **

DLL_HEADER Ng_Mesh * Ng_NewMesh() 
    { 
     Mesh * mesh = new Mesh; 
     mesh->AddFaceDescriptor (FaceDescriptor (1, 1, 0, 1)); 
     return (Ng_Mesh*) (void*) mesh; 
    } 

나는 지역 주민에 갈 때 : 나는 연결하고 모든 것을 포함하지만 나는이 라이브러리를 사용할 수 있습니다 : Ng_Mesh* mesh = Ng_NewMesh();

Ng_NewMesh

() 메소드는 내가 사용하려는 목적이다

을 인 *mesh을 참조하면 void**으로 표시됩니다. 나는이 개체에 포인트 및 기타 물건을 추가 할 수 있기 때문에하지 NULL이지만, 일부 기능, 나는 예외가 얻을 :

System.AccessViolationException : 보호 된 메모리를 읽거나 쓰려고 시도합니다. 이것은 종종 다른 메모리가 손상되었다는 표시입니다. ForwardModelingPlugin.CustomMeshVol3D.tesselate(CustomMeshVol3D*)

nglib.Ng_GetPoint에서 nglib.Ng_GetPoint(Void** , Int32 , Double*)
에서

이 예외를 설명 인수 (Ng_Mesh*, Int32, Double*)로 가질 예정이다.

왜이 캐스팅이 발생하는지 알 수 없습니다.

+0

과 동일? 즉. 특정 멤버 함수를 호출하기 전에 다른 객체의 인스턴스로 설정해야하는 객체의 필드가 하나있을 수 있습니까? – stakx

+0

'return (Ng_Mesh *) (void *) mesh;'- 불쾌한 캐스트가 필요합니까? 'void * '에 캐스트하는 것은 컴파일러가'Mesh *'를'Ng_Mesh * '에 직접 캐스팅했다면 불평 할 것이기 때문에 필요합니다. 그렇다면 정당한 사유로 불만을 제기합니까? 'Ng_Mesh *'에 대한 캐스트가 유효합니까? 아니면 어떻게 든 캐스트없이 그냥'Mesh * '를 반환 할 수 있습니까? – stakx

+0

이것을 확인 하겠지만 확실하지는 않습니다. 다운로드 한 패키지에 포함 된 몇 가지 예를 사용하고 있습니다. – ccote

답변

5

Here는 말한다 :

/// Data type for NETGEN mesh 
typedef void * Ng_Mesh; 

때문에 Ng_Mesh* mesh;가 구축 된 객체 (`mesh`)이 설정되지 않은 종속성이있을 수 있습니다 경우 문서 확인 했 void** mesh;

+1

Righto는 OP가 'void **'를 'void **'에 캐스팅합니다. 흠 ... –

+0

고마워, 그게 논리적 인 것 같아. @ 저스틴 : 그/문제가 아닌가요? – ccote

+1

@ChRtS : 예, 메모리 손상 문제가 발생합니다. –

관련 문제