Указатель на массив - глюк MSVC или я что-то не понимаю
my_array_type *p = new my_array_type;
не компилируется в MSVC 8.0 (2005)? Вроде как все корректно. MAX_HEIGHT, MAX_WIDTH - определены как константные числа.
Зато компилируется такой:
my_array_type *p = new my_array_type[1];
MS Visual Studio 8.0.50727.42.
Надо посмотреть в стандарте что к чему.
MSVC оповестил меня, что new my_array_type - типа int (*) [20][4] (MAX_WIDTH определен как 20). И он, дескать, не может сконвертировать такой тип к my_array_type (*).
А запись
my_array_type (*p) = new my_array_type;
Выдает абсолютно такую же ошибку компиляции.
Тип my_array_type[x][y][z] это уже массив размерности x*y*z. Его не надо инициализировать. Можно сразу обращаться к элементам:
typedef int my_array_type[2][2][2]
my_array_type X;
X[0][0][0] = 7;
X[1][1][1] = 17;
printf("%d, %d", X[0][0][0], X[1][1][1]);
Все работает.
typedef int my_array_type[2][2][2]
my_array_type X;
X[0][0][0] = 7;
X[1][1][1] = 17;
printf("%d, %d", X[0][0][0], X[1][1][1]);
Все работает.
Тебе двойка за знания языка С++, так и всех остальных языков программирования.
Я бы посоветовал разобраться в том, что такое объявление и определение типа, объявление, определение и инициализация экземпляра.
my_array_type - это тип. Типы не инициализируются, инициализируется экземпляр, и перед инициализацией его надо сначала создать, для этого и служит оператор new в примере cheburator, а в твоем примере создается экземпляр X на стеке.
MSVC оповестил меня, что new my_array_type - типа int (*) [20][4] (MAX_WIDTH определен как 20). И он, дескать, не может сконвертировать такой тип к my_array_type (*).
Это выдают все компиляторы. Это особенность оператора new[].
Логика, как я понимаю здесь такая:
при такой записи
int *p = new int[N];
понятно, что оператор new[] возвращает объект типа int*.
а при такой записи
int (*pp)[M] = new int[N][M];
понятно, что оператор new[] возвращает объект типа int(*)[M].
Логично, что при такой записаи
int (*ppp)[M][K] = new int[N][M][K];
оператор new[] вернет объект типа int(*)[M][K].
Поэтому если бы ты создавал массив без typedef, то все вообще предельно ясно. Сумятицу внес именно typedef, т.к. предполагалось, что он создаст новый тип, но на самом деле это всего-лишь псевдоним для типа массив, поэтому оператор new[] и возвращает int(*)[M][K].
А запись
my_array_type (*p) = new my_array_type;
Выдает абсолютно такую же ошибку компиляции.
А какая разница с записью
my_array_type *p = new my_array_type;
?
my_array_type X;
Нет, мне нужно создать объект именно в куче.
Спасибо, я понял :)
Задача, по сути, сводится к этому:
int (*p2)[MAX_WIDTH][4] = new int[MAX_HEIGHT][MAX_WIDTH][4]; // Компилируется
int (*p3)[MAX_HEIGHT][MAX_WIDTH][4] = new int[1][MAX_HEIGHT][MAX_WIDTH][4]; // Компилируется
Просто не совсем логично (если вспомнить первый пост), ведь по логике вещей T *p = new T должно работать для ЛЮБОГО типа...