我已经完成了一个C语言的微控制器项目。我是一名成功的程序员,但不是这种语言。我认为'我的问题与C语法(以及我缺乏理解)有关,而不是微控制器编译器,因此为了简洁起见,我将忽略编译器问题。
我正在尝试使用Jagged / Ragged数组存储字体信息,以便快速调用以显示在LCD上。还有其他方法可以解决这个问题,但我有理由坚持这个概念。
我们假设在这个例子中我的字体中只有三个字形(字符)。未知的是定义该字形的每一行的长度。例子:
字形{A}需要以下数据: {65,8,12,1,0,0x18,0x3C,0x66,0xC3,0xC3,0xC3,0xC3,0xFF,0xFF}
字形{'}需要以下数据: {39,2,3,4,9,0xC0,0xC0,0xC0}
字形{。}需要以下数据: {46,2,2,4,0,0xC0,0xC0}
考虑到这一点,这是我的代码。
//This is where I attempt to make my Jagged array.
char X,Y, LeftOffSet, BaseOffSet;
char * font[3]={{46,2,2,4,0,0xC0,0xC0},
{39,2,3,4,9,0xC0,0xC0, 0xC0},
{65,8,12,1,0,0x18, 0x3C, 0x66, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF, 0xFF}};
//None of these assignments work properly.
LeftOffSet=font[0][0]; // expected assignment = {46}
LeftOffSet=font[1][4]; // expected assignment = {9}
LeftOffSet=font[2][1]; // expected assignment = {8}
这段代码看起来有用吗?我好像在抛出难以捕获的错误。分配未按预期工作。当编译器命中第一个时,它会重置项目。
提前感谢您的帮助。
答案 0 :(得分:5)
如果你真的需要 ragged 数组,那么为了使用这种内联语法构建它,你需要一个支持复合文字的现代C编译器
char *font[] = {
(char []) {46,2,2,4,0,0xC0,0xC0},
(char []) {39,2,3,4,9,0xC0,0xC0, 0xC0},
(char []) {65,8,12,1,0,0x18, 0x3C, 0x66, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF, 0xFF}
};
如果你的编译器不支持复合文字,你别无选择,只能将内部数组定义为单独的命名对象
char row0[] = {46,2,2,4,0,0xC0,0xC0},
row1[] = {39,2,3,4,9,0xC0,0xC0, 0xC0},
row2[] = {65,8,12,1,0,0x18, 0x3C, 0x66, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF, 0xFF},
*font[] = { row0, row1, row2 };
您的原始代码无效C.如果它编译,则只是由于某些编译器扩展,这不符合您的想法。
相同的问题答案 1 :(得分:0)
这就是你要找的东西:
char X,Y, LeftOffSet, BaseOffSet;
char font1[7] ={46,2,2,4,0,0xC0,0xC0};
char font2[8] ={39,2,3,4,9,0xC0,0xC0, 0xC0};
char font3[15] ={65,8,12,1,0,0x18, 0x3C, 0x66, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF, 0xFF};
char *fonts[] = {font1, font2, font3};
main (int argc, char *argv[]) {
//None of these assignments work properly.
LeftOffSet = fonts[0][0];
}
请注意,这很危险,因为您不知道单个数组的长度。 使其更好的一个好方法是将数组的大小作为数组的第一个元素,读取它以检查边界然后索引它。或者,你也可以有一个结构来定义它。
struct font {
short size;
char pattern[MAX_FONT_SIZE];
}