構造体配列をサブルーチンに渡す

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
プログラム

構造体配列をサブルーチンに渡す

#1

投稿記事 by プログラム » 5年前

質問です。

構造体配列をサブルーチンに渡す方法を教えてください。

アバター
usao
記事: 1573
登録日時: 7年前

Re: 構造体配列をサブルーチンに渡す

#2

投稿記事 by usao » 5年前

これでいいですか

コード:

#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: 構造体配列をサブルーチンに渡す

#3

投稿記事 by プログラム » 5年前

返信遅れて申し訳ないです。

解決しました!ありがとうございます!

かずま

Re: 構造体配列をサブルーチンに渡す

#4

投稿記事 by かずま » 5年前

usao さんが書きました:これでいいですか

コード:

void SubRoutine( STest (&arg)[ARRAY_SIZE] )

コード:

void SubRoutine(STest *arg)
と書くのが最も一般的です。

コード:

void SubRoutine(STest arg[])
と書いても、

コード:

void SubRoutine(STest arg[ARRAY_SIZE])
と書いても構いませんが、

コード:

void SubRoutine( STest (&arg)[ARRAY_SIZE] )
と書き方は初めて見ました。

こういう書き方をするのに何かメリットがあるのでしょうか?

int の配列でも

コード:

void SubRoutine( int (&arg)[ARRAY_SIZE] )
と書くんでしょうか?

アバター
usao
記事: 1573
登録日時: 7年前

Re: 構造体配列をサブルーチンに渡す

#5

投稿記事 by usao » 5年前

>...と書き方は初めて見ました。
>こういう書き方をするのに何かメリットがあるのでしょうか?

あなたが初めて見たから何なのですか?
使いどころが少ないかどうかはともかくとして,
質問に 答えの一つ を提示したに過ぎません.
>メリット
メリットと言えるかどうかわかりませんが,サイズ指定できるという点で
あなたの他の記述方法とは異なっていると思います.

>int の配列でも ... と書くんでしょうか?
データの型が何であるか,が,ここでの話に何か影響するのでしょうか?
どの書き方を採用するかどうかについては単にケースバイケースでは?

かずま

Re: 構造体配列をサブルーチンに渡す

#6

投稿記事 by かずま » 5年前

> あなたが初めて見たから何なのですか?

一次元配列を引数として渡す方法にこんな書き方ができるのか、と感心したのです。

最初は、二次元配列の間違いかと思いました。

void func(int a[X_SIZE][Y_SIZE]) を
void func(int (*a)[Y_SIZE]) と書くのはよく見ます。

ところが、* (ポインタ) じゃなくて、& (参照) なんですよね。

確かに、一次元配列をこれで渡せますが、
void func(int *a) と書くのが普通だよなあ。
きっと他の人もそう思って、誰かがそれを書いてくれるだろうと、
私は回答を保留して、そのまま忘れていました。

そしたら、質問者が、参照を使う書き方に納得して解決にしてしまったので、
私がポインタを使う書き方を回答しました。


> データの型が何であるか,が,ここでの話に何か影響するのでしょうか?

データの型は何も影響しません。

質問者は、「構造体配列」の渡し方を訪ねています。
おそらく、int の配列や char の配列の渡し方は分かっているが、
構造体の配列は、きっと異なるだろうと考えて質問したのだと
私は推測しました。

私は、構造体でも int でも、どんな型でも、配列なら渡し方は同じだと
言いたくて「int の配列でも」と書いたのですが、言葉足らずでした。


> どの書き方を採用するかどうかについては単にケースバイケースでは?

そのとおりですが、質問者が回答を得た時点では、参照を使う方法しか
示されていません。
質問者は、「やっぱり、構造体配列の渡し方は int の配列の渡し方とは
違うんだ」と誤解してはいかないかと、私は心配しました。

アバター
みけCAT
記事: 6247
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: 構造体配列をサブルーチンに渡す

#7

投稿記事 by みけCAT » 5年前

かずま さんが書きました:> どの書き方を採用するかどうかについては単にケースバイケースでは?

そのとおりですが、質問者が回答を得た時点では、参照を使う方法しか
示されていません。
質問者は、「やっぱり、構造体配列の渡し方は int の配列の渡し方とは
違うんだ」と誤解してはいかないかと、私は心配しました。
おそらく、usaoさんは「構造体配列の先頭要素へのポインタ」ではなく「構造体配列」の渡し方を書いたのだと思います。
「配列」の渡し方も「配列の先頭要素へのポインタ」の渡し方も、構造体でもintなどでも変わらないはずです。
ただし、ほとんどの場合「配列の先頭要素へのポインタ」を渡せば足りると思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
usao
記事: 1573
登録日時: 7年前

Re: 構造体配列をサブルーチンに渡す

#8

投稿記事 by usao » 5年前

>質問者は、「やっぱり、構造体配列の渡し方は int の配列の渡し方とは違うんだ」と誤解してはいかないかと、私は心配しました。

なるほど,そういうことでしたか.
補足感謝します.

普通に(?)書くならこんな感じですね.

コード:

//先頭要素へのポインタと,配列要素数を引数にする
void SubRoutine( STest *pArray, size_t ArraySize );
オフトピック
先頭要素へのポインタを渡すという基礎中の基礎をわざわざ掲示板で訊かないだろうという推測から
「(それとは別の)配列を渡す方法」を訊いているのだと思い,回答しました.

>「構造体配列の先頭要素へのポインタ」ではなく「構造体配列」の渡し方を書いた
これですね.

アバター
nullptr
記事: 239
登録日時: 8年前

Re: 構造体配列をサブルーチンに渡す

#9

投稿記事 by nullptr » 5年前

横から失礼します。

このトピックを見て配列の参照について日記に軽くまとめたので、よろしければ参照下さい。
標準ライブラリでも多用されているので、おそらく皆さん間違いなく使ったことがあるはずです。
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++? ✜
     糸冬   
  ――――――――
  制作・著作 NHK
 
 

閉鎖

“C言語何でも質問掲示板” へ戻る