我正在编写一个C程序来模拟SNES的后台模式7。我需要r(红色),g(绿色)和b(蓝色)值,以使像素显示在屏幕上的每个“点”(像素/点)上。这需要对“ tilemap”进行转换(瓦片图只是一个1024 x 1024像素网格,您可以用来决定在256 x 224像素显示器上放置什么)。我需要能够读取和写入图素图上的像素作为它们各自的r,g和b值。

为了快速解释我使用的格式,有256个“字符”,它们只是8 x 8像素块(由三个颜色字节组成,分别代表红色,绿色和蓝色)。拼贴图由这些字符中的任何一个的128 x 128网格组成。构造图块图后,将在图块图上执行转换,以识别要显示在256 x 224像素屏幕上的各个像素。

为此,我要定义:一个名为“ colour”的结构,其中包含三个分别用于r,g和b字节的无符号字符,一个名为“ CHR”的数据类型,该数据类型是一个8 x 8的“ colour”数组,一个名为“ ChrRom”是256个“ CHR”的数组(可能可以避免被定义,但这是我认为实际上具有数组的唯一方法,我也可以取消引用...我认为)。最后,我有一个解引用的数组,名为“ Tilemap”,用于(希望)将每个元素的内存地址存储在“ ChrRom”结构中。很抱歉,如果不清楚,这是示例代码:

typedef struct{
    unsigned char r;
    unsigned char g;
    unsigned char b;
} colour;

typedef colour CHR[8][8];

typedef CHR ChrRom[256];

int main() {
    ChrRom *Tilemap[128][128];
    //Do other computation
    return 0;
};


到目前为止,这将编译。但是,我现在要设置字符中某个像素的颜色值,然后立即出现问题。首先,我无法再访问“字符”中像素的各个颜色。我只能访问tilemap本身,其次,我仍然不知道如何读取tilemap中的颜色值。关于第二个问题(假设有一会儿,我以某种方式从文件中读取并将适当的颜色值通过管道传递到tilemap字符中,并以给定的顺序组成了所述字符的tilemap),我尝试了:

//Still in the function where Tilemap was declared obviously (main)
printf("%hhu\n", Tilemap[1][1].ChrRom[7].CHR[1][3].r);


GCC不会编译它。它说:

要求成员“ ChrRom”使用非结构或联合的形式

但是如果我在数组条目之前删除ChrRom和CHR,则会得到:

“ [”令牌之前的预期标识符

最佳答案

最后,我有一个名为“ Tilemap”的解引用数组,用于(希望地)将每个元素的内存地址存储在“ ChrRom”结构中。


不,通过定义ChrRom *Tilemap[128][128],您声明要存储ChrRom的内存地址(其中只有一个)。要在“ ChrRom”结构中存储元素的内存地址,必须指定这些元素的类型:CHR *Tilemap[128][128]

09-12 15:43