Здравствуйте, Anton V. Kolotaev, Вы писали:
AVK>Здравствуйте Аноним, вы писали:
А>>Здра А>>Можно ли в С++ динамически создать мног. массив?
А>>double d[][]; А>>d = new double[10][5];
А>>или единств что возможно это
А>>double* d; А>>d = new double[10*5];
А>>и потом мучаться конвертировать индексы? А>>Спасибо
AVK>А может быть лучше потратить некоторое время на изучение стандартной библиотеки? Там есть такое понятие как std::valarray<T>, std::slice_array<T>. Как использовать — прекрасно описано у Страуструпа 22.4.5 — 22.4.6.
Дорогой Антон! Насчет прекрасно описано у Страуса — это Вы загнули. Вы хоть сами пробовли создать матрицу из valarray которую он описал и она якобы должна работать? Не работает она. Нужно еще прилично попариться, чтобы она зашевелилась.
Моя точка зрения на его труды простая: Да он создал хороший язык. Но описать его толком не смог. Видать не родился он писателем. А принципы языка крайне недружелюбны к пользователю, т.е. к нам. Недаром существует этот форум и MSDN, прежде всего чтобы мы могли все это использовать в реальности. И недаром, когда читаешь MSDN — все кристально ясно. Просто ребята из MS прилично потрудились, чтобы их студия реально приносила пользу и доход нам. А вот Страус не удосужился. Типа гений. Я тоже могу быть ооооочень большим гением, если не буду обьяснять, что же я такое сделал. Да вот только считаю это просто не приличным.
Для чего создавался язык? Прежде всего — для уменьшения наших усилий. А в реальности они все растут и растут.
И недаром MS создал .NET и тот резко стал везде использоваться.
По поводу создателей STL я ничего не скажу, т.к. все выражения исключительно нецензурные. Прошу не серчать.
Отсутсвие встроенного оптимизированного динамического массива в языке — чистый .... Закочите сами.
С уважением,
Bob
Здравствуйте, Аноним, Вы писали:
А>Можно ли в С++ динамически создать мног. массив?
ИМХО, со скобками и указателями заморачиваться не стоит — потом такой код будет тяжело поддерживать, особенно если это будете делать не вы. Юзал boost::multi_array, понравилось...
Здравствуйте, VladD2, Вы писали:
VD>Доказательство? Ооочень интересно было бы?
VD>По-моему, если написать грамотный хелпер-класс, то можно все сэмулировать. Многомерный массив всегда можно развернуть в одномерный (см. реализацию SafeArray), а удобства в работе можно скрыть за переопределением оператора [].
Может ты путаешь с разреженными массивами?
Вообще-то подобная задача называется NLM (non-linear mapping) и решается с помощью нейронных сетей. Решается достаточно хорошо, если надо увидеть глазами картину распределения кластеров многомерного пространства в 3D или даже в 2D. Но никак не в 1D! Здесь, как говорится, дружно едим конфетку "Обломиську".
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Здравствуйте, TruthfulBob, Вы писали:
TB>Моя точка зрения на его труды простая: Да он создал хороший язык. Но описать его толком не смог. Видать не родился он писателем. А принципы языка крайне недружелюбны к пользователю, т.е. к нам. Недаром существует этот форум и MSDN, прежде всего чтобы мы могли все это использовать в реальности. И недаром, когда читаешь MSDN — все кристально ясно. Просто ребята из MS прилично потрудились, чтобы их студия реально приносила пользу и доход нам. А вот Страус не удосужился. Типа гений. Я тоже могу быть ооооочень большим гением, если не буду обьяснять, что же я такое сделал. Да вот только считаю это просто не приличным.
Очень удобное себе оправдание. "Я не гений, поскольку считаю что быть им неприлично". Шутка!
TB>Для чего создавался язык? Прежде всего — для уменьшения наших усилий. А в реальности они все растут и растут. TB>И недаром MS создал .NET и тот резко стал везде использоваться.
Насчет Страуса Трупа как писателя — согласен, насчет MSDN — категорически не согласен. MSDN в основном представляет собой некий кастрированный вариант описания, сгенерированного при помощи Doxygen. Формально там все описано, но все настолько разобщено, что чтобы хоть что-то понять (читай — установить причинно-следственные связи) надо изрядно потрудиться. И если уж выбирать из двух зол, так лучше уж Страус, чем MSDN.
И если быть честными, то все пошло от Кернигана-Ричи, потом Страус подключился, ну а уж только потом-потом пошли всякие клоны типа Java и C#. По большому счету синтакс там — от C++, разве нет?
TB>По поводу создателей STL я ничего не скажу, т.к. все выражения исключительно нецензурные. Прошу не серчать. TB>Отсутсвие встроенного оптимизированного динамического массива в языке — чистый .... Закочите сами.
Не скажите. Встроенный в язык динамический массив — безусловный маздай, поскольку не дает возможности контролировать распределение памяти. В результате чего, при активном его использовании, серверный демон рухнет через пару дней активного трепыхания. Просто из за фрагментации памяти. Отсюда вывод — не надо использовать встроенный в язык динамический массив. А нафига, спрашивается, он тогда нужен?
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
TB>Дорогой Антон! Насчет прекрасно описано у Страуса — это Вы загнули. Вы хоть сами пробовли создать матрицу из valarray которую он описал и она якобы должна работать? Не работает она. Нужно еще прилично попариться, чтобы она зашевелилась.
Кстати, забыл упомянуть, что "прилично попариться" надо как раз благодаря "Дорогому Товартщу Микрософту", который ничтоже сумняшеся забубенил слова "min" и "max" в препроцессор.
Какое место за такие дела в культурном обществе пасатижами отщипывают?
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Здравствуйте, av, Вы писали:
av>1. a определяется как... av>2. ...указатель на... av>3. ...функцию, не принимающую параметров и возвращающую... av>4. ...указатель на... av>5. ...массив из 10... av>6. ...указателей на... av>7. ...char.
Круто компилируешь...
По мне, так лучше typedef. А уж если надо определить массив указателей на функции, возвращающие указатель на массив массивов функций другого типа... Формально такое объявление можно написать, но лучше-таки через typedef.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Здравствуйте, <Аноним>, Вы писали:
А>Можно ли в С++ динамически создать мног. массив? А>double d[][]; А>d = new double[10][5]; А>или единств что возможно это А>double* d; А>d = new double[10*5]; А>и потом мучаться конвертировать индексы?
Не понял, почему никто не предложил вариант (ответ с calloc я видел, но больно страшно это выглядит):
const int M = 10, N = 5;
double **d;
d = new double *[M];
for (int i = 0; i < M; i++)
{
d[i] = new double[N];
}
Пользоваться d[i][j];
Чтобы освободить память:
for (int i = 0; i < M; i++)
{
delete []d[i];
}
delete []d;
Здравствуйте, <Аноним>, Вы писали:
А>Здра А>Можно ли в С++ динамически создать мног. массив?
А>double d[][]; А>d = new double[10][5];
А>или единств что возможно это
А>double* d; А>d = new double[10*5];
А>и потом мучаться конвертировать индексы? А>Спасибо
boost::multi_array однозначно
все велосипеды уже давно изобретены
... << RSDN@Home 1.1.3 stable >>
Re[2]: Многомерные массивы динамически
От:
Аноним
Дата:
11.11.04 12:35
Оценка:
Действительно развели такую дискусию на путом месте. Это же стандартный пример описанный в книга для начинающий программировать на C++.
Здравствуйте, <Аноним>, Вы писали:
А>Здра А>Можно ли в С++ динамически создать мног. массив?
А нет никакой ложки. Они все одномерные. Просто это один из способов адресации.
Здравствуйте, glyph, Вы писали:
G>Здравствуйте, <Аноним>, Вы писали:
А>>Здра А>>Можно ли в С++ динамически создать мног. массив? G> А нет никакой ложки. Они все одномерные. Просто это один из способов адресации.
Абсолютно согласен !
Вы можете соэдать некий шаблон компилятору и динамически выделяя память адресовать ее через шаблон
Пример:
typedef int i[3][5]; //создаем шаблон
i *i2; // создаем указатель типа шаблонint *ii; // создаем линейный указательint main()
{
i2=(i*)calloc(1,sizeof(i)); // Динамически резервируем память
ii=(int*)i2; // Линейный указатель тудаже
i2[0][1][1]=10; // в 0-ой элемент [1][1] заносим 10
printf("%d",i2[0][1][1]); // отображение
// ii[6] тоже будет равно 10
free(i2);
getch();
return(0);
}
Если же имелось ввиду создать некий абстрактный массив int i[][] аосле чего выделить память int [3][5]
и пытатся к ней обращатся по шаблонй i[3][5] то это средствами компилятора не возможно так как
копилятору не определен шаблон пересчета адресов.
Здравствуйте, Аноним, Вы писали:
А>Действительно развели такую дискусию на путом месте. Это же стандартный пример описанный в книга для начинающий программировать на C++.
Такие книги надо всенародно сжигать, а авторов отправлять на каторжные работы программировать на васике...
Здравствуйте, Nuald, Вы писали:
А>>Действительно развели такую дискусию на путом месте. Это же стандартный пример описанный в книга для начинающий программировать на C++.
N>Такие книги надо всенародно сжигать, а авторов отправлять на каторжные работы программировать на васике...
Совершенно не согласен. Человек, задавший вопрос, явно только начинает разбираться с языком.
И учить его надо, двигаясь от простого к сложному, но никак не наоборот. boost::multi_array хорошо. Но человек, который второй раз в жизни пишет программу на С++ может потерять всякое желание писать третью, взглянув на
Здравствуйте, Laurel, Вы писали:
L> Очень хочу посмотреть с чего Вы начинали программировать вообще и на С++ в частности. Боюсь, не с boost и не с STL.
Я начинал программировать на С++ с написания ECMA-262 подобного скриптового языка
И у меня даже получилось
Здравствуйте, Laurel, Вы писали:
L> Очень хочу посмотреть с чего Вы начинали программировать вообще и на С++ в частности. Боюсь, не с boost и не с STL.
Я вообще начинал с С, т.к. в то время С++ еще как такого не было в том виде, который есть сейчас. Но что пригодно для С, не должно использоваться в С++, т.к. вся его мощь именно в шаблонах, строгой типизации и т.п., но никак не в адресной арифметике. Если человек начнет программировать с адресной арифметики, то он разочаруется намного раньше в С++...
Здравствуйте, Nuald, Вы писали:
N>Здравствуйте, Laurel, Вы писали:
L>> Очень хочу посмотреть с чего Вы начинали программировать вообще и на С++ в частности. Боюсь, не с boost и не с STL.
N>Я вообще начинал с С, т.к. в то время С++ еще как такого не было в том виде, который есть сейчас. Но что пригодно для С, не должно использоваться в С++, т.к. вся его мощь именно в шаблонах, строгой типизации и т.п., но никак не в адресной арифметике. Если человек начнет программировать с адресной арифметики, то он разочаруется намного раньше в С++...
С++ — адресная арифметика = С#
Мощь C++ -- в том что он основан на С. И типизация в С не менее строгая, чем в С++. И адресная арифметика, нравится это кому-то или нет -- основополагающая часть языка.