質問です。
構造体配列をサブルーチンに渡す方法を教えてください。
構造体配列をサブルーチンに渡す
Re: 構造体配列をサブルーチンに渡す
これでいいですか
#include <iostream>
const size_t ARRAY_SIZE = 5;
struct STest{ int val; };
void SubRoutine( STest (&arg)[ARRAY_SIZE] )
{
for( size_t i=0; i<ARRAY_SIZE; ++i )
{ std::cout << arg[i].val << std::endl; }
}
int main()
{
STest array[ARRAY_SIZE] = { {1},{2},{3},{4},{5} };
SubRoutine( array );
return 0;
}
Re: 構造体配列をサブルーチンに渡す
と書くのが最も一般的です。
と書いても、 と書いても構いませんが、 と書き方は初めて見ました。
こういう書き方をするのに何かメリットがあるのでしょうか?
int の配列でも と書くんでしょうか?
Re: 構造体配列をサブルーチンに渡す
>...と書き方は初めて見ました。
>こういう書き方をするのに何かメリットがあるのでしょうか?
あなたが初めて見たから何なのですか?
使いどころが少ないかどうかはともかくとして,
質問に 答えの一つ を提示したに過ぎません.
>メリット
メリットと言えるかどうかわかりませんが,サイズ指定できるという点で
あなたの他の記述方法とは異なっていると思います.
>int の配列でも ... と書くんでしょうか?
データの型が何であるか,が,ここでの話に何か影響するのでしょうか?
どの書き方を採用するかどうかについては単にケースバイケースでは?
>こういう書き方をするのに何かメリットがあるのでしょうか?
あなたが初めて見たから何なのですか?
使いどころが少ないかどうかはともかくとして,
質問に 答えの一つ を提示したに過ぎません.
>メリット
メリットと言えるかどうかわかりませんが,サイズ指定できるという点で
あなたの他の記述方法とは異なっていると思います.
>int の配列でも ... と書くんでしょうか?
データの型が何であるか,が,ここでの話に何か影響するのでしょうか?
どの書き方を採用するかどうかについては単にケースバイケースでは?
Re: 構造体配列をサブルーチンに渡す
> あなたが初めて見たから何なのですか?
一次元配列を引数として渡す方法にこんな書き方ができるのか、と感心したのです。
最初は、二次元配列の間違いかと思いました。
void func(int a[X_SIZE][Y_SIZE]) を
void func(int (*a)[Y_SIZE]) と書くのはよく見ます。
ところが、* (ポインタ) じゃなくて、& (参照) なんですよね。
確かに、一次元配列をこれで渡せますが、
void func(int *a) と書くのが普通だよなあ。
きっと他の人もそう思って、誰かがそれを書いてくれるだろうと、
私は回答を保留して、そのまま忘れていました。
そしたら、質問者が、参照を使う書き方に納得して解決にしてしまったので、
私がポインタを使う書き方を回答しました。
> データの型が何であるか,が,ここでの話に何か影響するのでしょうか?
データの型は何も影響しません。
質問者は、「構造体配列」の渡し方を訪ねています。
おそらく、int の配列や char の配列の渡し方は分かっているが、
構造体の配列は、きっと異なるだろうと考えて質問したのだと
私は推測しました。
私は、構造体でも int でも、どんな型でも、配列なら渡し方は同じだと
言いたくて「int の配列でも」と書いたのですが、言葉足らずでした。
> どの書き方を採用するかどうかについては単にケースバイケースでは?
そのとおりですが、質問者が回答を得た時点では、参照を使う方法しか
示されていません。
質問者は、「やっぱり、構造体配列の渡し方は int の配列の渡し方とは
違うんだ」と誤解してはいかないかと、私は心配しました。
一次元配列を引数として渡す方法にこんな書き方ができるのか、と感心したのです。
最初は、二次元配列の間違いかと思いました。
void func(int a[X_SIZE][Y_SIZE]) を
void func(int (*a)[Y_SIZE]) と書くのはよく見ます。
ところが、* (ポインタ) じゃなくて、& (参照) なんですよね。
確かに、一次元配列をこれで渡せますが、
void func(int *a) と書くのが普通だよなあ。
きっと他の人もそう思って、誰かがそれを書いてくれるだろうと、
私は回答を保留して、そのまま忘れていました。
そしたら、質問者が、参照を使う書き方に納得して解決にしてしまったので、
私がポインタを使う書き方を回答しました。
> データの型が何であるか,が,ここでの話に何か影響するのでしょうか?
データの型は何も影響しません。
質問者は、「構造体配列」の渡し方を訪ねています。
おそらく、int の配列や char の配列の渡し方は分かっているが、
構造体の配列は、きっと異なるだろうと考えて質問したのだと
私は推測しました。
私は、構造体でも int でも、どんな型でも、配列なら渡し方は同じだと
言いたくて「int の配列でも」と書いたのですが、言葉足らずでした。
> どの書き方を採用するかどうかについては単にケースバイケースでは?
そのとおりですが、質問者が回答を得た時点では、参照を使う方法しか
示されていません。
質問者は、「やっぱり、構造体配列の渡し方は int の配列の渡し方とは
違うんだ」と誤解してはいかないかと、私は心配しました。
Re: 構造体配列をサブルーチンに渡す
おそらく、usaoさんは「構造体配列の先頭要素へのポインタ」ではなく「構造体配列」の渡し方を書いたのだと思います。かずま さんが書きました:> どの書き方を採用するかどうかについては単にケースバイケースでは?
そのとおりですが、質問者が回答を得た時点では、参照を使う方法しか
示されていません。
質問者は、「やっぱり、構造体配列の渡し方は int の配列の渡し方とは
違うんだ」と誤解してはいかないかと、私は心配しました。
「配列」の渡し方も「配列の先頭要素へのポインタ」の渡し方も、構造体でもintなどでも変わらないはずです。
ただし、ほとんどの場合「配列の先頭要素へのポインタ」を渡せば足りると思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 構造体配列をサブルーチンに渡す
>質問者は、「やっぱり、構造体配列の渡し方は int の配列の渡し方とは違うんだ」と誤解してはいかないかと、私は心配しました。
なるほど,そういうことでしたか.
補足感謝します.
普通に(?)書くならこんな感じですね.
なるほど,そういうことでしたか.
補足感謝します.
普通に(?)書くならこんな感じですね.
オフトピック
先頭要素へのポインタを渡すという基礎中の基礎をわざわざ掲示板で訊かないだろうという推測から
「(それとは別の)配列を渡す方法」を訊いているのだと思い,回答しました.
>「構造体配列の先頭要素へのポインタ」ではなく「構造体配列」の渡し方を書いた
これですね.
「(それとは別の)配列を渡す方法」を訊いているのだと思い,回答しました.
>「構造体配列の先頭要素へのポインタ」ではなく「構造体配列」の渡し方を書いた
これですね.
Re: 構造体配列をサブルーチンに渡す
横から失礼します。
このトピックを見て配列の参照について日記に軽くまとめたので、よろしければ参照下さい。
標準ライブラリでも多用されているので、おそらく皆さん間違いなく使ったことがあるはずです。
http://dixq.net/forum/blog.php?u=821&b=5211
また、
http://dixq.net/forum/blog.php?u=821&b=5218
の問題においても、配列の参照の知識が必要になります。
配列の参照を知らずとも、テンプレートを使っていると知らず知らずのうちに配列の参照を生成している場合があります。
こちらの解説は後日詳細にまとめるつもりなので、ご確認下さい。
これらが質問者様の参考になれば幸いです。
加えて、回答者様の方々には、これらを最低限理解した上で回答してくださる事を強く願います。
特に、後者の問題はすべて脳内で解けるくらいでないと、間違った回答をしかねないと思います。
C++11の問題だと断っていますが、配列の参照はC++03でも変わりません。
あの問題はC++11のあまり知られていない変更点等も含んでいるので、あれを理解していないと
C++03を使っているつもりでもC++11準拠のコンパイラを使っているとうっかりC++03非互換のコードを書きかねません。
ぜひこの機会にご確認下さい。
このトピックを見て配列の参照について日記に軽くまとめたので、よろしければ参照下さい。
標準ライブラリでも多用されているので、おそらく皆さん間違いなく使ったことがあるはずです。
http://dixq.net/forum/blog.php?u=821&b=5211
また、
http://dixq.net/forum/blog.php?u=821&b=5218
の問題においても、配列の参照の知識が必要になります。
配列の参照を知らずとも、テンプレートを使っていると知らず知らずのうちに配列の参照を生成している場合があります。
こちらの解説は後日詳細にまとめるつもりなので、ご確認下さい。
これらが質問者様の参考になれば幸いです。
加えて、回答者様の方々には、これらを最低限理解した上で回答してくださる事を強く願います。
特に、後者の問題はすべて脳内で解けるくらいでないと、間違った回答をしかねないと思います。
C++11の問題だと断っていますが、配列の参照はC++03でも変わりません。
あの問題はC++11のあまり知られていない変更点等も含んでいるので、あれを理解していないと
C++03を使っているつもりでもC++11準拠のコンパイラを使っているとうっかりC++03非互換のコードを書きかねません。
ぜひこの機会にご確認下さい。
✜ で C ご ✜
: す + 注 :
¦ か + 文 ¦
: ? Is the は :
✜ order C++? ✜
: す + 注 :
¦ か + 文 ¦
: ? Is the は :
✜ order C++? ✜
糸冬
――――――――
制作・著作 NHK
――――――――
制作・著作 NHK