2010-12-01 21 views
2

D'abord, je suis assez nouveau à C++ et à C donc soyez facile sur moi :-) Deuxièmement, je connais cette question J'ai été demandé plusieurs fois sous de nombreuses formes avant, mais je pourrais comprendre comment plier les réponses à mon cas ...essayant de compiler la bibliothèque d'agitation: erreur: conversion non valide de 'const char *' en 'char *'

Je suis en train de compiler un fichier appelé utilities.cxx de la bibliothèque STIL qui a une sorte de et une licence « open source » (pas vraiment LGPL et donc je ne sais pas si je peux mettre des pièces ici importantes de celui-ci ...

le code a la fonction suivante dans le:

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

donne l'Compiler erreur:

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 

Toute aide serait appréciée ... Merci,

Oz

Ok, première partie déjà répondu ... voici la fonction qui provoque la deuxième erreur:

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

Répondre

5

Cette ligne provoque t il erreur:

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

strchr() retourne un const char*, pas char* lorsqu'elle est appelée avec un const char* comme premier argument (je suppose find_filename() retourne une const char *, sinon vous ne verrions pas cette erreur).

Étant donné que vous souhaitez affecter à l'emplacement de mémoire renvoyé par strchr, vous ne souhaitez pas utiliser cette version surchargée. Remplacez find_filename() pour renvoyer un char*.

MISE À JOUR: Vous avez depuis affiché le code pour find_filename() et changer le type de retour impliquerait de changer d'autres choses (et ne fait pas beaucoup de sens en plus). À la place, attribuez la valeur de retour find_filename() à char* ou attribuez le résultat strchr() à char*.

Exemple (utilise un const cast):

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

Non. selon la norme. –

+0

@Let_Me_Be: Consultez [cette référence] (http://www.cplusplus.com/reference/clibrary/cstring/strchr/). Il est surchargé pour renvoyer 'const char *' quand le premier argument est 'const char *' au lieu de 'char *' – Cameron

+0

Quel manuel est ... en train de lire? 'man strchr' dit' char * strchr (const char * s, int c); ' –

0

ajouter la surcharge suivante:

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

Avertissement: le code intact par les mains du compilateur

cheers & HTH,