Какой правильный инициализатор для нестатического 2D-массива? - PullRequest
0 голосов
/ 28 марта 2019

Visual Studio позволяет: int a [3] [3] = {0};для ОБА локальной переменной и нестатической переменной класса.Однако GCC допускает это только для локальных переменных, но требует int a [3] [3] = {{0}};для инициализации переменной класса.GCC слишком ограничительный или VS для разрешающего?

#include <iostream>
using namespace std;

class InitArray {
 public:
   InitArray();
   void PrintArray() const;
 private:
   int a[3][3] = { 0 };       // compiles in Visual Studio 2017, but not GCC
                              // modify to = { {0} }; to compile in GCC
InitArray::InitArray() {
   PrintArray();
   for (int i = 0; i < 3; i++) {
      for (int j = 0; j < 3; j++) {
         a[i][j] = 1;
      }
   }
}

void InitArray::PrintArray() const {
   for (int i = 0; i < 3; i++) {
      for (int j = 0; j < 3; j++) {
         cout << a[i][j] << " ";
      }
      cout << endl;
   }
}

int main() {
   InitArray A;
   A.PrintArray();
   int a[3][3] = {0};          // OK in BOTH compilers
   for (int i = 0; i < 3; i++) {
      for (int j = 0; j < 3; j++) {
         cout << a[i][j] << " ";
      }
      cout << endl;
   }

   return 0;
}

1 Ответ

1 голос
/ 28 марта 2019

Вы кодируете только первую ячейку в массиве, измените строку

int a[3][3] = {0}; 

на

 int a[3][3] = {1};

и посмотрите вывод, только первая ячейка будет одна иостальное будет равно нулю.

о вопросе компиляции, я компилирую с GCC, и оба компилируются для меня.Разница между типами инициализации заключается в том, что

int a[3][3] = {1,2,3,4,5};

будет компилироваться, вы получите

1 2 3 
4 5 0 
0 0 0

Но int b [3] [3] = {{1,2,3, 4}};Не будет компилироваться из-за

слишком большого числа инициализаторов для 'int [3]' Это произойдет, потому что {{}} будет инициализировать только первый массив a [3] в a [3] [3матрицаЕсли вы хотите инициировать все это, вам нужно назвать его так:

int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
...