2011-10-28 2 次元配列を返り値に持つ関数 ================================================================================ サンプルコードは C++ 言語で書かれているが、C 言語でも同じ。 サンプルの関数 addTo() は、2 次元配列(正方行列)に対して、擬似コード的に記すと a += b; を行う関数。 □ sample.cpp --- #include <iostream> #include <iomanip> using namespace std; int (*addTo(int a[][2], int b[][2], int size))[2]; // 2次元配列を加算する (1) void print(int a[][2], int size); int main() { int a[2][2] = {{1, 2}, {3, 4}}; int b[2][2] = {{5, 6}, {7, 8}}; print(a, 2); cout << "--------" << endl; print(b, 2); int (*c)[2] = addTo(a, b, 2); // (2) cout << "========" << endl; print(c, 2); return 0; } int (*addTo(int a[][2], int b[][2], int size))[2] { for (int i = 0; i < size; ++i) { for (int j = 0; j < size; ++j) { a[i][j] += b[i][j]; } } return a; } void print(int a[][2], int size) { for (int i = 0; i < size; ++i) { for (int j = 0; j < size; ++j) { cout << setw(4) << a[i][j]; } cout << endl; } } --- □ 実行結果 --- 1 2 3 4 -------- 5 6 7 8 ======== 6 8 10 12 --- (1) 2 次元配列を返す関数のプロトタイプ宣言 int (*addTo(int a[][2], int b[][2], int size))[2]; // 2次元配列を加算する 通常の2次元配列を指すポインター変数の定義はつぎの(2)のように、 int (*c)[2] のようになる。この場合のポインター c は、int[2] のサイズを持つ型を指すことになる ので、結果として 2 次元配列へのポインターと考えられる。 こう考えると、返り値として int[2] を持つ関数としては、 int (*x)[2] のようになり、x 部分が関数のシグネチャー部分とするとよい。すなわち、上記のような 表現になる。 (2) 2 次元配列の宣言 int (*c)[2] = addTo(a, b, 2); // (2) ■ 関数ポインターにしてみる 次のようにできる。 関数名の部分を (*関数ポインター名) に置き換えるだけである。 ただし、これだとなんだかよくわからなくなるので、あまり記述しないほうがよさそう。 それ以前に、2 次元配列を返す関数を作るくらいなら、構造体に 2 次元配列を入れて扱 ったほうが記述としてはよいと思う。 --- : int (*(*fp)(int a[][2], int b[][2], int size))[2]; // 関数ポインターを定 義する fp = addTo; // 関数ポインターにアドレスを設定する int (*c)[2] = fp(a, b, 2); : ---
最新の画像[もっと見る]
- あけましておめでとうございます 11年前
- 今年もよろしくお願いいたします 12年前
- あけましておめでとうございます 13年前
- あけましておめでとうございます 16年前
※コメント投稿者のブログIDはブログ作成者のみに通知されます