Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/42: Рейтинг темы: голосов - 42, средняя оценка - 5.00
305 / 228 / 15
Регистрация: 01.07.2011
Сообщений: 809
Записей в блоге: 1
1

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

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

Прочитал в википедии, что стандарт C99 предполагает поддержку массивов переменной длины.
Признаться для меня это небольшой разрыв шаблона.
Если кто-нибудь знает по поводу этой особенности, расскажите пожалуйста как она выражена в Си (то есть как объявляется этот переменный массив и т.д.) и какие компиляторы ее поддерживают (в частности gcc).
Вообщем, кто что знает по этому поводу?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.03.2012, 15:26
Ответы с готовыми решениями:

Массивы переменной длины в C++Builder
Разрабатываю одно приложение для расчета экономической части дипломного проекта. Возникла...

Локальные массивы переменной длины
Стандартом С99 предусмотрены локальные массивы переменной длины. void func(const int a) { ...

Из элементов массива А длины 2N получить массивы В и С длины N указанным способом
Из элементов массива А длины 2N получить массивы В и С длины N каждый следующим образом. Выбрать в...

Маски переменной длины
В общем я совсем запутался. Нужно поделить сеть 172.16.0.0/16 на: 1) 10 подсетей по 1000 хостов...

14
Каратель
Эксперт С++
6593 / 4014 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
17.03.2012, 15:48 2
http://en.wikipedia.org/wiki/Variable-length_array
http://gcc.gnu.org/onlinedocs/... ength.html
1
Эксперт С++
5015 / 2594 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
17.03.2012, 18:32 3
remarkes, это всего лишь значит, что размер массива не обязательно должен быть константой компиляции.
1
Evg
Эксперт CАвтор FAQ
21117 / 8133 / 628
Регистрация: 30.03.2009
Сообщений: 22,448
Записей в блоге: 30
17.03.2012, 18:43 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);
  }
  ...
}
1
305 / 228 / 15
Регистрация: 01.07.2011
Сообщений: 809
Записей в блоге: 1
17.03.2012, 19:22  [ТС] 5
fasked, проблема в том, что есть учебники (и компиляторы), которые об этом еще не знают...

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

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

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

Цитата Сообщение от Evg Посмотреть сообщение
И компилятор наверняка не Си-99
у меня компилятор gcc. он знает. а некоторые - нет.
собственно я и хотел проверить, знает ли gcc переменные массивы, когда узнал, что они есть или нет.
0
Evg
Эксперт CАвтор FAQ
21117 / 8133 / 628
Регистрация: 30.03.2009
Сообщений: 22,448
Записей в блоге: 30
18.03.2012, 00:46 8
Думаю, ты понимаешь, что процентов 90 книг пишутся чисто для срубания денег. Особенно у нас в стране
0
305 / 228 / 15
Регистрация: 01.07.2011
Сообщений: 809
Записей в блоге: 1
18.03.2012, 08:36  [ТС] 9
Evg, да, к сожалению. И даже, если берешь признанного автора, то один хрен переводчики добавят ляпов.
Как глава про Историю Linux или GNU - обязательно будет где-нибудь "бесплатное ПО". (РМС пришел бы в бешенство)... То uid процесса назовут то "реальным", то "действительным"... эх, беда-беда!..
То в одной книге "стандартный компилятор системы UNIX..." (какой именно??! бл.. ??)
вообщем, в этой жизни приходится надеяться только на себя
0
Эксперт С++
2919 / 1268 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
18.03.2012, 09:50 10
Цитата Сообщение от remarkes Посмотреть сообщение
Я имел ввиду учебники, а не учебник. Т.е. это массовое явление. после 99го года выпуска. [.....]
Ашарина И.В. ООП в С++ 2008 г. ..........
Вот тут имей в виду следующее:
Языки Си (без ++) и Си++ - это разные языки (хотя и совместимые), что бы ни утверждали авторы разнообразных сочинений на эту тему. И описываются они разными Стандартами - для Си действует ANS/ISO 9899-1999 (C99), для C++ действует ANSI/ISO 14882-2011 (C++11). И если Стандарт Си предусматривает массивы переменной длины, то Стандарт С++ - нет. Поэтому компилятор C++ не обязан (хотя и может, но это всего лишь добрая воля разработчиков компилятора, как, например, в GCC) поддерживать массивы переменной длины.
0
Эксперт С++
5015 / 2594 / 241
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
18.03.2012, 10:15 11
Цитата Сообщение от CheshireCat Посмотреть сообщение
для Си действует ANS/ISO 9899-1999 (C99)
Ну или ISO/IEC 9899:2011 (C11) теперь уже
remarkes, я Вам кстати посоветовал бы поменьше читать русскоязычных авторов. Это, как правило, преподаватели ВУЗ'ов, соответственно без практического опыта программирования.
2
Evg
Эксперт CАвтор FAQ
21117 / 8133 / 628
Регистрация: 30.03.2009
Сообщений: 22,448
Записей в блоге: 30
18.03.2012, 11:14 12
Цитата Сообщение от CheshireCat Посмотреть сообщение
но это всего лишь добрая воля разработчиков компилятора, как, например, в GCC
У gcc, насколько я понял, VLA позиционируются как собственные расширения, а не как часть стандарта C99: http://gcc.gnu.org/onlinedocs/gcc/ см. раздел 6, в который входит раздел 6.19. Если покопаться в истории, то скорее всего окажется, что VLA в gcc появились ещё до появления C99
0
305 / 228 / 15
Регистрация: 01.07.2011
Сообщений: 809
Записей в блоге: 1
18.03.2012, 12:59  [ТС] 13
Цитата Сообщение от CheshireCat Посмотреть сообщение
Языки Си (без ++) и Си++ - это разные языки
это-то понятно. применительно к учебнику Ашариной - там эти языки (и коды) так намешаны, что только зная конкретно язык Си и отдельно С++ можно понять, что автор в конкретном случае использует.
или пишет "использование директивы define препроцессора в С++ не рекомендуется", типа "делайте через const" и тут же их использует. Ну вы определитесь вконец. (кстати говоря - а почему?).
Ну, или допустим читая фразы типа "существуют две файловые системы FAT и NTFS"... что можно подумать о квалификации автора?

Добавлено через 22 минуты
Цитата Сообщение от fasked Посмотреть сообщение
я Вам кстати посоветовал бы поменьше читать русскоязычных авторов.
прям как по Булгакову
0
В астрале
Эксперт С++
8022 / 4779 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
19.03.2012, 17:24 14
remarkes, Ну потому что в плюсах можно обойтись без define-ов совершенно.
0
Evg
Эксперт CАвтор FAQ
21117 / 8133 / 628
Регистрация: 30.03.2009
Сообщений: 22,448
Записей в блоге: 30
19.03.2012, 18:49 15
Цитата Сообщение от ForEveR Посмотреть сообщение
remarkes, Ну потому что в плюсах можно обойтись без define-ов совершенно.
В С++ можно и без шаблонов обойтись. И без классов.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.03.2012, 18:49

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

массив переменной длины
Как в С++ сделать массив переменной длины (увеличивающийся), чтобы сохранялись хранящиеся там...

Массив переменной длины
Здравствуйте форумчане. Написал программу для копирования содержимого одного массива в другой....

Программа с конструктором переменной длины
Подскажите как составить программу, где конструктор класса будет принимать в качестве аргументов...

Передать в C# массив переменной длины.
Привет форумчане. Подскажите как передать в С# из dll-ки массив заранее не известного размера....


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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