C语言自定义数据类型数组元素访问问题(SNES模式7模拟)
问题根源:类型定义与访问层级混淆
你遇到的编译错误,核心是Tilemap的类型定义不符合你的逻辑需求,以及后续的访问方式完全搞错了层级关系。咱们先从修正类型定义开始,再梳理正确的访问路径。
第一步:修正你的类型定义
首先,明确你的核心逻辑:
- 一个
CHR是8×8的像素块(每个像素是colour结构体) ChrRom是256个CHR的集合Tilemap是128×128的网格,每个格子对应ChrRom中的一个CHR(要么存指针,要么存索引,后者更贴近SNES硬件逻辑)
下面是两种修正后的类型定义,按需选择:
方式1:用指针存储Tilemap(直接指向ChrRom中的CHR)
#include <stdio.h> #include <stdint.h> // 单个像素的RGB颜色结构体 typedef struct { uint8_t r; uint8_t g; uint8_t b; } colour; // 8×8的CHR像素块 typedef colour CHR[8][8]; // 256个CHR组成的CHR-ROM typedef CHR ChrRom[256]; // Tilemap:128×128的网格,每个元素是指向ChrRom中某个CHR的指针 CHR* Tilemap[128][128];
方式2:用索引存储Tilemap(更贴近SNES硬件逻辑)
SNES硬件中Tilemap存储的是CHR的索引而非指针,这种方式更贴合模拟需求:
#include <stdio.h> #include <stdint.h> typedef struct { uint8_t r; uint8_t g; uint8_t b; } colour; typedef colour CHR[8][8]; typedef CHR ChrRom[256]; // Tilemap:128×128的网格,每个元素是0-255的索引,对应ChrRom中的CHR uint8_t Tilemap[128][128];
第二步:正确访问像素的RGB值
根据你选择的类型定义,访问方式完全不同:
如果你用指针方式的Tilemap
假设已经把Tilemap中的元素指向了ChrRom里的对应CHR,访问Tilemap(1,1)位置的CHR中(1,3)像素R值的正确写法:
// 定义并初始化ChrRom和Tilemap示例 ChrRom my_chr_rom; // 将Tilemap[1][1]指向ChrRom中的第7个CHR Tilemap[1][1] = &my_chr_rom[7]; // 访问像素:两种等价写法 uint8_t r_val = (*Tilemap[1][1])[1][3].r; uint8_t r_val_simple = Tilemap[1][1][1][3].r; // 数组名可隐式转换为指针,写法更简洁 printf("%hhu\n", r_val_simple);
如果你用索引方式的Tilemap
这是更推荐的模拟方式,和SNES硬件逻辑一致:
ChrRom my_chr_rom; // 让Tilemap[1][1]存储ChrRom中第7个CHR的索引 Tilemap[1][1] = 7; // 访问像素:先通过索引找到对应CHR,再访问目标像素 uint8_t r_val = my_chr_rom[Tilemap[1][1]][1][3].r; printf("%hhu\n", r_val);
为什么你的原代码会报错?
咱们拆解你原访问语句的问题:printf("%hhu\n", Tilemap[1][1].ChrRom[7].CHR[1][3].r);
- 你的原
Tilemap定义是ChrRom指针数组,所以Tilemap[1][1]是ChrRom*类型的指针,不是结构体/联合体,自然不能用.访问成员——这就是GCC报错“request for member ‘ChrRom’ in something not a structure or union”的原因。 - 当你移除
ChrRom和CHR后写成Tilemap[1][1][7][1][3].r,此时Tilemap[1][1]是ChrRom*,[7]会访问指针指向的第7个ChrRom(而一个ChrRom已经是256个CHR的数组),后续的[1][3]完全不符合类型层级,所以编译器报错“expected identifier before ‘[’ token”。
内容的提问来源于stack exchange,提问作者BenJam_Brady
相关产品推荐
相关产品推荐

