marunomaruno-memo

marunomaruno-memo

[C][C++] 2 次元配列を返り値に持つ関数

2011年10月28日 | C / C++
                                                                    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);
        :
---




最新の画像もっと見る

コメントを投稿