2013-05-01 53 views
0

Я провел много часов здесь, чтобы найти помощь по поводу того, что, по-видимому, является общей ошибкой, но ни один из тех, что я видел, подходит моему делу.ошибка C2440: '=': невозможно преобразовать из 'const char *' в 'char *'

Я переношу старую программу, написанную на Visual Studio 6 C++, в Visual Studio 2012 и, к счастью, для меня, поскольку я не программист на C++ (просто скромный разработчик VB и C#). Мастер миграции и Интернет помогли мне найти и исправить код, который мастер не может обработать.

В этом блоке кода, который я считаю, ничего не делает больше, чем создание каталога

int CreateAllDirectories(const char* pszDir) 
{ 
char* pszLastSlash; 
char cTmp; 


if(_access(pszDir, 0) != -1) { 
    // it already exists 
    return 0; 
} 

pszLastSlash = strrchr(pszDir, '\\'); 
if (pszLastSlash) { 
    cTmp = *pszLastSlash; 
    *pszLastSlash = '\0'; 

    // try again with one less dir 
    CreateAllDirectories(pszDir); 

    *pszLastSlash = cTmp; 
} 

if (_mkdir(pszDir) == -1) { 
    return -1; 
} 

return 0; 

}

ошибка генерируется, когда результаты strrchr (pszDir, «\») назначены на переменная pszLastSlash. Из остальной части этого кода это выглядит как pszLastSlash = strrchr (pszDir, '\'); является допустимым выражением.

Является ли проблема с двойной обратной косой чертой, которая для меня выглядит и уходит от последовательности.

ответ

3

Может быть, в этой линии ...

pszLastSlash = strrchr(pszDir, '\\'); 

pszLastSlash не является постоянной, но pszDir постоянна. Есть два DEFS для strrchr() (см http://www.cplusplus.com/reference/cstring/strchr/) ...

const char * strchr (const char * str, int character); 
     char * strchr (  char * str, int character); 

Поскольку вы вводите постоянный символ *, он будет пытаться использовать размораживание, который возвращает константный символ *, но вы присваиваете его к не-const char *. Я думаю, это то, что порождает вашу ошибку.

Потому что pszDir is const, указатель, возвращаемый вам, является константой, потому что вы не должны изменять область памяти, на которую указывает pszDir.

Если вы выделили pszDir самостоятельно, и вы знаете, что это safe, чтобы изменить, ваш может уменьшить ваш const contraint в функции def? Т.е.,

int CreateAllDirectories(char* pszDir) 

Но только делать это pszDir является строка, которая у вас есть, и может изменить :)

Я просто заметил в C++ ссылка на страницу, которая ...

In C, this function is only declared as: 
    char * strchr (const char *, int); 

Итак, если вы ранее использовали C, то это объясняет, почему вы видите ошибку сейчас.

+2

Да, это ответ. Вы также можете предложить изменить 'const char * pszDir' на' char * pszDir', потому что он может быть изменен внутри функции. Или сделайте копию. – soon

+0

Итак, вы рекомендуете, чтобы он попытался изменить параметр 'pszDir' в' CreateAllDirectories() ', чтобы получить облегчение? –

+0

@ Сун: спасибо за комментарий, обновлено. Я думаю, что он должен изменить только constzness pszDir, если он знает, что это безопасно писать, хотя ... – Jimbo

0

С этой линией

*pszLastSlash = '\0'; 

модифицирует буфер передается в вашу функцию, вы не должны обещать абонент, что вы не будете изменять буфер.Поэтому

int CreateAllDirectories(char* pszDir); 

правильная подпись

0

Вы можете попробовать поставить новый, в середине

pszLastSlash = strrchr(pszDir, '\'); 

Таким образом, это будет

:pszLastSlash = new strrchr(pszDir, '\'); 
Смежные вопросы