ページ 1 / 1
int型配列が戻り値の関数
Posted: 2010年5月18日(火) 20:17
by ななし
int型配列を戻り値にする関数を作りたいのですが、配列は戻り値に指定できないため、intのポインタを反すものを用意しました。
が、その配列から受け取ったデータをfor文でまわし、添字アクセスするとなかみがみれませんでした。文法的によろしくなかったのでしょうか?
Re:int型配列が戻り値の関数
Posted: 2010年5月18日(火) 20:20
by box
ソースコードを見せてください。
詳しい話はそれからです。
Re:int型配列が戻り値の関数
Posted: 2010年5月18日(火) 20:28
by ななし
質問主です。
あるクラスAで
// クラスのメンバ変数
int _array[5];
を宣言し、
for(int i=0; i<sizeof(_array)/sizeof(_array[0]); i++){
_array = i;
}
のように初期化し、
そのクラスのメンバ関数として
int* getArray()
{
return _array;
}
を用意し、
別のクラスから
int* array = Aクラスへのポインタ->getArray();//配列取得
int arraysize = sizeof(array)/sizeof(array[0]);//arraysizeが1になっている
for(int i=0; i<arraysize; i++){
_array = i;
}
といった感じ取得しましたが配列の先頭しか見えてませんでした。
説明が下手ですみません。よろしくお願いします。
Re:int型配列が戻り値の関数
Posted: 2010年5月18日(火) 20:37
by たいちう
> といった感じ取得しましたが配列の先頭しか見えてませんでした。
> 説明が下手ですみません。よろしくお願いします。
配列の先頭アドレスだけから、配列の長さを知ることはできません。
次のような方法などなら使えます。
私だったらstd::vectorを使いますけど。
int ClassA::getArray(int **array) {
*array = array_;
return sizeof(array_)/sizeof(array_[0]);
}
それとC/C++で、変数名を"_"で始めてはいけません。
全て予約語です。
Re:int型配列が戻り値の関数
Posted: 2010年5月18日(火) 21:05
by ななし
たいちうさん
>配列の先頭アドレスだけから、配列の長さを知ることはできません。
確かに、そうですね。
というか配列サイズもですが、添え字アクセスした中身もデバッガで追ったところ
見えていませんでした。
>私だったらstd::vectorを使いますけど。
今回は配列が固定だったので素直に書いていました。
vectorで同じように書いてみたところ、サイズも.size();で取得できるしこちらの方が使い勝手よさそうですね。
>それとC/C++で、変数名を"_"で始めてはいけません。
>全て予約語です。
予約語とは知りませんでした。
今回はメンバ変数に目印として付けていましたが、今後気をつけます。
vectorで要求する動作ができましたので打ち切りたいと思います。ありがとうございました。
Re:int型配列が戻り値の関数
Posted: 2010年5月18日(火) 21:40
by たかぎ
サイズが固定なら、arrayクラステンプレートを使うか、配列へのポインタを使うのもよいかと思います。
int (*getArray())[5];
のようにです。
> それとC/C++で、変数名を"_"で始めてはいけません。
> 全て予約語です。
違います。
Cの場合、下線で始まり、下線または大文字が続く識別子は予約済み識別子になります。
また、通常の名前空間またはタグ名前空間におけるファイル有効範囲を持つ識別子については、下線で始まる全識別子が予約済み識別子になります。
C++の場合、1個の下線で始まり大文字が続くか、2個の下線を含む識別子は予約名になります。
また、下線で始まる名前は、大域的名前空間における名前として処理系に予約されています。
ルールが煩雑ですので、下線で始まる名前は全廃する方が無難ですが、だからといって、下線で始まる名前があらゆる状況で常に予約されているわけでもなければ、予約語でもありません。
Re:int型配列が戻り値の関数
Posted: 2010年5月19日(水) 10:50
by ななし
解決済みとしましたがあらたな所でつまずきました。
>配列の先頭しか見えてませんでした。
は解決したのですが、次にこの取得した配列(_array)を
Bクラスのローカル関数の中で
int* array = Aクラスへのポインタ->getArray();//配列取得
for(int i=0; i<sizeof(array)/sizeof(array[0]); i++){
array = 10;//値を代入
}
といったように上書きして保存する、ということをしたいのですが
毎ループ上書きした値が保持されていません。
この場合
arrayをAクラスのstaticなメンバ変数として宣言し、値を一意に保つようにするのがよいのでしょうか?
>予約語
ルールを一度調べて確認してみたいと思います。
Re:int型配列が戻り値の関数
Posted: 2010年5月19日(水) 11:11
by たいちう
予約語は言いすぎでしたね。予約されていると書くつもりでした。
が、予約されていないこともあるとは...orz
ご指摘ありがとうございました。