2014-04-22 2 views
0

현재 워크 플로에서 Blender에서 Python으로 다양한 정보 (정점 색상, UV 좌표 등)와 함께 3D 모델을 내보내고 있습니다. 이것은 C++로 읽을 수있는 바이너리 파일에 저장됩니다.포인터 값이 앞의 값의 영향을받는 것 같습니다.

파이썬 :

ar = [0, 1, 2, 3, 4] 
with open('model.bin', 'wb') as file: 
    file.write(struct.pack('%si' & len(ar), *ar)) 

C++ :

u32* ar = (u32*) model_bin; //model_bin is already declared externally 
for(int i=0; i<5; i++){ 
    printf("%d\n", ar[i]); 

}이 작동

는 다음 코드를 살펴 보자! 그러나 내 파일에는 하나 이상의 데이터 목록이 포함되어 있습니다. 그것은 다양한 유형의 많은 데이터를 포함합니다. 각 새로운 "요소"의 시작 부분에서 다른 포인터를 사용하여이를 추적합니다. 예 :

rgb* vcols = (rgb*) model_bin; 
u32* uvco = (u32*) ((char*) vcols + 2*numVcols) 

지금 자외선 텍스처의 첫 번째 값을 제외하고 모든 것이 체크 아웃됩니다. 내 내보내기 스크립트에서이를 0으로 설정하면 내 C++ 응용 프로그램이 -566558720으로 읽습니다.

그러나 UV 좌표를 반바지로 내보내고 읽으면 모든 것이 잘 동작합니다.

하지만 더 좋아집니다. 마지막 vcol [] 요소의 값을 0으로 설정하면 작성된 int를 잘 읽을 수 있습니다! 최종 vcol을 1로 설정하면 첫 번째 uvco가 65578로 읽혀집니다.

실제 코드를 보지 않고 디버깅하는 것은 매우 까다 롭지 만이 정보를 기반으로 몇 가지 통찰력이나 제안을 줄 수 있습니까?

감사합니다,

패트릭

편집 : 그것은 정말 RGB []입니다 반면, 실수, U16 []로 vcols을 썼다. rgb는 unsigned short 형식의 typedef입니다.

+0

u16 및 u32의 유형은 무엇입니까? – 101010

+0

정수 오버 플로우와 같은 냄새가납니다. Karmic 당신이 stackoverflow에 있기 때문에 :) – 101010

+0

@ 40two 그들은 각각 uint16_t과 uint32_t입니다. =) 오버플로가 발생하면 왜 내가 이전에 그것을 보지 못했을까요? 이전 버텍스 색상 또는 이전 요소를 사용 했습니까? – Senshi

답변

0

데이터 정렬에 오류가 있습니다. 아이디어를 지적한 후 나는 포인터 주소를 확인했고 포인터 주소는 4로 나눌 수 없었다. 패딩을 추가하면 문제가 해결되었습니다.

0

메모리의 다른 부분을 덮어 쓰는 이유를 알아 내기 위해 코드를 디버깅해야하지만, 그럴 경우 충격을받지 않을 것입니다.

모든 캐스팅의 대안으로 데이터를 필수 변수에 memcpy() 할 수 있습니다.

u32 ar; 
memcpy(&ur, model_bin, sizeof(u32)); 

내 의견에 게시 한 링크를 사용하면 포인터 캐스팅으로 인해 긴장감을 느낄 수 있습니다. memcpy()를 사용하는 것이 더 안전하며 모든 컴파일러 경고 및 오류가 발생하지는 않습니다.

+0

memcpy()는 메모리에서 이진 데이터를 원하지 않기 때문에 실제로 옵션이 아닙니다. 총 4MB 만 사용할 수 있습니다. = / – Senshi

관련 문제