0

2次元構造体配列内の3次元配列へのポインタを初期化する方法を理解しようとしています。動的構造体内の動的配列配列

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

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

しかし、残念なことに構造体がグローバルとして宣言するには大きすぎます。だから、私はメモリを呼び出す必要があります(システムで利用可能な192GBのメモリ: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"変数をメモリのチャンクに割り当てようとしていて、まったく失敗しています。

答えて

0

ポインタと配列は、あなたが望むと思われる方法では互換性がありません。あなたはおそらくもっと簡単なことをやっていると思います。しかし、それは見て少し面白いです使用

xprimitive xPmtv; 

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

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

をそして、実行時に配列のための領域を割り当てる:ポインタにavgを作る

(*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] 
関連する問題