2012-05-03 10 views
1

unsigned char配列zへの参照をmyfunc()内に作成することはできません。私はいくつかの方法を試しましたが、それを理解できません。配列への参照

int myfunc (int &y, unsigned char (&z)[2]); 

int main(int argc, char *argv[]) { 
int y = 1; 
unsigned char z[2]; 

int x = myfunc(y, z[2]); 
} 

int myfunc(int &y, unsigned char (&z)[2]) { 
y = 123; 
z[0] = foo; 
z[1] = bar; 
return 456; 
} 

私は取得しています、次のエラー:行のために

error: in passing argument 2 of ‘int myfunc(int&, unsigned char (&)[2])’ 

int myfunc (int &y, unsigned char (&z)[2]);

そして:ラインint x = myfunc(y, x);については

error: invalid initialization of reference of type ‘unsigned char (&)[2]’ from expression of type ‘unsigned char’ 

これは私の最も最近の試みであります

配列を参照する方法は何ですか(参照配列ではありません)?

+0

ベクターを使用すると、これは本当に簡単になり、そうでない場合は生の配列よりもはるかに優れています。とにかく、単一の要素を渡してあなたの関数を呼び出しています。 'z [2]'ではなく 'z'を使います。 – chris

+0

私はこの側面に沿ってベクトルを学習しようとしていますが、これでどのように簡単になりますか?私がこの作業を行うために見ることができる唯一の方法は、配列がグローバルに定義されるようにすることです。 – jwbensley

+1

ベクトルでは、あなたの署名は 'int myfunc(int&y、std :: vector &z)'となります。他の種類のパラメータを使用することで期待される構文を提供します。 – chris

答えて

10
myfunc(y, z[2]); 

発現z[2]unsigned charである(及びアレイの端部を越えて要素を指し、それは未定義の動作です)。あなたは何をしたい:

myfunc(y, z); 
+0

スピーディーな応答ありがとう:) – jwbensley

2

コールは次のようになります。int x = myfunc(y, z);

zunsigned char [2]が、z[2]charを入力をそれぞれ表すためです。また、z[2]は、範囲外の配列にアクセスします。

+1

あなたもスピーディーな応答のおかげで:) – jwbensley

1

私はあなたがしようとしていることについて少し混乱しています。 IMHOあなたの署名はちょうどint myfunc (int &y, unsigned char z[2])でなければなりません。

配列は "値で"渡されません(そうしたい場合はベクトルを使用するのが最も簡単です)、デフォルトではmyfuncであると想定されていたと仮定します(私があなたの欲望を誤解していない限り)。

署名int myfunc (int &y, unsigned char (&z)[2])あなたは、呼び出し元(zのではないだけの要素)にzの値そのものを変更する場合がありますことを示唆しているが、それでも、呼び出し側はそれを行うことができない(!)、そしてあなたが買ってあげます試してみるとエラーです。必要なら、実際のポインタを使用してください。

ここでです。宣言された配列サイズを強制するために、例の構文を使用して配列を参照渡しする正当な方法です。しかし、あなたが学んでいるだけであれば、これについてまだ心配する必要はないと思います。

関連する問題