字符绘制例程无法正确读取位图数据导致无显示问题排查求助
问题根因
- 无符号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
相关产品推荐
相关产品推荐

