Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 39, средняя оценка - 4.62
remarkes
300 / 223 / 13
Регистрация: 01.07.2011
Сообщений: 809
Записей в блоге: 1
#1

C99 - массивы переменной длины - C++

17.03.2012, 15:26. Просмотров 5184. Ответов 14
Метки нет (Все метки)

Прочитал в википедии, что стандарт C99 предполагает поддержку массивов переменной длины.
Признаться для меня это небольшой разрыв шаблона.
Если кто-нибудь знает по поводу этой особенности, расскажите пожалуйста как она выражена в Си (то есть как объявляется этот переменный массив и т.д.) и какие компиляторы ее поддерживают (в частности gcc).
Вообщем, кто что знает по этому поводу?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт С++
6550 / 3970 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
17.03.2012, 15:48     C99 - массивы переменной длины #2
http://en.wikipedia.org/wiki/Variable-length_array
http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
17.03.2012, 18:32     C99 - массивы переменной длины #3
remarkes, это всего лишь значит, что размер массива не обязательно должен быть константой компиляции.
Evg
Эксперт CАвтор FAQ
17411 / 5649 / 355
Регистрация: 30.03.2009
Сообщений: 15,467
Записей в блоге: 26
17.03.2012, 18:43     C99 - массивы переменной длины #4
Для локала:

C
1
2
3
4
5
6
7
8
9
10
void func (int x, int y)
{
  int arr[x][y];
 
  ...
  for (i = 0; i < x; i++)
    for (j = 0; j < y; j++)
      a[i][j] = 0;
  ...
}
Для параметра:


C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void func (int x, int y, int a[x][y])
{
  ...
  for (i = 0; i < x; i++)
    for (j = 0; j < y; j++)
      r = r + a[i][j];
  ...
}
 
int main (void)
{
  ...
  {
    int b[10][20];
    ...
    func (10, 20, b);
  }
  ...
  {
    int c[30][40];
    ...
    func (30, 40, c);
  }
  ...
}
remarkes
300 / 223 / 13
Регистрация: 01.07.2011
Сообщений: 809
Записей в блоге: 1
17.03.2012, 19:22  [ТС]     C99 - массивы переменной длины #5
fasked, проблема в том, что есть учебники (и компиляторы), которые об этом еще не знают...

Добавлено через 2 минуты
Вообщем, всем спасибо - вопрос решен.
Evg
Эксперт CАвтор FAQ
17411 / 5649 / 355
Регистрация: 30.03.2009
Сообщений: 15,467
Записей в блоге: 26
17.03.2012, 23:06     C99 - массивы переменной длины #6
Цитата Сообщение от remarkes Посмотреть сообщение
fasked, проблема в том, что есть учебники (и компиляторы), которые об этом еще не знают...
Так это язык Си-99, а не Си и не Си++. Учебник у тебя наверняка не по Си-99. И компилятор наверняка не Си-99
remarkes
300 / 223 / 13
Регистрация: 01.07.2011
Сообщений: 809
Записей в блоге: 1
18.03.2012, 00:40  [ТС]     C99 - массивы переменной длины #7
Цитата Сообщение от Evg Посмотреть сообщение
Учебник у тебя наверняка не по Си-99
Я имел ввиду учебники, а не учебник. Т.е. это массовое явление. после 99го года выпуска. Например, Подбельский "Программирование на языке Си". 2009 г. Пишет про "стандарт" ANSI C и ISO. Какой именно он у себя имеет ввиду он пишет так: "Эти ситуации выходят за рамки курса..."
в остальном учебник неплохой.
Ашарина И.В. ООП в С++ 2008 г.
"При этом число_элементов должно быть задано явно либо числом либо константой, так как компилятор резервирует место под массив..."
В предисловии по стандартам пишет "Окончательный стандарт был утвержден в качестве стандарта ANSI C". про то, какой стандарт у C++ вообще ни слова.
ну и вообще книга - г...но

И только в "Язык Си с примерами" Харбисона 2011 г. на с. 160 я вижу главу "Массивы переменной длины".

то есть мистика какая-то: K&R написали книгу и время остановилось. создали борланд, и время остановилось (причем на getch() из conio.h).

Цитата Сообщение от Evg Посмотреть сообщение
И компилятор наверняка не Си-99
у меня компилятор gcc. он знает. а некоторые - нет.
собственно я и хотел проверить, знает ли gcc переменные массивы, когда узнал, что они есть или нет.
Evg
Эксперт CАвтор FAQ
17411 / 5649 / 355
Регистрация: 30.03.2009
Сообщений: 15,467
Записей в блоге: 26
18.03.2012, 00:46     C99 - массивы переменной длины #8
Думаю, ты понимаешь, что процентов 90 книг пишутся чисто для срубания денег. Особенно у нас в стране
remarkes
300 / 223 / 13
Регистрация: 01.07.2011
Сообщений: 809
Записей в блоге: 1
18.03.2012, 08:36  [ТС]     C99 - массивы переменной длины #9
Evg, да, к сожалению. И даже, если берешь признанного автора, то один хрен переводчики добавят ляпов.
Как глава про Историю Linux или GNU - обязательно будет где-нибудь "бесплатное ПО". (РМС пришел бы в бешенство)... То uid процесса назовут то "реальным", то "действительным"... эх, беда-беда!..
То в одной книге "стандартный компилятор системы UNIX..." (какой именно??! бл.. ??)
вообщем, в этой жизни приходится надеяться только на себя
CheshireCat
Эксперт С++
2891 / 1240 / 78
Регистрация: 27.05.2008
Сообщений: 3,345
18.03.2012, 09:50     C99 - массивы переменной длины #10
Цитата Сообщение от remarkes Посмотреть сообщение
Я имел ввиду учебники, а не учебник. Т.е. это массовое явление. после 99го года выпуска. [.....]
Ашарина И.В. ООП в С++ 2008 г. ..........
Вот тут имей в виду следующее:
Языки Си (без ++) и Си++ - это разные языки (хотя и совместимые), что бы ни утверждали авторы разнообразных сочинений на эту тему. И описываются они разными Стандартами - для Си действует ANS/ISO 9899-1999 (C99), для C++ действует ANSI/ISO 14882-2011 (C++11). И если Стандарт Си предусматривает массивы переменной длины, то Стандарт С++ - нет. Поэтому компилятор C++ не обязан (хотя и может, но это всего лишь добрая воля разработчиков компилятора, как, например, в GCC) поддерживать массивы переменной длины.
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
18.03.2012, 10:15     C99 - массивы переменной длины #11
Цитата Сообщение от CheshireCat Посмотреть сообщение
для Си действует ANS/ISO 9899-1999 (C99)
Ну или ISO/IEC 9899:2011 (C11) теперь уже
remarkes, я Вам кстати посоветовал бы поменьше читать русскоязычных авторов. Это, как правило, преподаватели ВУЗ'ов, соответственно без практического опыта программирования.
Evg
Эксперт CАвтор FAQ
17411 / 5649 / 355
Регистрация: 30.03.2009
Сообщений: 15,467
Записей в блоге: 26
18.03.2012, 11:14     C99 - массивы переменной длины #12
Цитата Сообщение от CheshireCat Посмотреть сообщение
но это всего лишь добрая воля разработчиков компилятора, как, например, в GCC
У gcc, насколько я понял, VLA позиционируются как собственные расширения, а не как часть стандарта C99: http://gcc.gnu.org/onlinedocs/gcc/ см. раздел 6, в который входит раздел 6.19. Если покопаться в истории, то скорее всего окажется, что VLA в gcc появились ещё до появления C99
remarkes
300 / 223 / 13
Регистрация: 01.07.2011
Сообщений: 809
Записей в блоге: 1
18.03.2012, 12:59  [ТС]     C99 - массивы переменной длины #13
Цитата Сообщение от CheshireCat Посмотреть сообщение
Языки Си (без ++) и Си++ - это разные языки
это-то понятно. применительно к учебнику Ашариной - там эти языки (и коды) так намешаны, что только зная конкретно язык Си и отдельно С++ можно понять, что автор в конкретном случае использует.
или пишет "использование директивы define препроцессора в С++ не рекомендуется", типа "делайте через const" и тут же их использует. Ну вы определитесь вконец. (кстати говоря - а почему?).
Ну, или допустим читая фразы типа "существуют две файловые системы FAT и NTFS"... что можно подумать о квалификации автора?

Добавлено через 22 минуты
Цитата Сообщение от fasked Посмотреть сообщение
я Вам кстати посоветовал бы поменьше читать русскоязычных авторов.
прям как по Булгакову
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
19.03.2012, 17:24     C99 - массивы переменной длины #14
remarkes, Ну потому что в плюсах можно обойтись без define-ов совершенно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.03.2012, 18:49     C99 - массивы переменной длины
Еще ссылки по теме:

C++ Функции и массивы произвольной длины
Массивы: создать цепочку символов «а» произвольной длины, после которой следует символ «b» C++
C++ Даны одномерные массивы А и В, длины m и n соответственно
Списки аргументов переменной длины, эти аргументы должны быть исключительно типа "int"? C++
Где в настройках RAD Studio 10 Seattle изменить аргумент на -std=c99? C++ Builder

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Evg
Эксперт CАвтор FAQ
17411 / 5649 / 355
Регистрация: 30.03.2009
Сообщений: 15,467
Записей в блоге: 26
19.03.2012, 18:49     C99 - массивы переменной длины #15
Цитата Сообщение от ForEveR Посмотреть сообщение
remarkes, Ну потому что в плюсах можно обойтись без define-ов совершенно.
В С++ можно и без шаблонов обойтись. И без классов.
Yandex
Объявления
19.03.2012, 18:49     C99 - массивы переменной длины
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru