【问题标题】:Initialize pointer to 2D array in structure在结构中初始化指向二维数组的指针
【发布时间】:2017-01-19 14:45:36
【问题描述】:

我试图得到的是一个结构,它包含一个二维字节数组,应该存储一个二进制图片。

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 2D 数组的第一个元素,我会得到一个可以编译的版本(在此处研究答案后: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]),
    }
};

但在这里我必须声明第二个数组的维度,但我想让结构独立于维度并为此使用高度和宽度字段。

【问题讨论】:

  • 您不能像其他成员那样真正内联初始化它。您必须使用malloc 手动分配行和列。
  • 也许我必须补充一点,我想将它存储在闪存中。
  • 如果图片是嵌入式系统使用的 NVM 常量,那么 malloc 没有任何意义。

标签: c arrays pointers


【解决方案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 }; 

并将其解释为二维数组:

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

(我将宽度从 16 更改为 2,因此示例更清晰。如果您打算访问单个位,想法是相同的。)

【讨论】:

    猜你喜欢
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多