2013-09-26 3 views
5

Как инициализировать массив двухмерных массивов в C++ (определенный как в коде ниже)?Инициализация массива двухмерных массивов

#include <iostream> 
#include <array> 

typedef int arr3by6Int[3][6]; 
typedef arr3by6Int arr3xarr3by6Int[3]; 

void print3by6(arr3by6Int arr) 
{ 
    for(int i = 0; i < 3; i++) 
    { 
     for(int j = 0; j < 6; j++) 
     { 
      std::cout << arr[i][j] << " "; 
     } 
     std::cout << std::endl; 
    } 
} 
int main(int argc, char const *argv[]) 
{ 

    arr3by6Int a = { 
     {1,2,3,4,5,6}, 
     {0,0,0,0,0,0}, 
     {2,2,2,2,2,2} 
    }; 

    arr3by6Int b = { 
     {2,2,3,4,5,6}, 
     {0,0,0,0,0,0}, 
     {2,2,2,2,2,2} 
    }; 

    arr3by6Int c = { 
     {3,2,3,4,5,6}, 
     {0,0,0,0,0,0}, 
     {2,2,2,2,2,2} 
    }; 

    arr3xarr3by6Int d = { a, b, c }; 

    for(int i = 0; i < 3; i++) 
    { 
     print3by6(d[i]); 
    } 
    return 0; 
} 

я получаю эти ошибки:

$ g++ -std=c++11 arrays.cpp -o arrays
arrays.cpp: In function ‘int main(int, const char**)’:
arrays.cpp:39:32: error: array must be initialized with a brace-enclosed initializer
arrays.cpp:39:32: error: array must be initialized with a brace-enclosed initializer
arrays.cpp:39:32: error: array must be initialized with a brace-enclosed initializer

+1

ошибка говорит все – user1095108

+2

Маски C-стиля не могут быть инициализированы непосредственно из других массивов, а также не могут передаваться по значению в качестве аргумента функции или возвращаться из функции. –

+1

Перезапишите его без typedefs, и может быть более очевидным, почему это неправильно. –

ответ

6

Вы #include <array> в вашем коде, поэтому вы должны его использовать. Измените типы использовать std::array<>:

typedef std::array<std::array<int, 6>, 3> arr3by6Int; 
typedef std::array<arr3by6Int, 3> arr3xarr3by6Int; 

Затем обновите ваши списки инициализации для соответствия:

arr3by6Int a = { 
     std::array<int, 6>{1,2,3,4,5,6}, 
     std::array<int, 6>{0,0,0,0,0,0}, 
     std::array<int, 6>{2,2,2,2,2,2} 
    }; 

    arr3by6Int b = { 
     std::array<int, 6>{2,2,3,4,5,6}, 
     std::array<int, 6>{0,0,0,0,0,0}, 
     std::array<int, 6>{2,2,2,2,2,2} 
    }; 

    arr3by6Int c = { 
     std::array<int, 6>{3,2,3,4,5,6}, 
     std::array<int, 6>{0,0,0,0,0,0}, 
     std::array<int, 6>{2,2,2,2,2,2} 
    }; 

В большинстве случаев объект «стиль C» типа массива будет деградировать до указателя на первый элемент массива при использовании в выражении. Ваш способ инициализации d пытается инициализировать 3 матрицы со значениями указателя, которые не будут работать.

A std::array - это класс, поэтому он не будет деградировать таким образом.

+0

Спасибо, это то, что я искал. – user2818508

+0

Добро пожаловать. – jxh

Смежные вопросы