我正在使用AT90微控制器,我正在努力在屏幕上显示不同的字体。作为我的字体定义的一部分,我在下面有一个十六进制的char数组。出于这个问题的目的,我将char数组缩短为仅代表4个字符。
const char font5x7[] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, // SPACE
0x00, 0x00, 0x5F, 0x00, 0x00, // !
0x00, 0x03, 0x00, 0x03, 0x00, // "
0x14, 0x3E, 0x14, 0x3E, 0x14 // #
}
现在,如果我运行sizeof(font5x7)
,它会给出正确答案,即20。但是,当我运行真正的font5x7
时,它会返回475
而不是正确的数字{{1 }}。这是真实的:
225
答案 0 :(得分:1)
此代码打印" Array len:20"在我的系统上。
#include <stdio.h>
#define PROGMEM
const char font5x7[] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, // SPACE
0x00, 0x00, 0x5F, 0x00, 0x00, // !
0x00, 0x03, 0x00, 0x03, 0x00, // "
0x14, 0x3E, 0x14, 0x3E, 0x14 // #
};
#define ARRAY_LEN(a) (sizeof(a) / sizeof((a)[0]))
const font5x7_len = ARRAY_LEN(font5x7);
int main(void) {
printf("Array len: %d\n", font5x7_len);
}
答案 1 :(得分:-1)
在C编程中,数组只不过是指针。当您仍在声明数组的范围内时,可以使用sizeof(font5x7)/ sizeof(char)来确定数组的长度。
但是,当一个数组传递给一个函数时,它会衰减成一个指针。指针没有相关长度,因此您需要保留另一个描述数组长度的变量。
换句话说,如果没有某种哨兵价值,你想要的功能是不可能的。例如,如果您可以保证您的字体数组永远不会包含0xff
,那么您可以使用0xff
结束每个数组。然后,您的函数将搜索数组,直到找到该值并返回长度。