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

字符绘制例程无法正确读取位图数据导致无显示问题排查求助

问题根因

  • 无符号char截断导致高位数据丢失:你定义bitshift1时将左移8位的unsigned int值直接赋值给8位的unsigned char,所有高于8位的比特会被直接丢弃,bitshift1永远为0,对应半行像素永远不会被绘制。
  • bit_check函数语法不符合标准C规范:你用了老式K&R C的参数定义方式,没有指定参数类型,部分编译器开启严格语法检查会报错,或运行时出现预期外的类型转换问题。
  • y坐标计算逻辑错误:同一轮yOffset循环里同时绘制y + yOffset和y + yOffset*2两行,最终会出现行号重叠、跳行的问题,字符高度计算也不符合4个数组元素对应8行的设计逻辑。
  • font数组可见性问题:如果font数组定义和drawchar函数不在同一个编译单元,未加extern声明的话,drawchar访问的font地址不正确,就会读到全0值。

修复方案

1. 修正drawchar函数的变量类型和坐标逻辑

不要将左移后的值截断为unsigned char,直接用和font数组元素同类型的unsigned int存储对应行的位图数据,同时修正y坐标计算逻辑:

void drawchar(unsigned char c, int x, int y, int fgcolor)
{
    // 每个字符占8行,4个数组元素每个对应两行
    for (int yOffset = 0; yOffset < 4; yOffset++)
    {
        unsigned int line_data = font[c][yOffset];
        // 绘制当前元素对应第一行(低8位)
        for (int xOffset = 0; xOffset < 8; xOffset++)
        {
            if (bit_check(line_data, xOffset))
            {
                putpixel(x + xOffset, y + yOffset * 2, fgcolor);
            }
        }
        // 绘制当前元素对应第二行(高8位)
        for (int xOffset = 0; xOffset < 8; xOffset++)
        {
            if (bit_check(line_data, xOffset + 8))
            {
                putpixel(x + xOffset, y + yOffset * 2 + 1, fgcolor);
            }
        }
    }
}

2. 修正bit_check函数的参数定义

补充参数类型,移位用无符号整数避免溢出:

bool bit_check(unsigned int var, int pos) {
    return !!((var) & (1U << (pos)));
}

3. 确认font数组的可见性

如果drawchar和font不在同一个.c文件,在drawchar所在文件顶部补充外部声明:

extern unsigned int font[][4];

如果font被定义为static类型,需要去掉static修饰,保证外部函数可以访问。


修复后重新调用drawchar('!', 30, 20, 4)即可正常显示感叹号字符。

内容的提问来源于stack exchange,提问作者Nikki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 21:57:02