При объявлении массива как это:
int array[][] = {
{1,2,3},
{4,5,6}};
Я получаю ошибку при высказывании: "Тип массива имеет неполный тип элемента"
Что продолжается??
Для N-мерного массива (N> 0) вам необходимо определить размеры N-1 измерений; компилятору может быть оставлено только одно измерение, и это должно быть первое измерение.
Вы можете написать:
int d1[] = { ... };
int d2[][2] = { ... };
int d3[][2][3] = { ... };
Etc.
Вам нужно указать все размеры, кроме наибольшего. Причина в том, что компилятор собирается выделить один большой блок памяти, а не один массив указателей, указывающих на свои собственные маленькие массивы. Другими словами,
int array[][3][4] = ...;
выделит одну непрерывную область памяти размером 3*4*(сколько бы массивов 3x4 вы здесь не объявили). Таким образом, когда позже в коде вы напишете
array[1][2][3] = 69;
для поиска места в памяти для записи 69, он начнет с адреса (массива), затем перепрыгнет вперед на 12*sizeof(int), чтобы добраться до массива[1], плюс 2*4*sizeof(int), чтобы добраться до массива[1][2], плюс 3*sizeof(int), чтобы наконец добраться до начала массива[1][2][3]. Сравните это с написанием, например,
int ***array = new int**[n];
for(i=0; i<n; i++)
{
array[i] = new int * [3];
for(j=0; j<4; j++)
array[i][j] = new int[4];
}
(извините, если синтаксис не точен... давно не приходилось писать что-то подобное на C). В этом примере массив указывает на блок кода длиной n*sizeof(int**) байт. Каждый элемент этого массива указывает на другой массив размером 3*sizeof(int*) байт. Каждый элемент этих массивов указывает на другой массив размером 4*sizeof(int) байт. В этом случае, вместо того чтобы вычислить, что массив array[1][2][3] находится по адресу (массив + что-то), ему пришлось бы пройти по нескольким различным указателям в памяти, прежде чем найти, куда записать 69.
Вы должны указать хотя бы все размеры, кроме самого большого.
т.е. в вашем случае
int array[][3] = {
{1,2,3},
{4,5,6}};