1

forループから読み取った値を配列に格納したい

char A[];
int x;
int y=5;

for( int i=0; int i =1000; i++) {
   x = x+y;
   // then store/append x as elements of the char array, A.... what is the syntax?
}
4

4 に答える 4

7

あなたのコードを見ると、静的配列を構築しようとしていると思われるので、それを示します (したがって、当面は malloc のような概念に集中する必要はありません)。ただし、あなたのコードにはいくつかの問題があります。

まず、配列宣言から:

char A[];

forループが整数の配列を埋めているように見えるので、この配列は整数として宣言する必要があります。さらに、配列のサイズを設定していません。コードは1000になるまでインクリメントするため、宣言する必要があります1000 要素の整数配列:

int A[1000];

2 番目の for ループ:

for(int i = 0, int i = 1000; i++)

for ループで宣言することもできますが、残りの変数で宣言する方がよいiでしょう。個人的にはお勧めしません。iまた、このループで 2 回宣言します。最後に、ループを続行する条件 ( ) は、 に設定してからと等しくならないi = 1000ため、すぐにループを中止します。for ループは、中間ステートメントが true の間だけループすることを覚えておいてください。したがって、それを念頭に置いて、次のものが必要です。i10000

int A[1000], i, x, y = 5;
for(i = 0; i < 1000; i++)

=これで、 のステートメントと値を使用して、i各配列要素を に設定できAます。

int A[1000], i, x, y = 5;
for(i = 0; i < 1000; i++)
{
    x += y;
    A[i] = x;
}

それはとても簡単です!

于 2012-08-24T16:02:18.480 に答える
3

コードに複数の問題があります

char A[1000]; // Need to specify a compile time constant for the array size
int x=0;
int y=5;

for( int i=0; i < 1000; i++) { // Condition was wrong
   x = x+y;
   // then store/append x as elements of the char array, A.... what is the syntax?
   A[i] = x; // Add the value
}

また、charデータ型は特定のサイズを超える値を保持できず、オーバーフローが発生して値が折り返されます。代わりにAasを宣言することもできます。int A[1000]

  • 配列は一定のサイズである必要があります。そうしないと、配列を割り当てる必要があります。malloc
  • ループの 2 番目の部分を再度宣言することはできませんi。あなたのように代入文がある場合も、永遠にループします。代わりに1000までループしたいと思います
  • 実際の問題は、配列に代入するには、[]演算子を使用します。
  • x何にも初期化されていないため、ガベージ値が含まれています。変数を宣言するときに、変数に値を割り当てる必要があります。C はこれを自動的に行いません。
于 2012-08-24T14:34:53.443 に答える
2

C で要素を追加する場合、いくつかの方法があります。

静的配列

静的配列は、編集できない多くの要素で宣言されています。したがって、要素の数が正確にわかっていれば完璧です。@Dervallはそれをうまく説明しました。

動的配列

malloc関数で動的配列を宣言しています。しかもサイズ変更可能。とはいえ、維持するのは難しくて大変です。しかし :

int *A = NULL;
int *tmp; // to free ex allocated arrays
int i;
int j;
int x = 0;
int y = 5;

for (i = 0 ; i < 1000 ; i++) {
    // saving temporarly the ex array
    tmp = A;
    // we allocate a new array
    if ((A = malloc(sizeof(int) * (i + 1))) == NULL) {
        return EXIT_FAILURE;
    }
    // we fill the new array allocated with ex values which are in tmp
    for (j = 0; j < i; j++) {
        A[j] = tmp[j];
    }
    // if it's not the first time, we free the ex array
    if (tmp != NULL)
        free(tmp);
    x = x + y;
    A[i] = x;
}

もちろん、それを関数に分割することをお勧めします:)

機能も使えるrealloc!そのために作られたものですが、こういう展開は面白いと思います

于 2012-08-24T14:55:17.657 に答える
0

スニペットには多くの問題があります。これがコンパイル可能な例です

char *A = malloc(sizeof(*A) * NUM_ELEMENTS); // you shouldn't declare on the stack
int x = 0; // initialize
int y=5;

for( int i = 0; i < NUM_ELEMENTS; i++) { // proper for loop syntax
    x = x+y;
    A[i]=x; // assign element of array
}

そしてより良いバージョン:

char *A = malloc(sizeof(*A) * NUM_ELEMENTS);

for (int i = 0; i < NUM_ELEMENTS; ++i)
    A[i] = 5 * i;
于 2012-08-24T14:36:28.000 に答える