2010-12-01 3 views
2

처음에는 C++과 C에 익숙하지 않으므로 쉽게 이해할 수 있습니다 :-) 둘째,이 질문에 대해 알고 있습니다. 많은 형태로 여러 번 질문을 받겠습니다.하지만 내 경우에 대한 응답을 어떻게 굴절시킬 수 있습니까?흔들기 라이브러리를 컴파일하려고합니다 : 오류 : 'const char *'에서 'char *'로의 변환이 올바르지 않습니다.

STIL 라이브러리에서 utilities.cxx 파일을 컴파일하려고합니다. 어떤 종류의 와 "오픈 소스"라이센스 (정말 LGPL 나는 그것의 여기에서 중요한 부분을 넣을 수 있다면 그래서 난 몰라 ...

코드 거기에 다음과 같은 기능이 있습니다

g++ -O3 -ffast-math -DNDEBUG -Wall -Wno-deprecated -I../lmf_v2.0 
/includes -D_FILE_OFFSET_BITS=64 -I./include -DSTIR_SIMPLE_BITMAPS -DSC_XWINDOWS 
-o opt/buildblock/utilities.o -MMD -MP -c buildblock/utilities.cxx 
buildblock/utilities.cxx: In function ‘char* stir::replace_extension(char*, const 
char*)’: 
buildblock/utilities.cxx:225: error: invalid conversion from ‘const char*’ to ‘char*’ 
make: *** [opt/buildblock/utilities.o] Error 1 
어떤 도움을 주시면 감사하겠습니다

... 덕분에

좋아, 첫 번째 부분은 이미 ... 여기에 대답 오즈 기능입니다 :

char *replace_extension(char *file_in_directory_name, 
      const char * const extension) 
{ 
char * location_of_dot = 
strchr(find_filename(file_in_directory_name),'.'); 
// first truncate at extension 
if (location_of_dot!= NULL) 
*(location_of_dot) = '\0'; 

strcat (file_in_directory_name,extension); 
return file_in_directory_name; 
} 

컴파일이 오류를 제공합니다 두 번째 오류가 발생합니다.

const char * const 
find_filename(const char * const filename_with_directory) 
{ 
const char * name; 

#if defined(__OS_VAX__) 
name = strrchr(filename_with_directory,']'); 
if (name==NULL) 
name = strrchr(filename_with_directory,':'); 
#elif defined(__OS_WIN__) 
name = strrchr(filename_with_directory,'\\'); 
if (name==NULL) 
name = strrchr(filename_with_directory,'/'); 
if (name==NULL) 
name = strrchr(filename_with_directory,':'); 
#elif defined(__OS_MAC__) 
name = strrchr(filename_with_directory,':'); 
#else // defined(__OS_UNIX__) 
name = strrchr(filename_with_directory,'/'); 
#endif 
if (name!=NULL) 
// KT 10/01/2000 name++ changed to name+1 
return name+1; 
else 
return filename_with_directory; 
} 

답변

5

이 줄은 t 그는 오류 : 첫 번째 인수로 const char*를 호출 할 때

char * location_of_dot = 
    strchr(find_filename(file_in_directory_name),'.'); 

strchr() (나는 find_filename() 있으리라 믿고있어 그렇지 않으면이 오류가 표시되지 않을 것이다하는 const char *를 반환)을 const char* 아닌 char*를 반환합니다.

strchr이 반환 한 메모리 위치에 할당하려고하므로이 오버로드 된 버전을 사용하고 싶지 않습니다. find_filename()을 변경하여 char*을 반환하십시오.

UPDATE : 당신은 이후 find_filename()에 대한 코드를 게시 한 및 반환 형식을 변경하면 다른 물건을 변경 포함 것이다 (게다가 많은 이해가되지 않습니다). 대신 find_filename()의 반환 값을 char*으로 캐스팅하거나 strchr()의 결과를 char*으로 전송하십시오.

char * location_of_dot = const_cast<char*>(
    strchr(find_filename(file_in_directory_name),'.')); 
+0

하지에 의해 훼손되지 않은 코드 표준에 따르면. –

+0

@Let_Me_Be : [이 참고서] (http://www.cplusplus.com/reference/clibrary/cstring/strchr/)를 확인하십시오. 첫 번째 인수가'char * '대신'const char *'일 때'const char *'를 반환하기 위해 오버로드 됨 – Cameron

+0

어떤 설명서가 읽히고 있습니까? 'man strchr'은'char * strchr (const char * s, int c) ;; –

0

다음과 같은 과부하를 추가 :

예 (A const cast 사용)

char* find_filename(char* filename_with_directory) 
{ 
    char const* const fname = filename_with_directory; 
    return const_cast<char*>(find_filename(fname)); 
} 

면책 조항 :. 컴파일러의 손

환호 & HTH,

관련 문제