1

配列全体を初期化しようとしてintいて、Stackoverflow を検索した後、std::fill_nfrom<algorithm>または<vector>header を使用するのが最善の方法であることがわかりましたが、両方を含めるとエラーが発生します。これらのメソッドは C++ でのみ可能だと思いますか、それとも何か間違っていますか?

ループなしで、つまり単一のステートメントで、配列全体を C の値で初期化するにはどうすればよいですか?

私は Fedora 14 ターミナルで作業しており、gcc を使用してコンパイルしています。

4

7 に答える 7

4

配列宣言がある場合は、次のコードでint arr[ARRAY_SIZE];int を入力できます (宣言はブロックの先頭にある必要があります)。VALUEi

int i;
for (i = 0; i < ARRAY_SIZE; i++)
   arr[i] = VALUE;

単純なforループで十分です。

于 2013-07-08T22:12:04.547 に答える
1

はい、それらは C++ ライブラリです。C 標準ライブラリ ヘッダーは で終わりますが.h、C++ 標準ライブラリ ヘッダーはそうではありません。たとえば、C では を使用します<stdio.h>が、C++ では を使用します<cstdio>

于 2013-07-09T04:41:12.347 に答える
1

再利用可能なユニバーサル ソリューションは、次の方法で構築できます。

  1. 特にメモリ領域を順方向にコピーする「安定した」memcpy_forward関数(標準のアナログ)を作成しますmemcpy

    void *memcpy_forward(void *dst, const void *src, size_t n)
    {
      char *pdst;
      const char *psrc;
    
      for (pdst = dst, psrc = src; n > 0; --n, ++pdst, ++psrc)
        *pdst = *psrc;
    
      return dst;
    }
    
  2. のように配列を埋めるには

    int a[1000];
    

    同じ値(たとえば、42)で最初に行う

    a[0] = 42;
    

    そして、する

    memcpy_forward(a + 1, a, sizeof a - sizeof *a);
    

このトリックを使用して、任意のサイズの繰り返しパターンで任意のメモリ領域を埋めることができます。領域の先頭でパターンの最初の「サンプル」を形成することから始め、次に を使用memcpy_forwardして目的の領域全体にそのパターンを複製します。

于 2013-07-08T22:16:44.313 に答える
1

std::fill_n実際、C では使用できない C++ のアルゴリズムです。

は配列を初期化しないことfill_nに注意してください。指定された値を配列のすべての要素に割り当てます。

C で同様のことを行うには、配列の要素を繰り返し処理し、すべての要素に値を割り当てる必要があります。例えば:

// Compile: gcc -std=c99 -Wall -pedantic -o test ./test.c

int main()
{
    double array[100];
    unsigned int i;

    for (i = 0; i < sizeof(array)/sizeof(array[0]); ++i)
        array[i] = 9.99;
}

配列がバイト文字列の場合は、 を使用memsetする方が適切な選択になる可能性があります。開発者は配列に慣れているため、コードがよりコンパクトになり、高速になる可能性もあります。例えば:

// Compile: gcc -std=c99 -Wall -pedantic -o test ./test.c
#include <string.h>

int main()
{
    char array[100];
    memset(array, 1, sizeof(array)); // Set every element to 1.
}

割り当てを行う代わりに初期化する場合は、次のいずれかを行う必要があります。

  • zero-initializer を使用して、各要素を 0 に設定します。int array[100] = { 0 };
  • 各要素の値を指定します。int array[] = { 1, 2, 3 };

それが役に立てば幸い。幸運を!

于 2013-07-08T22:20:12.367 に答える
1

最も一般的な方法は、ループを記述して初期化することです。

for (i = 0; i < some_len; ++i) {
    ary[i] = some_val;
}

0 だけが必要な場合、memsetまたは初期化が機能します。しかし、あなたは任意の値を探していると思います。このmemset呼び出しは、配列を 1 バイトの任意のパターンで埋めることができますが、これはおそらくあなたが求めているものではありません。

于 2013-07-08T22:11:40.057 に答える
0

So I believe the conclusion is that there is no pre-defined way to initialise entire array using an expression and that std::fill_n is only possible in C++.

The only way is the brute force for loop.

于 2013-07-08T22:53:57.137 に答える