2011-05-02 3 views
1

여기에있는 C OpenGL 텍스처로드 코드를 이식하려고합니다 : to C++. 교체하는 가장 좋은 방법은 무엇 특히BYTE C 매크로에 대한 C++ 대체

GLuint texture; 
int width = 256, height = 256; 
BYTE * data; 
FILE * file; 

// open texture data 
file = fopen(filename, "rb"); 
if (file == NULL) return 0; 

// allocate buffer 
data = malloc(width * height * 3); 

// read texture data 
fread(data, width * height * 3, 1, file); 
fclose(file); 

: 특히 내가 파일에서 일부 텍스처에서 읽기를 처리하기 위해 노력하고있어, 관용적 및 휴대용 방식으로 다음 코드를 재 작성하는 가장 좋은 방법은 무엇인가 이식 가능한 C++ 방식의 BYTE 매크로?

EDIT : BYTE 매크로가 현재 작업하고있는 환경에 정의되어 있지 않습니다. 올바른 유형을 typedef 할 수 있도록이 기본 유형이 다른 시스템에 있는지 알아 내려고했습니다.

+2

무엇 매크로가 확장 하는가? 왜 그냥 사용할 수 없니? BYTE *, 그 char * 또는 unsigned char * –

+0

이 특별한 시스템에서는 BYTE가 정의되지 않은 것처럼 보입니다. 또한 나는 독점적으로 C++ 인 코딩 표준을 유지하려고 노력하면서 코드를 그대로 두지 않을 것입니다. – shuttle87

답변

2

C 코드 C++로 컴파일 할 때 잘 작동해야합니다.

BYTE 유형을 사용하는 대신 OpenGL 정의 유형 GLbyte을 사용하십시오. 이는 실제로 API가 사용하는 실제 유형입니다. 따라서 그것은 gl.h에 정의되어

typedef signed char GLbyte; 

C++로 위의 코드의 매우 빠른 (안된!) 번역 같은 일이 될 것이다 :

GLuint texture; 
unsigned width = 256, height = 256; 
unsigned buffer_size = width * height * 3; 
GLbyte * data; 
std::ifstream file; 

// open texture data 
file.open(filename, ios_base::in | ios_base::binary); 
if (!file) return 0; 

// allocate buffer 
data = new BYTE[buffer_size]; 

// read texture data 
file.read(data, buffer_size); 
file.close(); 

// Process data... 
// ... 

// Don't forget to release it when you're done! 
delete [] data; 
+0

아, 좋아, GLbyte 정확히 내가 필요한 것 같습니다! – shuttle87

+0

몇 가지 정리를하면 거의 작동하지만 컴파일러 오류 'error :'GLbyte * '에서'std :: basic_istream :: char_type * '[-fpermissive]'로 잘못 변환됩니다. 이것은'file.read (data, buffer_size); 라인의 것입니다. – shuttle87

+0

이것은 서명/서명되지 않은 문제 일 가능성이 큽니다. 이 경우 바이너리 데이터 블록으로 간주하므로 캐스트를 추가하여 컴파일러를 해시 할 수 있습니다. C++에서는'static_cast (data)'가 더 관용적 일 것이라고 생각합니다. – gavinb

0

바이트 *이 경우 char * 또는 unsigned char * 매크로 일뿐입니다. 나는 틀릴 수도 있지만 의심 스럽다. 따라서 프로그램에서 char * 또는 unsigned char *를 사용하는 것은 동일합니다. 그러나 C에서 C++로 이식하는 경우 C++ 표준 라이브러리에서 ifstream (바이너리 모드로)을 사용하는 것이 좋습니다.

0

사용 unsigned char 대신 BYTE가 -.. 예상대로 (당신이 malloc()의 반환 값을 캐스팅해야 할 수도 있습니다 작동합니다

3

을 원래의 코드는 휴대용 가정하면, 당신은 그냥 당신이 끌어 오기 확인을 남길 수 있습니다 같은 BYTE의 정의입니다. 해당 헤더가 여전히 그래서 C++ 컴파일러는 C에 이전 버전과 호환됩니다.

(BYTE 매크로가 정말 있다면, 아마도 typedef을 것입니다.)

+0

이 시스템에서 BYTE는 정의되지 않습니다. – shuttle87

+0

그래서 이전 시스템에 정의를 가져 와서 통합 할 수 있는지 확인하십시오. 코드를 손상시키지 않으려면 여기에서 동일한 설정이 필요합니다. –