Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> массивы переменой длины в кач. аргументов функции, неясная ошибка при компиляции (Яз. Си) 
V
    Опции темы
MAKCim
Дата 27.4.2009, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



я даже больше скажу
sysfs и реализация kobject/kset в ядре linux - это сплошной полиморфизм на С
там все предельно просто и эффективно

я вообще-то специально оговорил, что не стОит начинать споры про ООП, т. к ООП != ЯП


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
mes
Дата 27.4.2009, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



MAKCim,  приведенный код, работает также и на плюсах, однако там так не пишут.
почему если помимо этого способа, есть еще другой, то выбор остановился за вторым ?

И вот еще, а то никак не пойму, Вы считаете, что 
1. тех средств что в Си достаточно, и можно выкрутиться в любой ситуации
2. тех средств что в Си явно достаточно, и предлагаемые возможности С++ просто излишни.

Цитата(MAKCim @  27.4.2009,  12:29 Найти цитируемый пост)
я вообще-то специально оговорил, что не стОит начинать споры про ООП, т. к ООП != ЯП 

так вроде пока не затрагивали: в частности полиморфизм свойствен далеко не только  ООП.

Ну а вобще я думаю подобный спор можно решить, только сравнив изящность двух решений одной небольшой, но показательной задачи..
Осталось только подобрать такую задачку smile








--------------------
PM MAIL WWW   Вверх
MAKCim
Дата 27.4.2009, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(mes @  27.4.2009,  14:16 Найти цитируемый пост)
тех средств что в Си достаточно, и можно выкрутиться в любой ситуации

да

Цитата(mes @  27.4.2009,  14:16 Найти цитируемый пост)
тех средств что в Си явно достаточно, и предлагаемые возможности С++ просто излишни.

да


Цитата(mes @  27.4.2009,  14:16 Найти цитируемый пост)
так вроде пока не затрагивали: в частности полиморфизм свойствен далеко не только  ООП.

ну как бы "полиморфизм-наследование-инкапсуляция"  smile 

Цитата(mes @  27.4.2009,  14:16 Найти цитируемый пост)
Ну а вобще я думаю подобный спор можно решить, только сравнив изящность двух решений одной небольшой, но показательной задачи..

для меня все очевидно
я этих задач уже достаточно много решил

мою позицию никому не навязываю, но и доказывать никому ничего не буду 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Pieris
Дата 27.4.2009, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 24.4.2009
Где: Питер

Репутация: 1
Всего: 1



Раньше я конечно просматривал программерские форумы, но пока не поучавствовал сам, не почувствовал, насколько у людей прослеживается тенденция отступать собственно от темы. Вряд-ли это есть хорошо, хотя бы потому, что сторонний человек, придя на интересующую его ветку форума, может просто не увидеть за деревьями леса (читай решения конкретного вопроса за обсуждениями сторонних тем). Не желая поддерживать эту тенденцию, я хочу вкрадце резюмировать информацию по существу вопроса:
  • Массивы переменной длины ДЕЙСТВИТЕЛЬНО существуют и называются ИМЕННО массивами переменной длины (подчеркиваю это, т.к. на другом форуме меня обвинили в том, что я использую терминологию своего препода).
  • Массивы переменной длины применяются ТОЛЬКО в языке Си(без плюсов) и ТОЛЬКО при использовании компилятора, поддерживающего стандарт С99, и совершенно понятно что компиляторы С++ НЕ БУДУТ компилировать такой код ПО ОПРЕДЕЛЕНИЮ.
  • Массивы переменной длины(как можно было-бы подумать) НЕ ИЗМЕНЯЮТ в действительности своей длины и будучи созданным, сохраняют свои размеры, а называются так из-за того, что размерность таких массивов задается не при помощи констант или константных выражений, а при помощи переменных, и именно поэтому, в отличие от традиционного синтаксиса наподобии
    int function(int *ptr, int n) или double function( double arr[][10], int n) - где n ОДНА из размерностей массива, используют запись, где размерность массива задается переменными, объявленными В ОБЯЗАТЕЛЬНОМ порядке РАНЬШЕ, чем объявление массива, использующего эти переменные в качестве размерностей, т.е. например: 
    void funct(int rows, int cols, double arr[rows][cols]) (понятно, что тип возвращаемого функцией значения, как и тип массива может быть любым).
  • Использование МПД имеет ряд ограничений: они объявляются либо в (теле) функции, либо как параметры функции.Кроме того их нельзя инициализировать в объявлении.
  • Приемуществом функций использующих запись в стиле МПД является то, что они могут использоваться для обработки массивов любых размерностей, и поскольку в действительности объявление такого массива в списке параметров функции на самом деле не приводит к созданию массива, фактически такая функция работает(как и в случае старого синтаксиса) с данными переданного ей исходного массива.
  • По поводу ошибок компиляции при использовании синтаксиса в стиле МПД можно сказать следующее: конкретно компилятор GCC по умолчанию использует синтаксис последнего стандарта(т.е. С99), и ЕСЛИ у вас не компилится такой код, попробуйте поэксперементировать с опциями оптимизации, именно это явилось причиной моих злоключений, если вы используете другой компилятор, то убедитесь что он поддерживает стандарт С99, и если это имеет место, но программа попрежнему не компилится, то возможно компилятору нужно явно указать опцию, задействующую возможности стандарта С99(в gcc например это опция командной строки -std=c99, хотя как сказано выше её применение в данной конкретной среде излишне), ЕСЛИ и в этом случае результат отрицательный, попробуйте поиграть с опциями оптимизации, возможно причина кроется именно в этом.
Да простят мне модераторы, неумелое использование тегов.

Это сообщение отредактировал(а) Pieris - 27.4.2009, 23:55
PM MAIL ICQ   Вверх
mes
Дата 28.4.2009, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Pieris @  27.4.2009,  22:50 Найти цитируемый пост)
для обработки массивов любых размерностей

насколько я понимаю, для обработки статических массивов любой размерности.




--------------------
PM MAIL WWW   Вверх
math64
Дата 28.4.2009, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Массив выделяется на стеке, он не статический, но нужно чтобы размер стека был достаточен для размещения такого массива.

Добавлено через 3 минуты и 2 секунды
это про массив исопльзуемый в функции. массив передаваемый через параметры может быть выделен где угодно - хоть статический, хоть на стеке, хоть с помощью malloc().
PM   Вверх
mes
Дата 28.4.2009, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(math64 @  28.4.2009,  09:40 Найти цитируемый пост)
Массив выделяется на стеке, он не статический, но нужно чтобы размер стека был достаточен для размещения такого массива.

Статический массив - противопоставление динамическому массиву и о том где выделено для него память не говорится.

Выражение 
Цитата

для обработки массивов любых размерностей

Я растолковал, что можно будет в функцию принимающую массив переменной длины, передать любой многомерный массив.  
Разница между многомерным статическим и динамическим массивом в Си, то что первый линеен, а второй представлен как многоуровневый массив указателей. (т.е **...)
Соответсвенно передать двухмерный динамический массив как массив переменной длины не возможно. Но можно передать одну из его размерностей и рассматривать ее как двухмерный массив.

Хотя вполне допускаю, что не совсем точно понял мысль. 
smile




--------------------
PM MAIL WWW   Вверх
Dov
Дата 28.4.2009, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 15
Всего: 88



mes, массив переменной длины подразумевает то, что его размеры компилятор вычисляет не на этапе компиляции (как у обычных статических массивов, где размеры задаются константами), а во время работы программы. В этом плане, по моему мнению, речь о динамических массивах не идёт, по вышеизложенной причине.   smile

Добавлено @ 12:19
т.е. можно сделать так:
Код
void func(int cols, int rows)
{
    int arr[cols][rows];
}

здесь при каждом вызове ф-ции размеры массива могут меняться.

Это сообщение отредактировал(а) Dov - 28.4.2009, 12:22


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
azesmcar
Дата 28.4.2009, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата

здесь при каждом вызове ф-ции размеры массива могут меняться.

 smile это же не будет работать

Добавлено @ 14:16
 smile 
Это шедевр smile 

тема началась с
Цитата

массивы переменой длины в кач. аргументов функции, неясная ошибка при компиляции 

развернулась дискуссия на 4 страницы..и на последней странице я вижу сообщение
Цитата

sysfs и реализация kobject/kset в ядре linux - это сплошной полиморфизм на С

 smile вы не загнули ребята?

Добавлено через 7 минут и 3 секунды
Dov

Код

template <int cols, int rows>
void func()
{
    int arr[cols][rows];
}

может вот так имелось ввиду?

Это сообщение отредактировал(а) azesmcar - 28.4.2009, 14:17
PM   Вверх
math64
Дата 28.4.2009, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Имелось ввиду не это
Код

template <int cols, int rows>
void func()
{
    int arr[cols][rows];

}

Здесь при каждом вызове (с разными аргументами) генерируется свой код. И кроме тог cols, rows должны быть константами.
Код

void func(int cols, int rows)
{
    int arr[cols][rows];
   /* do something this arr */
}
int main (int argc, char**argv) {
  if (argc < 3)
    return 1;
  int cols = atoi(arv[1]);
  int rows = atoi(arv[2]);
  if (cols <= 0 || rows <= 0 || cols * rows > 10000)
    return 2;
  func(cols, rows);
  return;
}

PM   Вверх
MAKCim
Дата 28.4.2009, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



azesmcar
Цитата(azesmcar @  28.4.2009,  14:14 Найти цитируемый пост)
это же не будет работать

будет




--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
azesmcar
Дата 28.4.2009, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата

будет

 smile 

Выдаст что-то вроде expected constant expression.

Добавлено через 11 минут и 47 секунд
user posted image

даже если этот код где-то и работает - этот код непереносим.
PM   Вверх
mes
Дата 28.4.2009, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(azesmcar @  28.4.2009,  13:51 Найти цитируемый пост)
Выдаст что-то вроде expected constant expression.

не из того стандарта выдержка smile
Цитата(azesmcar @  28.4.2009,  13:51 Найти цитируемый пост)
даже если этот код где-то и работает - этот код непереносим. 


Цитата(Pieris @  27.4.2009,  22:50 Найти цитируемый пост)
Массивы переменной длины применяются ТОЛЬКО в языке Си(без плюсов) и ТОЛЬКО при использовании компилятора, поддерживающего стандарт С99, и совершенно понятно что компиляторы С++ НЕ БУДУТ компилировать такой код ПО ОПРЕДЕЛЕНИЮ.

smile


--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 28.4.2009, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



mes

аааа smile 
ну извиняйте..не прочитал все 4 страницы..я думал речь о С++ идет smile
Развели дискуссию сам черт ногу сломает smile
PM   Вверх
math64
Дата 28.4.2009, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Как ни странно, работает, даже если файл дать расширение .cpp (компилятор gcc, естественно)
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1107 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.