C++ でプログラムを作成していて、値を持つ配列を宣言しようとしていますが、この値のみが配列の最初のメンバーにのみ設定されています。
char mines[100][100] = {'0'};
C++ でプログラムを作成していて、値を持つ配列を宣言しようとしていますが、この値のみが配列の最初のメンバーにのみ設定されています。
char mines[100][100] = {'0'};
std::fill
各次元で使用:
for (int i = 0; i < 100; ++i)
std::fill (mines[i], mines[i] + 100, '0');
または C++11 の場合:
for (auto &chars : mines)
std::fill (std::begin (chars), std::end (chars), '0');
さらに簡単に、配列が連続しているという事実を利用して、ループを回避できます。
std::fill (mines, mines + 100*100, '0');
Shahbaz が指摘するように、そこにあるマジック ナンバーを削除するには、 に置き換えmines + 100*100
ますsizeof(mines)
。
10000 要素のイニシャライザ リストを作成または生成したくない場合は、次のようにします。
char mines[100][100];
memset(mines, '0', sizeof(mines));
私は通常、forループを使用してすべての値を初期化します。私の知る限り、すべての要素のデフォルト値ではなく、リストによってのみ初期化できます。
次のようにして、最初の要素のみを初期化します
char mines[100][100] = {'0'};
残りは0
(文字ではなく値)で初期化され、ループが必要になります。このような:
int row, column;
for (row = 0; row < 100; row++)
for (column = 0; column < 100; column++)
mines[row][column] = '0';
ルナ、これはゼロ初期化子と呼ばれ、すべての値を対応する値をゼロに初期化するためにのみ機能します: null ポインター、ゼロ。char を 0 に初期化しようとすると機能しますが、他の値では機能しません。
詳細はこちら。
#include <iostream>
int main(int argc, char *argv[])
{
int value[2][2] = {0};
for(int i = 0; i < 2; ++i)
for (int j = 0; j < 2; ++j)
std::cout << (value[i][j] == 0) << std::endl;
return 0;
}
出力:
1 1 1 1
特定の値で初期化する必要がある場合、私の意見では、Luchian は memset を使用した最適なソリューションを持っています。