2016-08-01 2 views
0

私はその件について多くのことを読んでいて、私は混乱しています。そして、私はここにstrcpyの機能上のエラーを取得し文字列ポインタのstrcpyはエラーを返します

char *builtinFunctions[20]; 

void Intepreter::setBuiltIns(char *builtins) 
{ 
    strcpy(builtinFunctions, builtins); // no matching function call to strcpy 
} 

私はおそらく理解していないcppファイルで作業していない、Cファイルで作業するために使用何

ここでの基本ですが、なぜC++ではこれが機能しないのですか(代わりに=を使用する必要がありますか)

strcpy(char *, const char*) = thats the structure 

builtinFunctionsをポインタとして使用していない場合は、それを動作させます。

EDIT:それがなかった

builtinFunctions[0]="me"; 

と:とき Why is conversion from string constant to 'char*' valid in C but invalid in C++

char *builtinFunctions[20];という警告が生成されます: この編集前のconstであることの理由は、私はここで読むことです。私はconstを削除することでそれを修正することができます。

+1

これはCでも動作しません。 'builtinFunctions'の型は何ですか? – Barry

+0

あなたは私が間違っていることを理解するのを助けることができますか? (変数のconstはC++コンパイラで必要です。そうでなければ警告が表示されます) – Curnelious

+1

@Curneliousです。質問に答えて。 – Barry

答えて

3

これは、charへのポインタの配列です。

char *builtinFunctions[20]; 

だからないstrcpy(char *dest, const char *src)として、strcpy(char **, char*)として扱われます

strcpy(builtinFunctions, builtins); 

を呼び出します。したがって、最初のパラメータタイプが不一致になります。

EDIT:

それでは、builtinFunctionsは、あなたがそれだと最初のパラメータは、新しい着信単語へのポインタであることだけであることを行うためのものvoid Intepreter::setBuiltIns(char *builtins)と、移入したい「という言葉の配列」であると仮定してみましょう。 (そして、あなたはCスタイルのやり方でこれをやっています。まあ、あなた次第です)

いくつかのことを考慮する必要があります。

  1. あなたは、配列の名前、配列type arrName[N];を宣言する場合 はインデックスなしすべて単独で使用されているがタイプ type *arrNameの変数として扱われます。最初にchar *と入力した場合、 builtinFunctionsそのものはchar**です。だからあなたの strcpyは失敗しますが、strcpy(builtinFunctions[someIndex], builtins); が機能します。

  2. 宛先スペースが割り当てられている場合は、strcpyを呼び出す前に考慮する必要があります。 builtinFunctions[someIndex]は タイプchar *です。それはどこを指していますか?それは 割り当てられたスペースへの有効なポインタ、または未定義の振る舞いへのゲートウェイstrcpyはあなたを幸せに連れて行くでしょうか?

+0

この関数でこのポインタに新しい値をどのようにコピーしますか?私はそれをポインタから変更する必要がありますか?それは単語の配列でなければなりません。これは私がポインタを使用した理由です(例:{"aaa"、 "bob"、); – Curnelious

+0

編集する編集を参照してください。 –

関連する問題