0

2D構造体配列内の3D配列へのポインターを初期化する方法を理解しようとして立ち往生しています。次のような構造を宣言できたときは、正常に機能していました。

    #define ROUSSEAU      300
    #define OSSO          500
    #define MOJO          9000

typedef struct x_primitive
{  
    short avg[ROUSSEAU][OSSO][MOJO];
} xprimitive;

しかし残念ながら、構造が大きすぎてグローバルとして宣言できません。したがって、メモリをcallocする必要があります(システムで使用可能な192GBのメモリ:win 7 64ビット)。

typedef struct x_primitive
{  
    short ***avg;
} xprimitive;

xprimitive **xPmtv, *_xPmtv;


void xallocatePmtvMemory(void)
{
    int structureCount = 10;

    unsigned __int64 pmtvStructureSize =  ROUSSEAU * OSSO * MOJO * sizeof(short);
    unsigned __int64 memoryBlockSize   =   structureCount * pmtvStructureSize;

    _xPmtv = (xprimitive *)  calloc(structureCount, pmtvStructureSize);
    xPmtv  = (xprimitive **) calloc(structureCount, sizeof(xprimitive *));
    for ( int i = 0; i < structureCount; ++i)
    {
        unsigned __int64 index = i * pmtvStructureSize;
        xPmtv[i] = &_xPmtv[ index ];

            // **************** here is the problem  ******
        xPmtv[i]->avg[ROUSSEAU][OSSO][MOJO] =  &_xPmtv[ index + (ROUSSEAU + OSSO + MOJO) ];

    }
}

「avg」変数をメモリのチャンクに割り当てようとしていますが、完全に失敗します。

4

1 に答える 1

0

ポインタと配列は、あなたが望んでいるように交換することはできません。おそらくもっと簡単なことをすることができると思います。ポインタavgにする:

typedef struct x_primitive
{  
    short (*avg)[ROUSSEAU][OSSO][MOJO];
} xprimitive;

次に、実行時にアレイにスペースを割り当てます。

xprimitive xPmtv;

xPmtv.avg = calloc(1, ROUSSEAU * OSSO * MOJO * sizeof(short));

ただし、これを使用すると少しおかしいです。

(*xPmtv.avg)[1][2][3]

複数の構造がある場合は、初期化をループに入れてください。おそらく、柔軟な配列メンバーを使用して、使用構文をもう少し正常に見えるようにすることです-構造内のダミーエントリが必要になります-柔軟な配列メンバーは、単独で遊ぶことはできません。それでは、なぜとにかくフィールドが1つしかない構造になっているのでしょうか。

typedef struct x_primitive
{
    int   dummyEntry;
    short avg[][OSSO][MOJO];
} xprimitive;

1つを割り当てるには、次を使用します。

xprimitive *xPmtv = calloc(1, sizeof(xprimitive) + ROUSSEAU * OSSO * MOJO * sizeof(short));

そして、次のような配列にアクセスします。

xPmtv->avg[1][2][3]
于 2012-01-10T06:42:58.330 に答える