【问题标题】:Initialize Sparse Constant Array in C在 C 中初始化稀疏常量数组
【发布时间】:2016-11-19 02:41:09
【问题描述】:

如何在 C 中方便地初始化大型稀疏数组?下面的代码有效,但对于大型数组来说变得笨拙,基本上是一种全新的方式来解决一个错误!例如,如果我想要一个长度为 200 的数组,除索引 7、62、100 和 189 处的 1 外,全为 0。这些值在编译时是已知的。我想知道宏是否可以生成数组。

const char myArray[] = {0,0,1,0,0,0,0,0,1,0};

This 的问题是针对 C++ 的,但也许结构的技巧也适用于 C。

【问题讨论】:

  • C 中的初始化要么全有,要么全无。符号有捷径,但结果仍然是全有或全无。您的目标是简短的符号还是部分初始化?

标签: c arrays initialization


【解决方案1】:

我不知道如何构建宏来实现这一点,但如果您使用 C99 或更高版本,则可以使用这样的指定初始化程序:

const char myArray[200] = {
    [7] = 1,
    [62] = 1,
    [100] = 1,
    [189] = 1
};

【讨论】:

  • 好一个! Members of an aggregate that are not explicitly initialized are initialized to zero by default.
【解决方案2】:

如果你有 C99,你应该在这里使用另一个答案,但如果没有......

使用代码生成。我之前使用过 Python Mako 或纯 Python,来生成类似于您需要的代码。

如果您必须只使用 C89,我会这样做:

#define TEN_ZEROS 0,0,0,0,0,0,0,0,0,0

const char myArray[] = {
    0,0,0,0,0,0,0,1,0,0,
    TEN_ZEROS,
    TEN_ZEROS,
    TEN_ZEROS,
    TEN_ZEROS,
    TEN_ZEROS,
    0,1 /*...*/
};

【讨论】:

    【解决方案3】:

    标准保证,如果您定义了大小并部分初始化数组,则剩余部分将设置为 0 所以

    int myarray[200]={0}; //this set all the array to 0;
    myarray[7]=23;
       ....
    

    否则

     static int myarray[200]; //also all the static variable get set to 0
      myarray[7]=23;
    

    还是最后一个

      memeset(myarray, 0, sizeof(myarray))
      myarray[7]=23;
    

    这些都是作为列表或其他解决方案的首选,因为很清楚你做了什么,没有初始化错误项目的风险,(200个项目的列表很难检查)如果你必须改变有些东西很快就改变了正确的索引。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多