2012-04-02 23 views
3

次のコードをcからC++に変換する際に問題があります。
argとしてmoveシーケンス(aからiまでの文字列)をとる関数があります。char配列へのポインタ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++のような文字列を使用するようにコードを交換しようとした:主な機能に

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

とC++の文字列のヘッダーファイルを追加します:mkmove機能defenitionで

void mkmove(std::string* move) { 

、との

#include <string> 

ここでエラーが発生します:
main.cpp:関数 'void mkmove(std :: string *)':main関数の 'int main()'で:
()内の 'std :: string {aka std :: basic_string}'を 'char *'に変換することはできません。
main.cpp: main.cpp:19:39:error:スカラーオブジェクト 'movestr'にイニシャライザの要素が1つ必要です

私はまたいくつかの調整を試みましたが、コンパイル時にエラーが発生しませんでした。

トップコードをCからC++に変換する適切な方法は何ですか?

ありがとうございました!

-Slovenia1337

答えて

5

使用

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

または(Uを歌うC++ 11) 'std :: vector movestr = {" abde "、" abc "、...}; ' – bames53

5

いいえ、警告ではありませんあなたがstringを使用する必要がありますので、それは文字列がされているため、読み取り専用です。

char ...[]またはconst char *という文字列を宣言してください。あなたのケースでは

、あなたがconst char *からchar *に変換する非推奨の機能(あるchar *の配列を、宣言している。

+0

+1は本当にエラーの意味を説明していますが、' char const * 'の代わりに 'char *'から 'std :: string'に切り替えるのが最善でしょう。 – bames53

+0

絶対に。しかし、CコードをC++に変換すると、すべてを文字列に切り替えるのが難しくなります。これは彼の人生をはるかに簡単にします。 –

+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++ではいいえ、Cの文字列リテラルで、char[]一定である彼らは、 const char[]にある

そのため、あなたのプログラムのconstの-正しさを修正:。

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); 
} 
関連する問題