1

如何在编译时使用递增值初始化 c 中的数组?

例如,我想初始化一个包含 5000 个整数的数组 - 我想像 a[] = {1,2,....4999} 一样初始化它 我不想在编译时初始化数组时写入 5000 个整数。

4

7 回答 7

4

你可以用一堆宏来做到这一点——它很邪恶而且很丑陋,我不明白你为什么想要这样做,但是你去吧:

#define V10(x) (x), (x)+1, (x)+2, (x)+3, (x)+4, (x)+5, (x)+6, (x)+7, (x)+8, (x)+9

#define V100(x) V10(x), V10(x+10), V10(x+20), V10(x+30), V10(x+40), \
                V10(x+50), V10(x+60), V10(x+70), V10(x+80), V10(x+90)

#define V1000(x) V100(x), V100(x+100), V100(x+200), V100(x+300), V100(x+400), \
                 V100(x+500), V100(x+600), V100(x+700), V100(x+800), V100(x+900)

const int a[5000] = { V1000(1), \
                      V1000(1001), \
                      V1000(2001), \
                      V1000(3001), \
                      V1000(4001) };
于 2013-09-17T09:45:09.190 回答
3

对于 C,您最好的选择可能是使用外部脚本来生成 C 代码,例如:

$ echo "unsigned int myarray[] = { $(seq -s ", " 0 9) };"
unsigned int myarray[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

您可以将其通过管道传输到专用的源文件中,并将其包含在您的代码中。

(在 C++ 中,由于模板魔法,您有更好的选择。)

于 2013-09-17T09:46:04.100 回答
2

您不能直接使用 C 中的递增值初始化数组。您必须通过指定所有值或在运行时使用循环来初始化它。

于 2013-09-17T09:41:07.933 回答
0

直接用 C 中的递增值初始化数组是不可能的,尽管可以使用其他人提到的链接器脚本。最好是使用 for 循环... for(i = 0, i < 5000, i++) a[i] = i + 1;

于 2013-09-17T09:55:18.767 回答
0

使用外部程序集文件来初始化数据并使用您的 C 代码对其进行编译。您可能需要指定 .data 段指令。

于 2013-09-17T10:26:07.890 回答
0

对于较小的数组,您可以这样做:

#include <stdio.h>

#define OFFSET (9 - 1)  // start at line 9, -1 for 1 indexing

int main()
{
  int array[] = 
  {
    __LINE__ - OFFSET,
    __LINE__ - OFFSET,
    __LINE__ - OFFSET,
    __LINE__ - OFFSET,
    __LINE__ - OFFSET
  };

  for(int i=0; i<sizeof(array)/sizeof(*array); i++)
  {
    printf("%d ", array[i]);
  }
}

但是当然对于 5000 个整数,这种方法会很乏味。最好的选择是从外部脚本生成 C 源代码。

于 2013-09-17T09:59:48.087 回答
-1

为什么不做这样的事情:

int size = 5000;
int arr[size];
int i = 1;
for(i=1; i <= size; i++)
{
    arr[i - 1] = i; // Initializing each element seperately
}
于 2013-09-17T09:44:13.830 回答