0

f()を呼び出すたびにint配列をインクリメントするために、次のようなことをしたいとします。

void f()
{
  static int v[100]={1,2,3...100};
  for (int i=0; i<100; i++) v[i]++;
}

すなわち私が欲しい:

first call f(): v[100]={1,2,3...100};
second call f(): v[100]={2,3,4...101};
...

どうやら以下はそれをしません:

void f()
{
  static int v[100]; for (int i=0; i<100; i++) v[i]=i+1;
  for (int i=0; i<100; i++) v[i]++;
}

それを達成する方法がわからない。ありがとう!

4

3 に答える 3

2

関数内で宣言されたstatic配列は、関数内でのみ参照でき、プログラムが実行される限り存在します。最初のバージョンでヒントとして初期化できます。

2 番目のバージョンでは、最初に配列に値を入力し、関数が呼び出されるたびに値をインクリメントします。おそらくあなたが望むものではありません。

初期化とインクリメントを2つの関数に分割して、static両方の外で配列を定義するか、最初のバージョンのように手動で配列を埋めるだけです(配列を初期化する部分をファイルに生成するプログラムを作成し、それをあなたの情報源)。この場合の配列への入力はコンパイラによって行われ、実行時のペナルティはありません。

于 2013-03-02T04:06:01.983 に答える
1

配列のマークまたは開始点を保持する別の静的変数を使用してこれを行うことができます。いう

{
    static int fst = 0,
        v[MAXSIZE] = {0};    //#define MAXSIZE 100
        fst++;
        for(int i = 0; i < (MAXSIZE+fst-1); i++) v[i] = i + fst;
}
于 2013-03-02T04:24:30.330 に答える
0

そのように静的配列を初期化することはできません。2 番目のコード ブロックの最初の for ループは、呼び出されるたびにf呼び出されます。

代わりに、静的v変数を NULL に初期化してから、配列要素を実際にインクリメントする for ループの前に、NULL をチェックしi+1、必要に応じて初期化することができます。

于 2013-03-02T04:02:51.857 に答える