質問

ンパイルするときには、次のコード:

void DoSomething(int Numbers[])
{
    int SomeArray[] = Numbers;
}

のVS2005コンパイラの警告とエラー C2440:'初期化':変換できないからint[]'を'int[]'

理解していることかしようとしているのでしキャストを指すポインタを配列でないとなっています。だ説明の誤りに誰かの学習C++?

役に立ちましたか?

解決

んはもっとわからないであろうが必要説明のまわり:

  1. 配列で渡される値関数をC++. 何をしようとしているが、共通のアドレスの配列 DoSomething(), どのサイズ配列の個別の int でも、 size_t, かんざん)の引数。きの住所の配列 myArray の発現 &(myArray[0]).このようなものにしたい、C++で使用の名前の配列--例 myArray を保持するビズキーを全て取得し、その最初の要素になります。(クリエイティビティや混乱によってはまだまだ先長そうだから分からな.) ものでもよく、C++できる配列を指定すタイプなど int Numbers[])パラメータとしての機能が密かにも扱いるパラメータとしていたとして宣言されたポインタ(int *Numbers この場合)--います Numbers += 5 内部 DoSomething() でポイント配列の開始に位に!

  2. きを宣言する配列変数など SomeArray C++では、どちらかを明記サイズまたは"initialiserリスト", では、カンマで区切られた値のリストとブレース.ではやってはいけないことで、コンパイラを推定できるサイズの配列に基づく別の配列を主張しようとしているinitialiseで、...

  3. できないコピー一枚配列を他、initialiseつの配列からも可能です。 その場合でもパラメータ Numbers った配列(例えばサイズは1000なのポインタは、指定されたサイズの SomeArray もしも1000)、ライン int SomeArray[1000] = Numbers; 思うに違法である。


なんで DoSomething(), 初の行だけ

  1. 私を変更する必要があるの値 Numbers?
  2. だいたいの防止を呼び出し側から見て変化するかを

場合の回答のいずれかの質問は、"いいえ"ではなく、実は必要のコピー Numbers 最初の場所では使用して、忘れ別々の SomeArray 配列に格納します。

の場合は両方の質問に答えが"Yes"、コピー NumbersSomeArray 作ることです。この場合、いく SomeArray C++ vector<int> の代わりに別の配列は、この本当に簡単となる。(説明のベクトルを超マニュアルの動的メモリの割り当てを含むこれ ができ するinitialisedからその他の配列またはベクトル、電話素子のコンストラクタが必要な場合には違い、Cスタイル memcpy().)

他のヒント

型と不完全な種類があることを言ってます:

struct A;

タグながらA.と呼ばれる構造体の不完全な型です
struct A { };
第二の大きさが知られているが、

は、A.第一の大きさがまだ知られていないと呼ばれる構造体の完全な型です。

上記構造体のような不完全なクラスの種類があります。しかし、また、不完全な配列のタイプがあります:

typedef int A[];

これは、そのサイズがまだ知られていないA.呼ばれる不完全な配列型です。コンパイラは、配列がどの程度の大き知らないので、あなたは、それのうちの配列を作成することはできません。しかし、あなたは、の、それは配列を作成するの使用をののみのあなたはすぐにそれを初期化する場合はすることができます:

A SomeArray = { 1, 2, 3 };

さて、コンパイラは、配列は3つの要素を持つint配列であることを知っています。あなたはポインタで配列を初期化しようとすることは、それを作成するための配列のサイズを与えることはありませんので、コンパイラは、任意のより賢い以前よりも、と拒否しません。

エラーメッセージがより有用にしようと、コンパイラは、実際には混乱を招くものです。 Numbersパラメータが配列として宣言されていても、C / C ++(ません)実際の配列を通過しない - Numbersパラメータは、実際のポインタである

だから、エラーが本当に言うべき"cannot convert from 'int *' to 'int []'"

しかし、その後の混乱があるだろう - 「ちょっと、発現に関与する一切int*ありません」、誰かが言うかもしれない。

それはあなたが本当にとにかく取得しているものだから、ポインタとして宣言 -

このような理由から、本当に配列パラメータを避けた方が良いです。そして、C / C ++を学ぶ人に説明は配列パラメータがフィクションである事実上それらを教育すべきである - 。彼らは本当にポインタです。

私は何かを説明しようとしているときに

、私はいつも最低レベルにまで行き、そこから構築してみてください。それは彼らが私は物事を学ぶために好きなようだ、と私はあなたが彼らが知っている基本から始め、そこから構築あれば人々がより快適であることがわかります。

この場合、私はおそらくのようなもので開始したいです

  、

コンパイラがやろうとされ   代入、あなたが書いたので、   代入演算。 C ++で、あなた   直接配列に割り当てることができません、   それは、組み込みの割り当てを持っていないので、   どのような種類の演算子(、のみ   初期化子とインデックス作成がサポートされています   アレイ用)。 C ++サポートするので、   タイプのオーバーロード演算子、   コンパイラは、過負荷状態を探します   代入演算子   「割り当てられた-に」取りタイプ   「割り当てられた-から」その引数としてタイプ。   何のオーバーロードも存在しませんので、   int型を取るのint []のためのオペレータ[]   引数、上のコンパイルエラーとして   ライン、およびエラーがあなたを語っています   なぜコンパイラは、行を処理することはできません。

はい、それはちょうど私がそれも完全ではありません実現するなどサイズの知識、不完全型、について何かを言って対おそらく行き過ぎだ(例:通常の割り当て対初期化子の割り当てなどの無議論)。しかし、私の目標は、彼らが次の答え自分自身を把握することができ、そしてそのためにあなたが通常答えに到着するための思考プロセスをレイアウトしたい場所に人々を得るために通常ます。

「コンパイラは、配列がどのように大きなわからないので。」

おそらく、あなたの答えは、可能性があります。

(おそらく明確にするためのtypedefで)明示的な配列サイズがあった場合あなたの例では、仕事ができる、および可変サイズの割り当てを導入しながら、あなたはポインタを説明することができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top