Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.10.2011, 18:27   #1
snqL
 
Регистрация: 14.10.2011
Сообщений: 3
Вопрос Выражение должно иметь константное значение? Си

Обязательно ли при инициализации статического массива индекс должен быть константным значением?
К примеру создаем массив из N элементов.


int x;
scanf("%d", &x);
int array[x];


Pelles C данный код пропускает, а MVS2010 выдает ошибку, что "х" не является константным значением. Всегда считал, что инициализировать не динамический массив, при работе программы, с помощью не константной переменной нельзя. Или я что то путаю? Можно ли прокомментировать данную ситуацию касательно применения в C и C++, а также хотел бы ссылку, где это описано в стандарте. Спасибо.
snqL вне форума Ответить с цитированием
Старый 14.10.2011, 18:59   #2
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

По стандарту инициализировать динамический массив надо так
Код:
int *array = new int [x];
Но некоторые компиляторы (gcc вроде, например) пропускают и обычный вариант (как со статическими), но код, естественно, получается слегка непереносимый
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 14.10.2011, 20:24   #3
Blade
Software Engineer
Участник клуба
 
Аватар для Blade
 
Регистрация: 07.04.2007
Сообщений: 1,618
По умолчанию

В последнем стандарте Си (C99) введены массивы переменной длины, это позволяет указывать размерность массива не-константой.
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Blade вне форума Ответить с цитированием
Старый 14.10.2011, 20:35   #4
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от snqL Посмотреть сообщение
Обязательно ли при инициализации статического массива индекс должен быть константным значением?
К примеру создаем массив из N элементов.


int x;
scanf("%d", &x);
int array[x];


Pelles C данный код пропускает, а MVS2010 выдает ошибку, что "х" не является константным значением. Всегда считал, что инициализировать не динамический массив, при работе программы, с помощью не константной переменной нельзя. Или я что то путаю? Можно ли прокомментировать данную ситуацию касательно применения в C и C++, а также хотел бы ссылку, где это описано в стандарте. Спасибо.
MVS 2010 не поддерживает стандарт языка С99, в котором можно объявлять локальные массивы переменной длины. То есть, похоже, ваш Pelles C уже поддерживает стандарт С99, а MVS 2010 не поддерживает.

Что касается С++, то там значение самого крайнего правого индекса должно быть констатным выражением.
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 14.10.2011, 21:15   #5
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Цитата:
Что касается С++, то там значение самого крайнего правого индекса должно быть констатным выражением.
При объявлении статического массива все размерности должны быть константами времени компиляции. У динамического - крайнее левое значение может быть не константным.
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 14.10.2011, 21:28   #6
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от Syuf Посмотреть сообщение
При объявлении статического массива все размерности должны быть константами времени компиляции. У динамического - крайнее левое значение может быть не константным.
Нет, вы ошибаетесь. Можно при инициализации массива не указывать размер крайне левого индекса. Например,

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

То есть размер правого индекса не является константным выражением. Выражение просто может отсутствовать.
Со мной можно встретиться на www.clipper.borda.ru

Последний раз редактировалось Сыроежка; 14.10.2011 в 21:31.
Сыроежка вне форума Ответить с цитированием
Старый 14.10.2011, 22:12   #7
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Цитата:
Нет, вы ошибаетесь. Можно при инициализации массива не указывать размер крайне левого индекса.
Нет, я не ошибаюсь. Если вы его не указываете, это не значит, что он не константа времени компиляции. Просто компилятор определяет его другим путем.
Цитата:
То есть размер правого индекса не является константным выражением. Выражение просто может отсутствовать.
Вы сами поняли, че сказали? Если вы перепутали право и лево (а только в такой интерпретации эта фраза приобретает смысл), то спешу вас уверить что он таковым является, согласно написанному выше.
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
начальное значение ссылки на левосторонний параметр должно быть левосторонним значением Dimarik Общие вопросы C/C++ 3 03.03.2011 23:14
Если y – вещественная переменная, а n – целая, то оператор присваивания какой будет иметь вид? Naruto63 Помощь студентам 6 23.11.2009 16:30
строковое выражение числа должно быть переведено в вещественный тип Wi1D Помощь студентам 8 09.02.2009 18:16
значение получившегося выражения должно быть равно заданному целому S Elm0 Паскаль, Turbo Pascal, PascalABC.NET 6 18.01.2008 00:13