2011年07月22日

C/C++で多次元配列を引数に取るには

C言語学習時、確かに勉強した記憶があるんだが書き方忘れた。で、詰まった。
備忘録代わりにメモメモ。

int array[2][3];

なんて配列があって、これを引数に取る関数は、以下のようになる。

/* [x][3]な二次元配列を取る関数 */
int function(int arg[][3]);
int function(int (*arg)[3]);	// これでもおk

n次元配列の、右から数えてn-1次元目までは要素数を書かなければならない。
つまり、

/* [x][4][5]な三次元配列を取る関数 */
int function3(int arg[][4][5]);
/* [x][6][7][8]な三次元配列を取る関数 */
int function4(int arg[][6][7][8]);

ただし、

/* 1次元目も2次元目も何が来ても問題なく処理出来る関数……のつもり */
int functionX(int arg[][]);

みたいな真似は不可。
まぁ、C/C++の配列の仕様(添字が範囲外の値かどうかチェックしない)を考えると、この制限も納得なんだけど。

C++だとtemplate使えば上で挙げたような真似は一応出来る。

template<std::size_t N> int function(int arg[][N]);
int a[2][3], b[4][5];	// aとbの添字の数値が異なる点に注目
function(a);
function(b);

まぁこれで何が嬉しいかというと、例えばchar[][]から任意文字列を探すstd::find()の特殊化が出来るよね、とか。

次回に微妙に続く。

ラベル:C C++
posted by 天井冴太 at 01:44| Comment(0) | TrackBack(2) | Study | 更新情報をチェックする
この記事へのコメント
コメントを書く
コチラをクリックしてください

この記事へのトラックバック

C/C++で多次元配列を戻り値にするには
Excerpt: 前回はC/C++で多次元配列を引数にとる方法を記した。引数があるなら戻り値はどうだ?というのか今回の趣旨。正確には『多次元配列を指すポインタ』な訳であるが。 結論から言うと、以下のようになる。 /..
Weblog: AMAgrammar &amp;lt;&amp;gt; PROgrammer
Tracked: 2011-07-22 22:10

C++でchar[][]に対するalgorithmを実装する
Excerpt: この記事は以下の続きです C/C++で多次元配列を引数に取るには C/C++で多次元配列を戻り値にするには char[][]に対するalgorithmが欲しい C++はその標準ライブラリの一..
Weblog: AMAgrammar &amp;lt;&amp;gt; PROgrammer
Tracked: 2011-07-28 00:38