簡體   English   中英

結構c中的多維數組

[英]multidimensional array in struct c

我已經嘗試了很長時間了。 一切似乎正常,但我收到很多警告,只想對它進行正確的編程。 問題如下:我正在制作一個游戲引擎。 我提供3d陣列中的圖像,其中前兩個索引是位置,第三個索引是顏色。 因此,一個簡單的4x4圖像將是:

static const uint8_t font_image[2][2][3] = 
{
    {{255,255,255},{255,255,255}},
    {{255,255,255},{255,255,255}}
};

現在,每個實體結構都有一個精靈結構。 我想要的是在結構中引用3維數組。

struct Sprite {
    uint32_t sizeX;
    uint32_t sizeY;
    uint8_t * data;
};

每個圖像都可以擁有自己的寬度和高度,所以我做不到

uint8_t [2][2][3] data;

我不斷收到此警告:

消息3預期為'const uint8_t *',但參數的類型為'const uint8_t(*)[10] [4] [3]'C:\\ Users \\ Elmar \\ Documents \\ GitHub \\ EVA-OS \\ EVA-OS \\ Libs \\ Game \\ sprite.h 28 10 EVA-OS

這是制作新精靈的功能:

Sprite * sprite_new(uint32_t width, uint32_t height, const uint8_t * image)
{
    Sprite * sprite = malloc(sizeof(Sprite));
    sprite->data = image;
    sprite->sizeX = width;
    sprite->sizeY = height;
    return sprite;
}

提前致謝! :)

從錯誤消息中,聽起來您正在代碼中的其他地方執行此操作:

uint8_t image[10][4][3] = { ... whatever ... };

Sprite *sprite = sprite_new(10, 4, image);

這樣做的問題是,編譯器認為image的數據類型為const uint8_t (*)[10][4][3] ,而不是uint8_t * 您可以通過強制轉換使其工作:

Sprite *sprite = sprite_new(10, 4, (uint8_t *)image);

至於您如何聲明Sprite結構,user2357112是正確的。 實際上,沒有簡單的方法來聲明可變長度數組並將它們傳遞給C並保留其大小信息的函數。 在這方面,C有點愚蠢。 您始終需要將大小信息作為一個或多個單獨的參數傳遞。

之前

sprite->data = image;

您是否在為數據分配空間?

我假定您將不得不為struct Sprite分配空間,但是它將只包含一個指針空間。 然后,您將需要為重新分配分配空間,並有數據指向它。 Finallly,您可以memcopy在這個空間的東西...

Sprite * sprite = malloc(sizeof(Sprite));
sprite -> data  = malloc( width*length*sizeof(uint8_t)   );
memcopy( ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM