2012-04-02 5 views
3

У меня проблема с преобразованием следующего кода из c в C++:
У меня есть функция, которая принимает массив последовательностей перемещения (последовательность символов от a до i) в качестве arg.указатель на массив символов C++

код:

void mkmove(char** move) { 
    int i = 0; 
    char* p = NULL; 
    int moves[9][9]; 

    for(int i = 0; i < 9; i++) { 
     for(p = move[i]; *p; p++) { 
      moves[i][*p - 'a'] = 3; 
     } 
    } 
} 

int main() { 
    char* movestr[] = {"abde", "abc", "bcef", "adg", "bdefh", "cfi", "degh", "ghi", "efhi"}; 
    mkmove(movestr); 

    return(0); 
} 

GCC компилирует этот код отлично, но если я пытаюсь скомпилировать его с г ++ он дает мне следующее предупреждение:
main.cpp: 17: 39: предупреждение: не рекомендуется использовать преобразование из строки константа в 'char *' [-Wwrite-strings]

Я считаю, что это предупреждение исходит из того факта, что строка в C определяется как char [], в то время как C++ использует std :: string.
Так что я попытался заменить код, чтобы использовать строки C++, как это:

void mkmove(std::string* move) { 

в mkmove функции Defenition, а также:

std::string* movestr = {'abde', "abc", "bcef", "adg", "bdefh", "cfi", "degh", "ghi", "efhi"}; 

в основной функции и добавьте ++ файл заголовка строки C:

#include <string> 

, но теперь я получаю ошибки:
main.cpp: В функции 'void mkmove (std :: string *)':
main.cpp: 11: 21: error: невозможно преобразовать 'std :: string {aka std :: basic_string}' в 'char *' при назначении
main.cpp: В функции 'int main()':
main.cpp: 19: 39: ошибка: скалярный объект 'movestr' требует наличия одного элемента в инициализаторе

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

Итак, что является правильным способом преобразования верхнего кода с C на C++?

Спасибо за ответы!

-Slovenia1337

ответ

5

использование

std::string movestr[] = {"abde", "abc", "bcef", "adg", "bdefh", "cfi", "degh", "ghi", "efhi"}; 
+0

Или (и sing C++ 11) 'std :: vector movestr = {" abde "," abc ", ...}; ' – bames53

5

Нет, это предупреждение не потому, что вы должны использовать string, это потому, что строки символов только для чтения.

Либо объявлять строки как char ...[], либо как const char *.

В вашем случае, вы объявить массив char *, который является устаревшей функции (преобразовывая от const char * до char *.

+0

+1 для объяснения того, что на самом деле означает ошибка, но, вероятно, лучше переключиться с' char * 'на' std :: string' вместо 'char const *' – bames53

+0

Абсолютно. Но если он преобразует C-код в C++, будет сложнее переключить все на 'string', это просто сделает его жизнь намного проще. –

+0

Я думаю, какой способ лучше всего зависит от того, сколько нужно преобразовать. Если приведенный выше код является фактически всей программой, я бы переключился на типы C++. (Конечно, очевидно, что это не целая программа, или если она ничего не делает) – bames53

0

I believe this warning comes from the fact that string in C is defined as char[] , while c++ uses std::string .

Нет, в C строковые литералы являются постоянными char[], в то время как в C++ они является const char[]

Закрепить константную-правильность вашей программы, таким образом:.

void mkmove(const char** move) { 
    const char* p; 
    int moves[9][9]; 

    for(int i = 0; i < 9; i++) { 
     for(p = move[i]; *p; p++) { 
      moves[i][*p - 'a'] = 3; 
     } 
    } 
} 

int main() { 
    const char* movestr[] = {"abde", "abc", "bcef", "adg", "bdefh", "cfi", "degh", "ghi", "efhi"}; 
    mkmove(movestr); 

    return(0); 
}