пытается скомпилировать библиотеку stir: ошибка: неверное преобразование из 'const char *' в 'char *' - PullRequest
2 голосов
/ 01 декабря 2010

Во-первых, я довольно новичок в C ++ и C, так что будьте осторожны со мной :-) Во-вторых, я знаю, что этот вопрос задавался много раз во многих формах раньше, но я мог понять, как согнуть ответы на мой случай....

Я пытаюсь скомпилировать файл с именем utilities.cxx из библиотеки STIL, который имеет какую-то лицензию с открытым исходным кодом (на самом деле не LGPL, и поэтому я не знаю, смогу ли я поставитьвот его существенные части ...

Код имеет следующую функцию:

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;
}

Компиляция выдает ошибку:

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

Любая помощь будетбыть оцененным ... Спасибо,

Oz

Хорошо, первая часть уже ответила ... вот функция, которая вызывает вторую ошибку:

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;
}

Ответы [ 2 ]

5 голосов
/ 01 декабря 2010

Эта строка вызывает ошибку:

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

strchr() возвращает const char*, а не char* при вызове с const char* в качестве первого аргумента (я предполагаю, что find_filename() возвращает const char *, в противном случае вы не увидит эту ошибку).

Поскольку вы хотите назначить ячейку памяти, возвращаемую strchr, вы не хотите использовать эту перегруженную версию. Измените find_filename(), чтобы получить char*.

ОБНОВЛЕНИЕ: Вы с тех пор опубликовали код для find_filename(), и изменение типа возврата повлечет за собой изменение других вещей (и, кроме того, не имеет особого смысла). Вместо этого приведите либо возвращаемое значение find_filename() к char*, либо приведите результат strchr() к char*.

Пример (используется const cast ):

char * location_of_dot = const_cast<char*>(
    strchr(find_filename(file_in_directory_name),'.'));
0 голосов
/ 01 декабря 2010

добавить следующую перегрузку:

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

отказ от ответственности: код не тронут руками компилятора

ура и hth.,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...