You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);

  1. 你的原Tilemap定义是ChrRom指针数组,所以Tilemap[1][1]是ChrRom*类型的指针,不是结构体/联合体,自然不能用.访问成员——这就是GCC报错“request for member ‘ChrRom’ in something not a structure or union”的原因。
  2. 当你移除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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:39:13