2013-04-05 6 views
1

ACT (Adobe Color Table) 파일을 일반 텍스트로 읽을 수있는 JASC-PAL 파일로 변환하는 프로그램을 C++로 작성했습니다. ACT 파일에서 이진 데이터를 읽고이를 메모리에 저장하여 사용하고 싶습니다. 나는 그것을하기 위해 다음 코드를 작성했으며 BCC55를 사용하여 빌드한다. 문제는 빌드 경고가 발생한다는 것입니다. "경고 W8079 : read_file() 함수에서 서로 다른 'char'형식의 포인터를 혼합합니다.다른 char 유형에 대한 C++ 믹싱 포인터

unsigned char * memblock; 

bool read_file() 
{ 
    int filesize; 
    ifstream act ("test.act", ios::binary|ios::ate); 
    if (act.is_open()) 
    { 
     filesize = act.tellg(); 
     act.seekg(0); 
     memblock = new unsigned char [filesize]; 
     act.read(memblock, filesize); 
     act.close(); 
     cout << "Color Table loaded to memory." << endl; 
     return true; 
    } 
    else 
    { 
     cout << "Failed to open file." << endl; 
     return false; 
    } 
} 

내가 정기적으로 문자 포인터를 기대 함수에 서명 숯불 포인터를 통과하고 있기 때문에 것으로 보인다 엠바 카데로 문서를 위키에서이 경고를 찾고 있습니다. 이것은 기술적으로 부정확하지만 일반적으로 무해하다고 말합니다. 내 질문은 이것이 엄격하게 말하면, 틀린 것이라면 어떻게 빌드 타임에 W8079 경고를 발생시키지 않고 이것을 수행 할 것인가? 경고가 무해하고 코드가 예상대로 작동하므로이 작업을 귀찮게해야합니까?

+0

보통 컴파일러의 경고를 무시해서는 안됩니다 ... 메모리를 어딘가에 배포하고 있습니까? 이것은 더 나쁜 것입니다 ... –

+0

왜'memblock'에'unsigned char'을 사용하고 있습니까? –

+1

서로 다른 API가 모일 때 특정 CI/O 타입이'char'이지만, 바이트 스토어 배열의 자연 타입은'unsigned char'입니다 ... 행복하게, 타입은 완전히 레이아웃 호환 가능합니다. 그러나 어느 시점에서 캐스트를 넣어야 할 수도 있습니다. –

답변

1

캐스트를 추가하십시오. 이 경우에는 간단한 C 캐스트 만 사용합니다.

act.read((char*)memblock, filesize); 

하지만 당신은뿐만 아니라

act.read(reinterpret_cast<char*>(memblock), filesize); 

을 reinterpret_cast 사용할 수 있지만, 이것은 그것보다 그것이 더 큰 거래를 보일 수 있습니다. 설명서에 의하면, 이것은 무해합니다.

+0

고마워,이 경우에는 포인터 유형이 문제가되지 않는다고 생각한다. 내가 서명 한 char을 사용하는 이유는 읽은 데이터가 숫자로 해석되고 음수 값이 일반 char로 넘쳐 났기 때문입니다. – Devin

+0

C++ 코드에서 C 스타일 캐스트를 권장하지 마십시오. 코드에서 깨지기 쉬운 지점을 도입하고 데이터 유형과 동기화되면 정의되지 않은 동작을 일으키며 도구로 찾기 어렵습니다 (http://stackoverflow.com 참조)./questions/15408658/replace-cast-by-function-call-in-c). 코드에 코드를 추가 할 때 코드가 올바르더라도 기본적으로 코드를 확장/유지 관리 할 때 명시 적으로 관리해야하지만 코드 기반에서는 찾기가 어렵습니다. – utnapistim

+0

이 코드에서는 C 스타일 캐스트를 사용하면 향후 문제가 발생할 수있는 유지 관리 작업을 생각할 수 없습니다. 그렇지 않으면 추천하지 않았을 것입니다. – john

관련 문제