【问题标题】:Ragged array in CC中的参差不齐的数组
【发布时间】:2014-10-15 21:04:03
【问题描述】:

我收到了一个用 C 语言编写的微控制器项目。我是一个有成就的程序员,但不会使用这种语言。我“认为”我的问题与 C 语法(以及我缺乏理解)有关,而不是微控制器编译器,因此为了简洁起见,我将忽略编译器问题。

我正在尝试使用锯齿状/锯齿状数组来存储字体信息,以便快速调用以显示在 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}

这段代码看起来有用吗?我似乎在抛出一个难以捕获的错误。作业没有按预期工作。当编译器遇到第一个时,它会重置项目。

提前感谢您的帮助。

【问题讨论】:

  • 你的问题是什么?
  • 这段代码看起来正确吗?我似乎抛出了不容易捕获的错误。
  • 更详细的我似乎在抛出错误。你在哪里看到他们?您没有提供足够的代码来完全编译任何东西。
  • ryyker 狡猾的 cmets 不会帮助任何人。如果您阅读整个问题并在可能的情况下回答它,它会有所帮助。如果做不到,就交给别人吧。您的评论似乎旨在提高您的分数,而不是提供真正的帮助。我不会上传我的整个项目,希望你能找到需要帮助的代码。
  • @Cartoondog - 很抱歉它是这样被采用的。我的字面意思是,获得更多信息会有所帮助。我真的以为你问了一个好问题。没有恶意。

标签: c arrays multidimensional-array ragged


【解决方案1】:

如果你真的需要一个 ragged 数组,那么为了使用这种内联语法构建它,你需要一个支持 compound literals

的现代 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。如果它编译,那只是由于某些编译器扩展,它没有按照您的想法执行。

附:和'C' Segmentation fault with 2d array一样的问题

【讨论】:

  • 完美,感谢您简洁而翔实的回复。
  • 非常干净。我不知道这种技术!
【解决方案2】:

这是你要找的东西吗:

    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];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多