|
1 / 1 / 0
Регистрация: 18.10.2011
Сообщений: 16
|
|
Один большой динамический массив вместо нескольких меньшего размера10.02.2013, 03:19. Показов 2649. Ответов 11
Метки нет (Все метки)
Уважаемые форумчане,
Прошу помочь советом. Интересует ответы на вопросы: Возможно ли? Если да, то как реализовать? Предисловие: Не так давно начал заниматься в вузе моделированием (трассировка частиц в поле). До настоящего момента пользовался статическими массивами и не знал проблем. Однако в процессе написания программы количество задаваемых массивов безбожно увеличилось и мелкомягкий стал ругаться на переполнение стека. Погуглил - пришел к выводу, что надо переходить на динамические массивы. Попробовал... заменил все двухмерные статические массивы на двухмерные динамические - теперь постоянно возникает утечка памяти (проверял места где происходит инициализация и освобождение памяти сотню раз - все равно утечка памяти) В вузе насоветовали избавиться от двухмерных динамических массивов, а лучше вообще от нескольких массивов - вместо этого использовать один большой одномерный динамический массив - типа так можно избавиться от проблем с утечкой. Суть: Создать один большой динамический массив - дело секундное. Но возникает вопрос - как потом к нему обращаться так чтобы не запутаться ? Да конечно можно использовать простую формулу типа А[i*N+j] для одномерного массива вместо A[i][j] для двухмерного. Но как быть если массивов штук 20? Есть ли какой нибудь способ инициализации некой структуры, которая будут являться указателем на некоторую часть большого динамического массива? т.е. что-то вроде такого: Некая структура = А[i*N+j] для значений i и j от 0 до некоторого значения (например от 100 до 100) Некая структура №2 = А[i*N+j + 10000] - указатели на другую часть большого массива и т.д. Возможно ли? Заранее огромное спасибо!
0
|
|
| 10.02.2013, 03:19 | |
|
Ответы с готовыми решениями:
11
Запихивание нескольких классов-наследников в один динамический массив Вместо фото один большой файл с непонятным разрешением Большой динамический массив |
|
868 / 527 / 148
Регистрация: 03.02.2013
Сообщений: 1,845
|
|
| 10.02.2013, 03:25 | |
|
я дважды сбился с мысли, пока читал вашу трогательную историю...
ответ да, возможно только мне не понятно чем вас не устраивают контейнеры? чего вы возитесь с массивами
0
|
|
|
1 / 1 / 0
Регистрация: 18.10.2011
Сообщений: 16
|
|
| 10.02.2013, 03:37 [ТС] | |
|
С краткими описаниями у меня тяжко... :-)
Но ведь указали могут указывать только на один элемент. Т.е. для некого массива в N элементов придется создавать N указателей. Или я ошибаюсь? Насколько я могу судить исходя из тех немногочисленных знаний, которые у меня есть - под вектор (контейнер) также выделяется динамически память и главное преимуществе перед динамическими массивами - можно изменять количество элементов во время выполнения в зависимости от нужд. Но у меня нет такой необходимости. Грубо говоря у меня есть двухмерная сетка заданного размера и нужны соответствующие структуры, которые будут содержать определенную информацию (плотности, токи, поля и т.д.) в каждом из узлов сетки до следующей итерации (следующего полета частиц).
0
|
|
|
868 / 527 / 148
Регистрация: 03.02.2013
Сообщений: 1,845
|
||||||
| 10.02.2013, 03:39 | ||||||
|
по поводу вашей "некой структуры"
воспользуйтесь свойствами неконстантых указателей
если говорить о векторе (хотя это не единственный контейнер), то у него куда больше прекрасных свойств, чем вы указали, к тому же не стоит думать о delete, так что описанных вами проблем не будет
2
|
||||||
|
1 / 1 / 0
Регистрация: 18.10.2011
Сообщений: 16
|
|
| 10.02.2013, 04:23 [ТС] | |
|
Набросал простенькую прожку, чтобы убедиться на живом примере - все прекрасно работает.
Спасибо Вам большое! Спасибо за совет - пока попробую реализовать работу через один большой динамический массив - если опять наткнусь на проблемы, которые не смогу решить, то буду изучать контейнеры - честно говоря мало про них знаю. Добавлено через 16 минут Попутно возник еще один вопрос. Как снять ограничение в 2Gb для массива? Какая верхняя грань? Размер RAM? Видимо вывод о том, что надо использовать динамический массив вместо статического - было ошибочным в том плане, что максимальный размер не увеличиться. На данный момент могу задать массив, который будет содержать порядка нескольких десятков миллионов элементов. А как быть если этого мало? Потому как если нужно держать в памяти порядка 30 параметров для каждого узла на двухмерной сетки, то получается, что максимально допустимый размер сетки будет порядка 800х800 - а это довольно скудно (в глобальном плане для моей задачи). Заранее спасибо!
0
|
|
|
868 / 527 / 148
Регистрация: 03.02.2013
Сообщений: 1,845
|
||||||
| 10.02.2013, 04:28 | ||||||
а как с этим работать... всё зависит от среды C++ сперва скажите что у вас возращает cout << sizeof(size_t); и поведайте о каких объёмах памяти мы говорим? если не знаете - скажите тип элементов массива (double я так понимаю?) и их количество
0
|
||||||
|
1 / 1 / 0
Регистрация: 18.10.2011
Сообщений: 16
|
|
| 10.02.2013, 04:35 [ТС] | |
|
cout << sizeof(size_t); возвращает значение 4
Среда - MVS 2008 PE (на Win7 x64, размер RAM 8Gb) Объемы памяти - Скорее всего порядка десятка Gb использую не double, а long double - часто приходиться работать со значениями близкими к нулю и там важна большая точность - иначе решение задачи может начать расходиться. А количество массивов - пока мне нужно 15 штук массивов, каждый их которых будет содержать данные с узлов сетки, сетка на данный момент 1000х100, но этого мало - нужен на порядок больше, где то 10000х1000
0
|
|
|
868 / 527 / 148
Регистрация: 03.02.2013
Сообщений: 1,845
|
|||||||
| 10.02.2013, 04:57 | |||||||
|
собстна главное ограничение похоже у вас в size_t, т.е. при a = new int (huge_mass); это huge_mass у вас должно быть типа size_t (кстати если не так - исравьте) типа
второй вариант развития событий - это поглядеть на std::allocator, в одной из книжек я встречал как через него выделяли 16Гигов под что-то но если не поможет, то я хз, никогда с такими объёмами не сталкивался в реальных задачах... вернее было один раз - но там тупо лог вёлся и надо было в минуту 2.5 гига снимать, но в файл... дождитесь завтрашнего дня - на форум придут бывалые мастера 64-Гигабитной адресации и помогут ) далее - не уловил связи со значениями близкими к нулю... или я чего-то не знаю ))) вы когда нибудь задумывались что означает слово "с плавающей запятой ", которое усердно приписывают во всех книжках к float/double? в случае с double, что вы можете работать со значениями 10^(-308), т.е. 0.0..(тут 305 нулей)..01 куда вам ещё ближе к нулю? )
1
|
|||||||
|
1 / 1 / 0
Регистрация: 18.10.2011
Сообщений: 16
|
|
| 10.02.2013, 05:16 [ТС] | |
|
не совсем понял как использование числа типа size_t позволит задавать массив большего размера - пробовал так делать - все равно вылезает ошибка (общий размер массива не должен превышать 0x7fffffff байт)
Буду ждать завтра :-) Но все равно спасибо за предполагаемые варианты! В крайнем случае есть вариант - использовать один массив, значения которого будут сбрасываться в файлы и черпаться от туда когда потребуется. Только боюсь тогда скорость работы будет очень медленная. Простите - глупость говорю. Точнее написал не то, что хотел сказать - у меня не значения бывают близкими к нулю (точнее это тоже бывает - но не это главное), а изменения тех или иных значений. Например, энергии - а они должна сохраняться с хорошей точностью. К тому же в реальности фигурирует не энергия, а квадрат скорости... Но возможно я чего-то не понял и мне достаточно использовать double. Но если я не ошибаюсь, то double - 8 байт, а long double - 10 байт -т.е. переход к double погоды не сделает.... или это неверно?
0
|
|
|
868 / 527 / 148
Регистрация: 03.02.2013
Сообщений: 1,845
|
|||
| 10.02.2013, 05:28 | |||
|
поглядите на результат cout<<sizeof(long double); в вашей системе если ответ 12, то вам нужен 64-битный компилятор, с этим у вас не получится адресовать больше 4Гигов если ответ 16, то у вас всё ок... кстати а позволяет он создать два массива по 0x7fffffff ? я так понимаю нет...
четверная точность придумана малясь для другого насколько мне известно и причина больше в аппаратуре, чем в повседневной необходимости
0
|
|||
|
1 / 1 / 0
Регистрация: 18.10.2011
Сообщений: 16
|
|
| 10.02.2013, 05:41 [ТС] | |
|
У меня 32-битный компилятор. Когда начинал изучать C++ и пытаться писать прогу, то в одной из книжек прочитал, что 64-битный компилятор имеет ряд подводных камней и не рекомендуется для использования новичками.
Однако судя по той проблеме, которая возникла - надо будет переходить на x64 Странно, но у меня sizeof(long double) возвращает значение 8 sizeof(double) - тоже возвращает значение 8... Насчет энергии понял - спасибо, возьму на заметку и буду пытаться так реализовывать.
0
|
|
|
5 / 0 / 0
Регистрация: 10.02.2013
Сообщений: 7
|
|
| 10.02.2013, 16:53 | |
|
В MVS типы double и long double совпадают и имеют размер 8 байт.
Если нужно именно 10 байт, то придется использовать другой компилятор, например, gcc. Про x64, к сожалению, ничего сказать не могу, но с удовольствием послушаю. ![]() Разве FPU расширили с 80 бит до 128? Вроде нет, тогда я не очень понимаю, как long double может быть 16 байт.
0
|
|
| 10.02.2013, 16:53 | |
|
Помогаю со студенческими работами здесь
12
Большой динамический массив. EOF.
Один запрос для вывода вместо нескольких
Как из нескольких массивов разного размера сделать один Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод
Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод.
Thinkpad X220 Tablet —. . .
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|