2016-09-12 14 views
0

私が得ようとしているのは、バイナリ画像を格納する2次元配列のバイト配列を含む構造体です。構造体の2次元配列へのポインタを初期化する

typedef enum{ 
    PIC_ID_DOUBLE_UP, 
    PIC_ID_DOUBLE_DOWN, 
}PICPictureId_t; 

typedef struct{ 
    PICPictureId_t picId; 
    uint8   width; 
    uint8   height; 
    uint8   (**dataPointer); 
}PICPicture_t; 

サイズ(ピクセル単位)は、幅と高さによって決まります。今度は、一連の写真を初期化しようとしました。私はフラッシュ全体のデータを保存したい。

PICPicture_t pictures[] = { 
    { 
     .height  = 3, 
     .width  = 16, 
     .picId  = PIC_ID_DOUBLE_UP, 
     .dataPointer = ???   
    } 
}; 

データへのポインタをどのように初期化できますか?私は絵の構造体の配列へのポインタを使用して、doubleUp 2次元配列の最初の要素へのポインタを設定している場合、私は(A pointer to 2d arrayここで答えを学んだ後):コンパイルバージョンを取得

typedef struct{ 
    PICPictureId_t picId; 
    uint8   width; 
    uint8   height; 
    uint8   (*dataPointer)[2]; 
}PICPicture_t; 

uint8 doubleUp[3][2] = { 
    {0x12 ,0x13}, 
    {0x22 ,0x32}, 
    {0x22 ,0x32} 
}; 


PICPicture_t pictures[] = { 
    { 
     .height  = 3, 
     .width  = 16, 
     .picId  = PIC_ID_DOUBLE_UP, 
     .dataPointer = &(doubleUp[0]), 
    } 
}; 

しかし、ここで私は2番目の配列の次元を宣言しなければなりませんが、構造体を次元の理想的なものにして、これにheightとwidthフィールドを使用したいと考えています。

+1

他のメンバーと同じようにインラインで実際に初期化することはできません。 'malloc'を使って手作業で行と列を割り当てる必要があります。 –

+0

多分私はそれをフラッシュに保存したいと付け加えなければならない。 – Semaphor

+1

画像が組み込みシステムで使用されるNVM定数である場合、mallocは意味を成しません。 – Lundin

答えて

2

は、1次元配列して、手動でインデックスをへのポインタを使用します。

typedef struct{ 
PICPictureId_t picId; 
uint8   width; 
uint8   height; 
uint8   *dataPointer; 
}PICPicture_t; 

画像データは、単一のディメンションに変更する必要があります。

uint8 d[6] = { 
    0x12 ,0x13, 
    0x22 ,0x32, 
    0x22 ,0x32 
}; 

あなたはそれを初期化することができます

PICPicture_t s = { 3 , 2, ID , d }; 

これを2次元配列として解釈します。

uint8 x = 1; 
uint8 y = 2; 
uint8 value = s.dataPointer[y*width+x]; 

(幅を16から2に変更して、例がより明確になりました。単一のビットにアクセスする予定がある場合、そのアイデアは同じです。 )

+0

単一の配列で良いアイデア! – Semaphor

関連する問題