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

小さい配列の場合、次のようにすることができます。

#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 に答える