0

次のように、2Dにブーストマルチアレイを使用しています。

typedef boost::multi_array<double, 2> array_type;
    typedef array_type::index index;
    // initialize array
    array_type U(boost::extents[N][3]);
    for(index i = 0; i != N; ++i) {
        for(index j = 0; j != 3; ++j){
            U[i][j] = 0;
        }
    }

    double * pU = U.data();
    double (*arrayU)[3] = (double (*)[3])pU;

今私はそれを実装しようとしていますが、3Dの場合、これまでのところ次のように書いています。

typedef boost::multi_array<double, 3> array_type;
    typedef array_type::index index;
    // initialize array
    array_type U(boost::extents[M][N][4]);
    for(index i = 0; i != M; ++i) {
        for(index j = 0; j != N; ++j){
            for(index k = 0; k != 4; ++k){
            U[i][j][k] = 0;
            }
        }
    }

しかし、次の部分はまだわかりにくいので、やり方を教えて、少し説明してもらえますか?

    double * pU = U.data();
    double (*arrayU)[3] = (double (*)[3])pU;

ありがとう!

4

1 に答える 1

2

multi_array<T>.data()連続するブロックの先頭へのポインターを返し、そのポインターを、配列の配列の要素である 3 つの double の配列のポインターにキャストします。このリンクを見てください: 2D 配列へのポインター
編集:
3D 配列の場合も同じです。たとえば、3D 配列の場合は次のように記述します。

double * pU = U.data();
double (*arrayU)[N][4] = (double (*)[N][4])pU;

double の N * 4 行列へのポインターであると宣言arrayUしました。つまり、4 つの double の N 配列の配列を指します。これを考えると、arrayU[0]は 4 つの double の N 配列の配列です。ただし、配列なので、配列の最初の要素へのポインタに自動的に変換されます。

于 2014-03-27T04:56:43.773 に答える