Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. 0.Пусть у нас есть двумерный массив: Код: plaintext 1. 2. 3. 4. 1.Так мы найдем минимум в каждой строке: Код: plaintext 1. 2. 3. 2. Написать свои функции поиска минимума и максимума не составляет труда, однако мне хотелось бы использовать существующие возможности С++. Подскажите пожалуйста по следующим вопросам: q1 Как использовать существующий функционал С++ для поиска min в столбцах матрицы? Будут ли при этом какие-то потери по времени в отличие от классической реализации? Как бы вы поступили на практике? q2 Когда вы пишите программы на С++, используете ли вы функции выделения памяти malloc,calloc и др. ? q3 Каким образом вы бы оформили код из пункта 1, в стиле С++ ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2016, 03:31 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
SashaMercuryЗдравствуйте. 0.Пусть у нас есть двумерный массив: Код: plaintext 1. 2. 3. 4. / начнем с того, что это - не двумерный массив, а массив массивов. 2. Написать свои функции поиска минимума и максимума не составляет труда, однако мне хотелось бы использовать существующие возможности С++. Подскажите пожалуйста по следующим вопросам: q1 Как использовать существующий функционал С++ для поиска min в столбцах матрицы? ну, по хитрому вычислять индексы в матрице, и в цикле на range обрабатывать. или в for each. Будут ли при этом какие-то потери по времени в отличие от классической реализации? ой, Там при обработке в памяти какие потоки по времени то? Как бы вы поступили на практике? не знаю, какую-то библиотеку на этот счет бы нашел. q2 Когда вы пишите программы на С++, используете ли вы функции выделения памяти malloc,calloc и др. ? нет. даже лучше new не использовать явно. q3 Каким образом вы бы оформили код из пункта 1, в стиле С++ ? не знаю, надо подумать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2016, 07:57 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
многомерный массив отличается от вложенных массивов именно тем, что доступ ко всей памяти массива происходит регулярным образом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2016, 08:01 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
в c++ забыли/не захотели сделать полноценные многомерные массивы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2016, 08:41 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
SashaMercury0.Пусть у нас есть двумерный массив: Код: plaintext 1. 2. 3. 4. Выделяй память одним большим куском Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2016, 08:49 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
Изопропилв c++ забыли/не захотели сделать полноценные многомерные массивы А скольки -мерность нам нужна в языке? Выше 2-й степени идёт полиномиальный расход памяти. Возможно хештаблички решат это задачу более экономно. Разумеется я исхожу из предположения что пользователь не всегда использует весь диапазон ключей и большая часть ячеек остаются нулями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2016, 12:58 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
maytonА скольки -мерность нам нужна в языке? >1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2016, 13:00 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
ИзопропилmaytonА скольки -мерность нам нужна в языке? >1 Ну назови задачу где тебе нужен был массив выше двух измерений. И что там хранилось и как использовалось? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2016, 13:03 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
Изопропилв c++ забыли/не захотели сделать полноценные многомерные массивы Потому что кому надо может тривиально реализовать класс с таким функционалом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2016, 13:14 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
maytonИзопропилпропущено... >1 Ну назови задачу где тебе нужен был массив выше двух измерений. В Fortran-90, если ничего не путаю, их 7. Мне больше 6-ти как-то не требовалось... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2016, 14:03 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
mayton, я тут не так давно карты Кохонена юзал, Там в моделях 7-10 изменений - легко.. вообще, любые матмодели .... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2016, 14:04 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
MasterZiv, крутяк. И как они хранились в memory? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2016, 14:18 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
Допустим у нас есть некий язык X++ в котором можно сделать следующее: Код: plaintext 1. 2. Как его аллоцировать? В какую структуру? Как его экстендить. Как он будет деградировать (освобождать память)? В хешмапу? А в какую? А если мне надо будет сделать срез (итаратор по 3-му параметру) то как взять значения которые у меня уже в кубе? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2016, 14:53 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
maytonКак его аллоцировать? В какую структуру? Как его экстендить. Как он будет деградировать (освобождать память)? ИМХУ в одномерный массив. Какая разница сколько измерений? Расчет смещения относительно начала прост: например в arr[M][N][K][L] , надо получить элемент a[1][2][3][4] смещение будет Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2016, 15:05 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
Дима это банально. Ты подумай сколько у тебя памяти и какие диапазоны индексов отсюда всплывают. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2016, 15:08 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
maytonДима это банально. Ты подумай сколько у тебя памяти и какие диапазоны индексов отсюда всплывают. Если это обычный (не ассоциативный) массив, то элементов будет M*N*K*L и от эвристики меньше не станет. Другой вопрос как оно в память ляжет, а тут не столько память важна (докупить можно если очень надо), сколько кэш проца, поэтому самое часто перебираемое измерение должно быть последнее, т.е. L. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2016, 15:19 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
Dima T, ну припустим я эти значения M,N,K.... еще не знаю. Я буду грузить данные из внешнего файла. Из СSV. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2016, 15:23 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
MasterZiv q1 Как использовать существующий функционал С++ для поиска min в столбцах матрицы? ну, по хитрому вычислять индексы в матрице, и в цикле на range обрабатывать. или в for each. Не может кто-нибудь привести конкретный пример, пожалуйста ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2016, 15:27 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
maytonИзопропилпропущено... >1 Ну назови задачу где тебе нужен был массив выше двух измерений. И что там хранилось и как использовалось? У меня в программах на Maple есть 4х мерные матрицы. Для реализации приближенных методов, коэффициенты в вычислительной схеме имеют 4 индекса ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2016, 15:31 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
Например, если в качестве набора базисных функций использовать , строим невязку и уже имеем коэффициенты адресуемые 4мя индексами ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2016, 15:35 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
maytonDima T, ну припустим я эти значения M,N,K.... еще не знаю. Я буду грузить данные из внешнего файла. Из СSV. А какая разница M,N,K это константы или переменные? Другое дело если ты не знаешь как будут использоваться эти M,N,K. Кстати "грузить" это уже отдельная ресурсоемкая задача. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2016, 15:40 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
Dima TmaytonКак его аллоцировать? В какую структуру? Как его экстендить. Как он будет деградировать (освобождать память)? ИМХУ в одномерный массив. Какая разница сколько измерений? Расчет смещения относительно начала прост: например в arr[M][N][K][L] , надо получить элемент a[1][2][3][4] смещение будет Код: plaintext 1. в общем случае адрес p+(i 1 -l 1 ) * s 1 + (i 1 -l 2 ) * s 2 +... где s n - шаг по измерению(stride) это позволяет строить вырезки(slice) в том числе и с уменьшением числа измерений p,l i ,s i - хратятся в паспорте(дескрипторе) массива ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2016, 16:01 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
Так что решили? 5-мерным массивам дать жизнь? Или обойдемся проекциями на одномерный? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2016, 16:21 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
maytonТак что решили? 5-мерным массивам дать жизнь? Или обойдемся проекциями на одномерный? ИМХУ Задачу надо конкретную. Под нее структуру хранения выбирать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2016, 16:33 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
SashaMercuryMasterZiv q1 Как использовать существующий функционал С++ для поиска min в столбцах матрицы? ну, по хитрому вычислять индексы в матрице, и в цикле на range обрабатывать. или в for each. Не может кто-нибудь привести конкретный пример, пожалуйста http://ideone.com/wama4t Код: plaintext 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. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. Пара плюсов: 1. Работает для любых типов, для которых определен < 2. Чем хороши стандартные алгоритмы, что при необходимости легко можно использовать их параллельные версии: thrust::transform для распараллеливания на CPU или GPU - в зависимости от типа переданного вектора. Можно ставить на CPU-only машины. Или в будущем когда разродятся в стандарте std::experimental::parallel::transform для распараллеливания на CPU. А алгоритмов распаралеленных там много: https://thrust.github.io/doc/namespacethrust.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2016, 16:51 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
Dima TmaytonТак что решили? 5-мерным массивам дать жизнь? Или обойдемся проекциями на одномерный? ИМХУ Задачу надо конкретную. Под нее структуру хранения выбирать. Мне послышался тезис об изменениях в language. А как можно language - под задачу? Нонсенс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2016, 20:03 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
maytonDima Tпропущено... ИМХУ Задачу надо конкретную. Под нее структуру хранения выбирать. Мне послышался тезис об изменениях в language. А как можно language - под задачу? Нонсенс. Все можно, но с дуру можно и ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.08.2016, 20:50 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
Вася Уткин, то, что вы привели, является так называемой "хорошей практикой" ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2016, 15:13 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
Dima TSashaMercury0.Пусть у нас есть двумерный массив: Код: plaintext 1. 2. 3. 4. Выделяй память одним большим куском Код: plaintext 1. 2. Какие в таком случае будут преимущества? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.08.2016, 15:13 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
Изопропилв c++ забыли/не захотели сделать полноценные многомерные массивы Правда, почему их нет? Сейчас дорабатываю один численный алгоритм, оперирую несколькими массивами массивов, на динамическое выделение памяти уходит 4 строчки, столько же на освобождение. Можно написать свою функцию для этого, но хотелось бы чтобы это уже было на уровне языка. Неужели этого нет в С++? Мне кажется, что я что-то просто не знаю о его возможностях ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2016, 09:28 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
SashaMercuryКакие в таком случае будут преимущества? Возможно Дима ратовал за экономию памяти. Дешевле 1 кусок в 100 байт чем 100 кусков по 1 байту. Плюс если ты используешь "зубчатые" массивы массивов то там теоретически тоже может быть экономия. Но это все в теории невозможно подсчитать. Лучше создать два макета и посмотреть как оно будет практически. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2016, 09:59 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
SashaMercuryоперирую несколькими массивами массивов сравни массив массивов с массивами в Algol-68 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2016, 10:13 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
SashaMercuryСейчас дорабатываю один численный алгоритм, оперирую несколькими массивами массивов, на динамическое выделение памяти уходит 4 строчки, столько же на освобождение. Можно написать свою функцию для этого, но хотелось бы чтобы это уже было на уровне языка. Неужели этого нет в С++? SashaMercury, твой код не имеет ничего общего с С++ . SashaMercuryЗдравствуйте. 0.Пусть у нас есть двумерный массив: Код: plaintext 1. 2. 3. 4. malloc - это старый добрый С. А в С можно объявлять массивы переменного размера (но размер указывается только при объявлении). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2016, 11:57 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
BagaBagaSashaMercuryСейчас дорабатываю один численный алгоритм, оперирую несколькими массивами массивов, на динамическое выделение памяти уходит 4 строчки, столько же на освобождение. Можно написать свою функцию для этого, но хотелось бы чтобы это уже было на уровне языка. Неужели этого нет в С++? SashaMercury, твой код не имеет ничего общего с С++ . SashaMercuryЗдравствуйте. 0.Пусть у нас есть двумерный массив: Код: plaintext 1. 2. 3. 4. malloc - это старый добрый С. А в С можно объявлять массивы переменного размера (но размер указывается только при объявлении). По существу вы не правы. Но даже если бы вы были правы, это не принципиально, замените malloc на new и получите те-же 4 строчки. Если у вас есть другое решение, то я буду очень рад его увидеть. Мне кажется что оно есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2016, 12:14 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
SashaMercuryПравда, почему их нет? Потому что 1) у всех разные требования 2) их не проблема самому реализовать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2016, 12:42 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
SashaMercuryПо существу вы не правы. Отличная аргументация! С чего бы это? Не покажете то существо, по которому я не прав? Ну и пункт стандарта С++, описывающий malloc как часть C++ или его стандартной библиотеки ... Всё прекрасно работает Код: plaintext 1. 2. 3. 4. 5. Обратите внимание - ни одного new/delete или malloc/free. Разумеется, откомпилится __только__ как С-код. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2016, 13:29 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
BagaBagaSashaMercuryПо существу вы не правы. Отличная аргументация! С чего бы это? Не покажете то существо, по которому я не прав? Ну и пункт стандарта С++, описывающий malloc как часть C++ или его стандартной библиотеки ... Всё прекрасно работает Код: plaintext 1. 2. 3. 4. 5. Обратите внимание - ни одного new/delete или malloc/free. Разумеется, откомпилится __только__ как С-код. С++ http://ideone.com/zbo3D9 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2016, 13:34 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
BagaBagaВсё прекрасно работает Код: plaintext 1. 2. 3. 4. 5. Поработает до чего-то подобного Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2016, 13:41 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
BagaBagaНу и пункт стандарта С++, описывающий malloc как часть C++ или его стандартной библиотеки ... Appendix C.2 п.7 Ну и по всему стандарту конечно есть куча упоминаний, про то что большинство конструкций и библиотек С являются частью С++. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2016, 13:50 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
BagaBagaSashaMercuryПо существу вы не правы. Отличная аргументация! С чего бы это? Не покажете то существо, по которому я не прав? Ну и пункт стандарта С++, описывающий malloc как часть C++ или его стандартной библиотеки ... Всё прекрасно работает Код: plaintext 1. 2. 3. 4. 5. Обратите внимание - ни одного new/delete или malloc/free. Разумеется, откомпилится __только__ как С-код. В последнем стандарте языка С это разрешено (объявление массива auto с размером, задаваемым переменной, т.е. в runtime), также добавлена alloca(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2016, 14:00 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky, вообще-то Appendix С посвящён обеспечению совместимости. С тем же успехом можно любую фичу, хоть из того же фортрана или явы, которая "доступна для обеспечния совместимости" объявлять частью С++. Вот только нужно ли? Ведь тогда и printf, и весь С-style ввод-вывод придётся признать как "часть С++"... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2016, 14:02 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
Dima TПоработает до чего-то подобного Код: plaintext 1. 2. Не беспокойтесь за переполнение стека раньше времени. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2016, 14:10 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
MasterZivBagaBagaпропущено... Отличная аргументация! С чего бы это? Не покажете то существо, по которому я не прав? Ну и пункт стандарта С++, описывающий malloc как часть C++ или его стандартной библиотеки ... Всё прекрасно работает Код: plaintext 1. 2. 3. 4. 5. Обратите внимание - ни одного new/delete или malloc/free. Разумеется, откомпилится __только__ как С-код. В последнем стандарте языка С это разрешено (объявление массива auto с размером, задаваемым переменной, т.е. в runtime), также добавлена alloca(). Variable Length Array разрешен, начиная с С99. Но вы правы - и в последнем тоже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2016, 14:13 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
BagaBagaвообще-то Appendix С посвящён обеспечению совместимости. Там написано что этот раздел описывает разницу между С и С++. И в частности C.2 п.7 говорит The C ++ standard library provides 209 standard functions from the C library (включая malloc). Мотивация (совместимость) тут не имеет значения. Главное "C ++ standard library provides", т.е. это часть С++. BagaBagaВедь тогда и printf, и весь С-style ввод-вывод придётся признать как "часть С++"... Естественно и printf - часть С++ - п.27.8.2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2016, 14:42 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky, тогда у вас весь С входит в С++ как его подмножество... В этом мы немного расходимся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2016, 15:02 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
BagaBagaтогда у вас весь С входит в С++ как его подмножество... В этом мы немного расходимся. Не весь. Приложение С стандарта описывает какое подмножество С входит в С++. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2016, 15:07 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
Я понял почему мне не нравятся двумерные массивы. Они отчасти решают задачу sparse matrices, но если разработчик хочет полного решения то ему неизбежно нужна библиотека или фреймворк для поддержки этой сложной и интересной возможности. А так.. на уровне ЯП оно или не нужно или легко заменить на массив std::string ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2016, 15:16 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
BagaBagaSashaMercuryСейчас дорабатываю один численный алгоритм, оперирую несколькими массивами массивов, на динамическое выделение памяти уходит 4 строчки, столько же на освобождение. Можно написать свою функцию для этого, но хотелось бы чтобы это уже было на уровне языка. Неужели этого нет в С++? SashaMercury, твой код не имеет ничего общего с С++ . SashaMercuryЗдравствуйте. 0.Пусть у нас есть двумерный массив: Код: plaintext 1. 2. 3. 4. malloc - это старый добрый С. А в С можно объявлять массивы переменного размера (но размер указывается только при объявлении). BagaBagaSashaMercuryПо существу вы не правы. Отличная аргументация! С чего бы это? Не покажете то существо, по которому я не прав? Ну и пункт стандарта С++, описывающий malloc как часть C++ или его стандартной библиотеки ... Всё прекрасно работает Код: plaintext 1. 2. 3. 4. 5. Обратите внимание - ни одного new/delete или malloc/free. Разумеется, откомпилится __только__ как С-код. 1. Если мой код не имеет ничего общего с С++, то с таким-же успехом вы можете утверждать что С++ не имеет ничего общего с Си. 2. Достаточно очевидно, что с аналогичным успехом можно использовать и оператор new 3. Я очень не хочу спорить по очевидным моментам как для вас, так и для меня и для всех остальных, думаю все друг друга прекрасно поняли. Выделение памяти на стеке меня совершенно не интересует ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2016, 15:23 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
SashaMercury1. Если мой код не имеет ничего общего с С++, то с таким-же успехом вы можете утверждать что С++ не имеет ничего общего с Си. 2. Достаточно очевидно, что с аналогичным успехом можно использовать и оператор new 3. Я очень не хочу спорить по очевидным моментам как для вас, так и для меня и для всех остальных, думаю все друг друга прекрасно поняли. Выделение памяти на стеке меня совершенно не интересует 1. Вы можете продолжать думать, что пишете на С++. И использовать malloc и new, printf и cout. Если так принято в вашей команде (если она есть). А приписывать мне чужой бред - не надо. 2. Современный С++ практически не использует оператор new. И это современный тренд развития С++. Если вам нужен контейнер с управлением памятью - используйте из библиотек (stl, boost, любая на ваш вкус, можете написать свою). Хоть vector, хоть dynarray эффективно прячут от программиста управление выделением памятью. Любое "ручное" выделение ресурса обязательно сопровождается стражем (освобождения) ресурса (RAII-идиома). 3. В чём __конкретно__ я не прав, и что же это за существо, по которому я не прав, вы так и не ответили. Выделение памяти на стеке или в куче - детали реализации. Если для решения задачи достаточно памяти стека, я возьму стек. Иначе - буду смотреть в кучу. Или специализированные аллокаторы. Если вы не можете предсказать режим и потребляемый объем памяти, то и с выделением в куче ... мало хорошего получите (что лучше - свалиться по стеку, или засвописть систему и свалиться уже тогда?) Вы всегда знаете, где именно будет выделена память тем или иным классом? Тем же string? А в случае small-string-optimization? ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2016, 16:22 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
BagaBagaDima TПоработает до чего-то подобного Код: plaintext 1. 2. Не беспокойтесь за переполнение стека раньше времени. Соглашусь, кто-то уже побеспокоился за меня. Проблему переполнения стэка наблюдал недавно в MSVC2015 с массивами фиксированного размера, затестил double arr[n]; так оно просто не компилируется, похоже MS просто еще не решил как реализовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2016, 20:04 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
BagaBagaSashaMercury1. Если мой код не имеет ничего общего с С++, то с таким-же успехом вы можете утверждать что С++ не имеет ничего общего с Си. 2. Достаточно очевидно, что с аналогичным успехом можно использовать и оператор new 3. Я очень не хочу спорить по очевидным моментам как для вас, так и для меня и для всех остальных, думаю все друг друга прекрасно поняли. Выделение памяти на стеке меня совершенно не интересует 1. Вы можете продолжать думать, что пишете на С++. И использовать malloc и new, printf и cout. Если так принято в вашей команде (если она есть). А приписывать мне чужой бред - не надо. 2. Современный С++ практически не использует оператор new. И это современный тренд развития С++. Если вам нужен контейнер с управлением памятью - используйте из библиотек (stl, boost, любая на ваш вкус, можете написать свою). Хоть vector, хоть dynarray эффективно прячут от программиста управление выделением памятью. Любое "ручное" выделение ресурса обязательно сопровождается стражем (освобождения) ресурса (RAII-идиома). 3. В чём __конкретно__ я не прав, и что же это за существо, по которому я не прав, вы так и не ответили. Выделение памяти на стеке или в куче - детали реализации. Если для решения задачи достаточно памяти стека, я возьму стек. Иначе - буду смотреть в кучу. Или специализированные аллокаторы. Если вы не можете предсказать режим и потребляемый объем памяти, то и с выделением в куче ... мало хорошего получите (что лучше - свалиться по стеку, или засвописть систему и свалиться уже тогда?) Вы всегда знаете, где именно будет выделена память тем или иным классом? Тем же string? А в случае small-string-optimization? ) Конкретно вы не правы в том: 1. Что утверждали что С++ не имеет никакого отношения к функции malloc. Выше вам привели ссылку на стандарта языка С++ и даже цитату опровергающее ваше суждение 2. Пусть у вас сохранится ваше личное мнение, на которое вы безусловно имеете все права, и пусть malloc - в принципе нелегальная функция в контексте С++. Я уже не раз вам подсказал, в том случае, если вы используете оператор new, аналогичный код сохранится, как и 4 строчки. И конечно, ваши придирки не по существу (и в принципе необоснованные, см. п. 1) не должны были иметь место. 3. Откуда у вас информация о том, как часто в языке С++ используется new ? Я недостаточно хорошо разбираюсь в специфике организации работы кучи и стека, потому не могу как-то обстоятельно прокомментировать ваш последний абзац. Но у меня не раз возникала ситуация, что выделение памяти на стеке приводило к краху программы. Приведите пожалуйста конкретный пример, как по вашему правильным было бы динамически выделить память на массив массивов или двумерный массив используя только С++ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2016, 02:50 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
SashaMercuryИ конечно, ваши придирки не по существуnew/delete - части C++, имеющие специальную поддержку. Когда вызывается new(), то компилятор "понимает", что в деструкторе надо вызвать соответствующий delete(). Когда вызывается malloc(), то вы должны написать деструктор, в котором будет вызван free(). И это код, который надо не только написать, но и сопровождать. P.S. То, что "это" можно использовать, ещё не означает, что "это" нужно использовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2016, 03:03 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovSashaMercuryИ конечно, ваши придирки не по существуnew/delete - части C++, имеющие специальную поддержку. Когда вызывается new(), то компилятор "понимает", что в деструкторе надо вызвать соответствующий delete(). Когда вызывается malloc(), то вы должны написать деструктор, в котором будет вызван free(). И это код, который надо не только написать, но и сопровождать. P.S. То, что "это" можно использовать, ещё не означает, что "это" нужно использовать. Возможно вы и правы, однако первоначальное утверждение было не том, нужно или не нужно (или насколько это хороший тон), а легально или нелегально в принципе относительно языка С++. А это кардинально разные понятия ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2016, 03:13 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovКогда вызывается new(), то компилятор "понимает", что в деструкторе надо вызвать соответствующий delete(). Когда вызывается malloc(), то вы должны написать деструктор, в котором будет вызван free(). И это код, который надо не только написать, но и сопровождать. А можно минимальный пример когда компилятор понимает что автоматически надо вызвать delete? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2016, 03:18 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyА можно минимальный пример когда компилятор понимает что автоматически надо вызвать delete?Нет, нельзя, т.к. я был грубо неправ насчёт автоматического вызова delete в деструкторах. Наоборот - delete автоматически вызовет деструкторы для объектов, которые разместил new. Но, я продолжаю настаивать, что использование malloc/free в языке, где для управления памятью предназначены new/delete - неправильно. Даже в тех случаях, когда использование malloc/free (иных системно-ориентированных аналогов) - необходимо, стОит подумать или о буферированном new или о переопределении стандартных new/delete. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2016, 03:38 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovAnatoly MoskovskyА можно минимальный пример когда компилятор понимает что автоматически надо вызвать delete?Нет, нельзя, т.к. я был грубо неправ насчёт автоматического вызова delete в деструкторах. Наоборот - delete автоматически вызовет деструкторы для объектов, которые разместил new. Но, я продолжаю настаивать, что использование malloc/free в языке, где для управления памятью предназначены new/delete - неправильно. Даже в тех случаях, когда использование malloc/free (иных системно-ориентированных аналогов) - необходимо, стОит подумать или о буферированном new или о переопределении стандартных new/delete. Послушайте, я вообще по этому поводу ничего не говорю. Да и что значит ваше 'неправильно'? Незаконно? Думаю вы имеете ввиду другое. Под 'неправильно' вы понимаете 'было бы лучше/следует/хороший тон'. Я в этом далеко не уверен, но про это речь выше и не шла. Выше было утверждение, согласно которому, malloc и С++ никаким образом не связаны, что в программах на языке С++ malloc использовать не то чтобы нежелательно или это есть плохой тон, а вообще нельзя. Вот и всё. Вообще пустой спор, что мы тут развели ни о чем - это настолько очевидные вещи. Как будто я вас пытаюсь убедить что malloc хорошо, а new плохо. Или что при вызове malloc тоже вызывается конструктор. Таких глупостей я вам не говорю. Да и вообще, я что, написал что мой код в самом первом посте является примером хорошего кода на С++? По-моему я написал что так я делаю, и как лучше сделать это грамотно с использованием всех возможных средств С++. Более того, я задал уточняющий вопрос: SSq2 Когда вы пишите программы на С++, используете ли вы функции выделения памяти malloc,calloc и др. ? Но дело не в этом даже, просто мне принципиально не нравится когда говорят вещи очевидно не соответствующие действительности. Тут не девочки из детского сада сидят чтобы слушать очевидные глупости, и общение ради пустого спора никому не интересно. Что дальше, будем доказывать, что С++ является надмножеством Си? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2016, 06:28 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
Неопрятный код допустим в "стартовых скриптах". Просто потому, что такой скрипт работает в известном окружении и на многие "принятые здесь умолчания" можно спокойно заложиться. Даже если окружение (внезапно) изменилось, то в самом пиковом раскладе такой скрипт можно "перебить лапками" за пару-тройку минут через "цопи цон филе". С программами такой подход не работает просто потому, что компилируемую программу нельзя просто так взять и "поредактировать по месту". Мне, например, больше года пришлось воевать с разработчиками из-за того, что, грубо говоря, кому-то было лень написать два блока try/catch вместо одного - часть реальной системы гарантированно ложилась на пару-тройку дней при каждом обновлении. И это - java, где всё должно быть защищено и безопасно, но цена неряшливости - нервы и потерянное время сотен живых людей. P.S. А так, да - подумаешь написал в статической функции не то, что полагается, а то, что привык. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2016, 19:23 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorov, Узбагойся, тут тебе не Ява. Люди понимают отличие new от malloc ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2016, 21:49 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
Эх, стоило пропустить пару дней, а тут такие открытия делаются... SashaMercury... просто мне принципиально не нравится когда говорят вещи очевидно не соответствующие действительности. Тут не девочки из детского сада сидят чтобы слушать очевидные глупости, и общение ради пустого спора никому не интересно. Что дальше, будем доказывать, что С++ является надмножеством Си? Аргументы по силе просто невероятные: и "не нравится", и "очевидно", и даже "девочки" (точнее, "не девочки"). Ну да ладно, придётся побороть свою природную лень и заглянуть в стандарт ( бесплатный драфт, если что ) с его пунктом 20.7.13. C library : calloc, malloc , free, realloc. Для меня этого достаточно, чтобы обнозначно относить malloc к C library, а не B, C++, D, F, etc. Но читать стандарт, наверное, менее интересно, чем надувать щеки по поводу "очевидно", "не нарвится", "девочки"... Хотя - ради бога, если вам так нравится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2016, 15:21 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
BagaBagaЭх, стоило пропустить пару дней, а тут такие открытия делаются... SashaMercury... просто мне принципиально не нравится когда говорят вещи очевидно не соответствующие действительности. Тут не девочки из детского сада сидят чтобы слушать очевидные глупости, и общение ради пустого спора никому не интересно. Что дальше, будем доказывать, что С++ является надмножеством Си? Аргументы по силе просто невероятные: и "не нравится", и "очевидно", и даже "девочки" (точнее, "не девочки"). Ну да ладно, придётся побороть свою природную лень и заглянуть в стандарт ( бесплатный драфт, если что ) с его пунктом 20.7.13. C library : calloc, malloc , free, realloc. Для меня этого достаточно, чтобы обнозначно относить malloc к C library, а не B, C++, D, F, etc. Но читать стандарт, наверное, менее интересно, чем надувать щеки по поводу "очевидно", "не нарвится", "девочки"... Хотя - ради бога, если вам так нравится. И каким образом из этого следует, что данная функция не имеет никакого отношения к С++? Из того что x принадлежит X не следует, что x не может принадлежать Y. Возможно для вас это не так, потому что вы считаете: BagaBagaAnatoly Moskovsky, тогда у вас весь С входит в С++ как его подмножество... В этом мы немного расходимся. Возможно лучшей аргументацией для вас будет BS и его книга The C++ Programming Language: BSC++ was developed from the C programming language and, with few exceptions, retains C as a subset. The base language, the C subset of C++, is designed so that there is a very close correspondence between its types, operators, and statements and the objects that computers deal with directly: numbers, characters, and addresses. BSClearly, C++ owes much to C [Kernighan,1978]. C is retained as a subset. 0. Вы делаете вывод о том, что функция malloc принадлежит языку С. 1. BS явно говорит о том, что большая часть языка Си (и в том числе функция malloc) являются частью языка С++, также о том, что Си является подмножеством С++ явно и неявно неоднократно говорится в стандарте языка С++. 2. Из п. 0 и п. 1 следует, что функция malloc также является частью С++ Не могли бы вы аргументировано, не ссылаясь на ваши личные суждения опровергнуть эти три пункта, в том случае, если вы с ними не согласны. Вы скажете свою точку зрения, я в ответ ни скажу ни слова по этому вопросу и мы прекратим дискуссию. Просто я хочу понять вас, почему вы рассуждаете так, как вы рассуждаете ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2016, 02:49 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
SashaMercury0. Вы делаете вывод о том, что функция malloc принадлежит языку С. Надеюсь, вы не собираетесь это отрицать? SashaMercury1. BS явно говорит о том, что большая часть языка Си (и в том числе функция malloc) являются частью языка С++, также о том, что Си является подмножеством С++ явно и неявно неоднократно говорится в стандарте языка С++. Я и не утверждаю, что С и С++ не пересекаются вовсе. Но я бы и не стал приписывать старине Бьярне утверждение, что malloc является частью С++. На CppCon он призывает не пользоваться "raw new", а не то что malloc... При этом ссылки на конкретный пункт стандарта, где бы malloc представлялась как часть С++, я от вас так и не дождался. Но есть простые факты: 1. средства управления динамическим выделением памяти описываются пунктом 18.6 Dynamic memory management стандарта. Там есть new и delete в различных вариантах. Там нет malloc и free. 2. malloc и free явным образом (а не "в комментариях по ходу изложения") присутствуют в пункте 20.7.13. C library Наконец, если считать, что malloc есть "натуральная" часть языка С++ для динамического выделения памяти, то каким образом при помощи malloc (и без использования new или inplace new) выделить память в куче для столь же "натурального" объекта С++, как vector, для определенность пусть будет vector <string>? Если покажете "в коде" - мне придётся с вами согласиться. В противном случае получается нонсенс: стандартный механизм С++ для выделения динамической памяти не может быть использован для динамического выделения памяти для любого стандартного объекта С++ (или строже - для любого не-POD-объекта)... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2016, 20:05 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
BagaBaga, все эти потуги вокруг malloc станут ненужными, если приложению требуется работать с несколькими пулами памяти, причём без разницы - C или C++ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2016, 21:05 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
malloc это механизм нижнего уровня по отношению к С++. То что им тоже можно пользоваться, ничего не меняет. Непонятно, что вообще вы хотите доказать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2016, 23:02 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. У меня возник ещё один вопрос по двумерным массивам. В стандарте Си сказано следующее: ISO/IEC 9899:201xIf an object that has automatic storage duration is not initialized explicitly, its value is indeterminate. If an object that has static or thread storage duration is not initialized explicitly, then: — if it has pointer type, it is initialized to a null pointer; — if it has arithmetic type, it is initialized to (positive or unsigned) zero; — if it is an aggregate, every member is initialized (recursively) according to these rules, and any padding is initialized to zero bits; — if it is a union, the first named member is initialized (recursively) according to these rules, and any padding is initialized to zero bits; Насколько мне понятно, в том случае если мы выделяем память на массив на стеке Код: plaintext 1. 2. то каждый элемент будет проинициализирован 0 значениями. (В С++ это не работает, я проверил) Аналогичных рассуждений в стандарте С++ я не нашел. Однако нашёл следующее: N4594 8.5.1.12When initializing a multi-dimensional array, the initializer-clauses initialize the elements with the last (rightmost) index of the array varying the fastest (8.3.4). [ Example: Код: plaintext 1. initializes x[0][0] to 3, x[0][1] to 1, x[1][0] to 4, and x[1][1] to 2. On the other hand, Код: plaintext 1. 2. 3. initializes the first column of y (regarded as a two-dimensional array) and leaves the rest zero. —end example ] Исходя из этого, предположил, что такой код: Код: plaintext 1. 2. установит каждый бит данного массива к 0. Однако не нашёл где об этом явно сказано в стандарте языка, и вообще, насколько законны такие действия. Подскажите пожалуйста, насколько это законно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2016, 03:13 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
SashaMercuryВ стандарте Си сказано следующее: ISO/IEC 9899:201xIf an object that has automatic storage duration is not initialized explicitly, its value is indeterminate. If an object that has static or thread storage duration is not initialized explicitly, then: — if it has pointer type, it is initialized to a null pointer; — if it has arithmetic type, it is initialized to (positive or unsigned) zero; — if it is an aggregate, every member is initialized (recursively) according to these rules, and any padding is initialized to zero bits; — if it is a union, the first named member is initialized (recursively) according to these rules, and any padding is initialized to zero bits; Насколько мне понятно, в том случае если мы выделяем память на массив на стеке Код: plaintext 1. 2. то каждый элемент будет проинициализирован 0 значениями. (В С++ это не работает, я проверил) Нет. Вы неверно прочли. Инициализация нулями происходит только для объектов у которых "static or thread storage duration". А стековые (automatic) не инициализируются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2016, 03:23 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
В С++ - то же самое ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2016, 03:23 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyВ С++ - то же самое Очень жаль что нет такой возможности. И странно, что её нет. Думаю это было бы востребовано. А такой код для С++ Код: plaintext 1. 2. тоже нелегален? (на VS всё работает хорошо, все элементы установлены к 0, однако не уверен, что это законно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2016, 03:37 |
|
||
|
Двумерные массивы и С++
|
|||
|---|---|---|---|
|
#18+
SashaMercuryнелегален А где там говорится про нелегальность? Просто переменная содержит неопределенное значение. А сам код вполне легален. SashaMercury(на VS всё работает хорошо, все элементы установлены к 0, однако не уверен, что это законно Наличие инициализатора {} как бы подразумевает явную инициализацию (для чисел - нулями). Так что непонятно что смущает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2016, 03:51 |
|
||
|
|

start [/forum/topic.php?all=1&fid=57&tid=2018442]: |
0ms |
get settings: |
12ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
65ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
139ms |
get tp. blocked users: |
1ms |
| others: | 14ms |
| total: | 263ms |

| 0 / 0 |
