传递一个指向指向 C 结构的指针数组的指针

马法斯瓦茨

我有一个结构:

typedef struct Image {
    byte height;
    byte width;
    byte data[];
} Image;

我创建了 2 个图像:

static const __flash Image GRID = {
    .width = 16,
    .height = 8,
    .data = {
        0x10, 0x10, 0x28, 0x28, 0x44, 0x44, 0x82, 0x82, ...
    }    
};

static const __flash Image HOUSE1 = {
    .width = 24,
    .height = 24,
    .data = {
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ...
    }
};

然后我创建一个指向图像的指针数组:

static const __flash Image *IMAGES[] = {
    &GRID,
    &HOUSE1,
};

我可以使用我的draw_image()函数绘制图像

void main(void)
{
    draw_image(IMAGES[0], 16, 16);
}

我有一张地图:

typedef struct Map {
    word cols;
    word rows;
    byte tiles[];
} Map;

static const __flash Map level_1 = {
    .cols = 16,
    .rows = 8,
    .tiles = {
        0,0,1,0,...

.tiles字段是IMAGES数组中的索引列表我这样做是因为我的引擎不知道有哪些可用的图像而不被告知:

void draw_map(const Map __memx *map, const Image __memx *tileset[]);
{
    ...
    draw_image(tileset[map->tiles[index]], x, y);
    ...
}

如此称呼:

void main(void)
{
    draw_map(&level_1, &IMAGES[0]);
}

编译器不喜欢这样,并给我不兼容的指针类型警告。地图未绘制:

note: expected 
‘const __memx Image ** {aka const __memx struct Image **}’
but argument is of type 
‘const __flash Image ** {aka const __flash struct Image **}’

我确实尝试[]draw_map()声明中删除

void draw_map(const Map __memx *map, const __memx Image *tileset);

但这给了我调用调用的错误draw_image()

error: incompatible type for argument 1 of ‘draw_image’
             draw_image(tileset[0], c*8+(64 - r*8), r*8);
                        ^
tile-engine.c:63:6: note: expected 
‘const __memx Image * {aka const __memx struct Image *}’ but argument is of type 
‘Image {aka const __memx struct Image}’

我哪里错了?

void draw_image(const Image __memx *image, int x, int y)
{
    byte rows = image->height>>3;
    byte cols = image->width>>3;

    for(byte r=0 ; r<rows ; r++)
    {
        for(byte c=0 ; c<cols ; c++)
        {
            draw_tile(&image->data[(r*cols+c)*8], &image->data[(r*cols+c)*8], x+(c*8), y+(r*8));
        }
    }
}
威利斯·布莱克本

问题似乎正是编译器所确定的:您将__flash指针传递给需要指针的函数__memx

如果将 draw_map 的签名更改为

void draw_map(const Map __memx *map, const Image __flash *tileset[])

然后它工作正常。

好的,那么为什么这是必要的,当编译器可以接受__flash第一个参数指针时,它也被定义为__memx

原因是第一个指针是按值传递的,而第二个是按引用传递的(tileset是一个指向指针的__memx指针)。

根据 AVR 文档,__flash指针是指向(显然)闪存的 16 位指针,而__memx指针是 24 位指针,可以指向闪存或静态 RAM 中的位置。

看起来编译器足够聪明,可以在按值传递时将16 位__flash指针提升为 24 位__memx指针(类似于如何将 16 位 short 提升为 32 位 int 或 long),但它不能导致存储在内存中(在您的IMAGES数组中)的 16 位指针扩展到 24 位。

由于__memx指针的使用速度比__flash指针(显然编译器必须检查实际指针是指闪存还是静态 RAM 并为每个指针使用不同的指令),如果您知道您的图像和地图数据将始终在闪存中,只需传递__flash指针.

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何检查一个指向结构数组的指针在c中是否为空?

来自分类Dev

类型为union(也包含一个结构)的指针,指向浮点数C的数组

来自分类Dev

C / C ++指向POD结构的指针也指向第一个结构成员

来自分类Dev

创建指向结构的指针数组-C ++

来自分类Dev

如何创建指向结构的指针数组?C ++

来自分类Dev

C - 指向动态结构数组的指针

来自分类Dev

指向c中匿名结构数组的指针

来自分类Dev

静态初始化结构A的数组,其中结构A包含一个指向结构B的数组的指针(在C中)

来自分类Dev

C 指向数组最后一个元素的指针

来自分类Dev

指向结构中数组的C指针传递给函数

来自分类Dev

指向C ++结构的指针

来自分类Dev

在C中声明一个指向结构的指针的数组,但直到需要时才为结构分配内存

来自分类Dev

C - 指向指针数组的指针

来自分类Dev

如何在C中定义一个指向指针数组的指针数组?

来自分类Dev

C++ -- 指向结构数组的指针,该数组包含指向不工作的类数组的指针

来自分类Dev

指向数组的C指针

来自分类Dev

如何声明一个指向:的void指针数组的指针?在C

来自分类Dev

如何在实现XFS的C ++中动态填充结构的指针,该结构是指向数组的指针

来自分类Dev

指针数组(指向结构)

来自分类Dev

指向结构数组的指针

来自分类Dev

C ++:删除指向结构的指针

来自分类Dev

指向C中结构的指针

来自分类Dev

C typedef:指向结构的指针

来自分类Dev

在C函数中传递指向数组的指针

来自分类Dev

是否在C中的结构内返回指向char数组的指针?

来自分类Dev

指向C中的前向声明结构数组的指针

来自分类Dev

C#Marhsal函数返回指向结构数组的指针

来自分类Dev

从指向C中的结构的指针数组获取信息

来自分类Dev

C中的结构内的指针指向的自由数组

Related 相关文章

  1. 1

    如何检查一个指向结构数组的指针在c中是否为空?

  2. 2

    类型为union(也包含一个结构)的指针,指向浮点数C的数组

  3. 3

    C / C ++指向POD结构的指针也指向第一个结构成员

  4. 4

    创建指向结构的指针数组-C ++

  5. 5

    如何创建指向结构的指针数组?C ++

  6. 6

    C - 指向动态结构数组的指针

  7. 7

    指向c中匿名结构数组的指针

  8. 8

    静态初始化结构A的数组,其中结构A包含一个指向结构B的数组的指针(在C中)

  9. 9

    C 指向数组最后一个元素的指针

  10. 10

    指向结构中数组的C指针传递给函数

  11. 11

    指向C ++结构的指针

  12. 12

    在C中声明一个指向结构的指针的数组,但直到需要时才为结构分配内存

  13. 13

    C - 指向指针数组的指针

  14. 14

    如何在C中定义一个指向指针数组的指针数组?

  15. 15

    C++ -- 指向结构数组的指针,该数组包含指向不工作的类数组的指针

  16. 16

    指向数组的C指针

  17. 17

    如何声明一个指向:的void指针数组的指针?在C

  18. 18

    如何在实现XFS的C ++中动态填充结构的指针,该结构是指向数组的指针

  19. 19

    指针数组(指向结构)

  20. 20

    指向结构数组的指针

  21. 21

    C ++:删除指向结构的指针

  22. 22

    指向C中结构的指针

  23. 23

    C typedef:指向结构的指针

  24. 24

    在C函数中传递指向数组的指针

  25. 25

    是否在C中的结构内返回指向char数组的指针?

  26. 26

    指向C中的前向声明结构数组的指针

  27. 27

    C#Marhsal函数返回指向结构数组的指针

  28. 28

    从指向C中的结构的指针数组获取信息

  29. 29

    C中的结构内的指针指向的自由数组

热门标签

归档