C语言编译报错:将‘const char *’赋值给‘char’问题求助
C语言编译错误修复:帧指针存储到变量失败问题
作为C语言新手,尝试将帧数据的指针存储到next_frame变量时遇到编译错误。直接将frames[abs((FRAME_COUNT - 1) - current_frame)]传入oled_write_raw_P能正常编译,但存入变量后就报错。
代码片段
// 编译失败 oled_write_raw_P(next_frame, FRAME_SIZE); // 编译成功 oled_write_raw_P(frames[abs((FRAME_COUNT - 1) - current_frame)], FRAME_SIZE);
完整代码
#define FRAME_COUNT 5 // 动画帧数 #define FRAME_SIZE 256 #define FRAME_DURATION 200 // 每帧持续时间(毫秒) // 变量定义 uint32_t timer = 0; uint8_t current_frame = 0; char next_frame; static void render_animation(void) { static const char PROGMEM frames[FRAME_COUNT][FRAME_SIZE] = { // 图像数据已省略 }; // 当计时器超过200ms时切换帧 if (timer_elapsed32(timer) > FRAME_DURATION) { timer = timer_read32(); current_frame = (current_frame + 1) % FRAME_COUNT; next_frame = frames[abs((FRAME_COUNT - 1) - current_frame)]; // 设置光标位置 oled_set_cursor(128, 0); // 写入下一帧 oled_write_raw_P(next_frame, FRAME_SIZE); } }
错误信息
error: assignment to 'char' from 'const char *' makes integer from pointer without a cast [-Werror=int-conversion]
next_frame = frames[abs((FRAME_COUNT - 1) - current_frame)];
error: passing argument 1 of 'oled_write_raw_P' makes pointer from integer without a cast [-Werror=int-conversion]
oled_write_raw_P(next_frame, FRAME_SIZE);
问题原因
核心问题是类型不匹配:
frames是二维数组,frames[index]返回的是指向该帧数据起始地址的指针(类型为const char PROGMEM *)。- 你定义的
next_frame是char类型,仅能存储单个字符,无法容纳指针地址。赋值时编译器会强制将指针转换为整数,调用函数时又将整数转回指针,触发类型转换错误。
修复方法
将next_frame的类型修改为匹配的指针类型:
- 修改变量定义:
const char PROGMEM *next_frame;
- 赋值和调用代码无需额外修改,此时
next_frame的类型与frames[index]完全匹配,编译即可通过:
next_frame = frames[abs((FRAME_COUNT - 1) - current_frame)]; oled_write_raw_P(next_frame, FRAME_SIZE);
补充说明
PROGMEM是AVR平台的宏,用于将数据存储到程序存储器(Flash)而非RAM中,因此指针类型需要带上PROGMEM修饰,确保oled_write_raw_P能正确从Flash读取数据。
内容的提问来源于stack exchange,提问作者Joe Scotto
相关产品推荐
相关产品推荐

