从PROGMEM中查找C中的十六进制字符数组的大小

时间:2016-05-10 22:38:50

标签: c hex microcontroller avr progmem

我正在使用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

2 个答案:

答案 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结束每个数组。然后,您的函数将搜索数组,直到找到该值并返回长度。