Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Указатель на массив - глюк MSVC или я что-то не понимаю

350
15 ноября 2007 года
cheburator
589 / / 01.06.2006
Почему код:
 
Код:
typedef int my_array_type[MAX_HEIGHT][MAX_WIDTH][4];
my_array_type *p = new my_array_type;

не компилируется в MSVC 8.0 (2005)? Вроде как все корректно. MAX_HEIGHT, MAX_WIDTH - определены как константные числа.
Зато компилируется такой:
 
Код:
typedef int my_array_type[MAX_HEIGHT][MAX_WIDTH][4];
my_array_type *p = new my_array_type[1];
5
16 ноября 2007 года
hardcase
4.5K / / 09.08.2005
А какая версия С++? Managed?
350
16 ноября 2007 года
cheburator
589 / / 01.06.2006
В настройках проекта стоит "No Common Language Runtime support".
MS Visual Studio 8.0.50727.42.
3
17 ноября 2007 года
Green
4.8K / / 20.01.2000
Это не глюк MSVC. Comeau тоже выдал ошибку.
Надо посмотреть в стандарте что к чему.
350
17 ноября 2007 года
cheburator
589 / / 01.06.2006
Провел пару экспериментов.
MSVC оповестил меня, что new my_array_type - типа int (*) [20][4] (MAX_WIDTH определен как 20). И он, дескать, не может сконвертировать такой тип к my_array_type (*).
А запись
my_array_type (*p) = new my_array_type;
Выдает абсолютно такую же ошибку компиляции.
6.6K
17 ноября 2007 года
Ordos
105 / / 02.11.2007
Цитата:
typedef int my_array_type[MAX_HEIGHT][MAX_WIDTH][4];



Тип 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]);

Все работает.

3
17 ноября 2007 года
Green
4.8K / / 20.01.2000
Цитата: Ordos
Тип 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]);

Все работает.



Тебе двойка за знания языка С++, так и всех остальных языков программирования.
Я бы посоветовал разобраться в том, что такое объявление и определение типа, объявление, определение и инициализация экземпляра.

my_array_type - это тип. Типы не инициализируются, инициализируется экземпляр, и перед инициализацией его надо сначала создать, для этого и служит оператор new в примере cheburator, а в твоем примере создается экземпляр X на стеке.

3
17 ноября 2007 года
Green
4.8K / / 20.01.2000
Цитата: cheburator
Провел пару экспериментов.
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].

Цитата: cheburator

А запись
my_array_type (*p) = new my_array_type;
Выдает абсолютно такую же ошибку компиляции.


А какая разница с записью
my_array_type *p = new my_array_type;
?

350
18 ноября 2007 года
cheburator
589 / / 01.06.2006
Цитата: Ordos

my_array_type X;


Нет, мне нужно создать объект именно в куче.

350
18 ноября 2007 года
cheburator
589 / / 01.06.2006
Цитата: Green
Это особенность оператора new[].


Спасибо, я понял :)
Задача, по сути, сводится к этому:

 
Код:
int (*p1)[MAX_HEIGHT][MAX_WIDTH][4] = new int[MAX_HEIGHT][MAX_WIDTH][4]; // Не компилируется! int (*)[20][4] не приводится к int (*)[10][20][4]
    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 должно работать для ЛЮБОГО типа...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог