Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
1 / 1 / 0
Регистрация: 18.10.2011
Сообщений: 16

Один большой динамический массив вместо нескольких меньшего размера

10.02.2013, 03:19. Показов 2690. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Уважаемые форумчане,

Прошу помочь советом.

Интересует ответы на вопросы: Возможно ли? Если да, то как реализовать?

Предисловие:
Не так давно начал заниматься в вузе моделированием (трассировка частиц в поле). До настоящего момента пользовался статическими массивами и не знал проблем. Однако в процессе написания программы количество задаваемых массивов безбожно увеличилось и мелкомягкий стал ругаться на переполнение стека.
Погуглил - пришел к выводу, что надо переходить на динамические массивы.
Попробовал... заменил все двухмерные статические массивы на двухмерные динамические - теперь постоянно возникает утечка памяти (проверял места где происходит инициализация и освобождение памяти сотню раз - все равно утечка памяти)
В вузе насоветовали избавиться от двухмерных динамических массивов, а лучше вообще от нескольких массивов - вместо этого использовать один большой одномерный динамический массив - типа так можно избавиться от проблем с утечкой.

Суть:
Создать один большой динамический массив - дело секундное. Но возникает вопрос - как потом к нему обращаться так чтобы не запутаться ?
Да конечно можно использовать простую формулу типа А[i*N+j] для одномерного массива вместо A[i][j] для двухмерного. Но как быть если массивов штук 20?

Есть ли какой нибудь способ инициализации некой структуры, которая будут являться указателем на некоторую часть большого динамического массива?
т.е. что-то вроде такого:

Некая структура = А[i*N+j] для значений i и j от 0 до некоторого значения (например от 100 до 100)
Некая структура №2 = А[i*N+j + 10000] - указатели на другую часть большого массива
и т.д.

Возможно ли?

Заранее огромное спасибо!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.02.2013, 03:19
Ответы с готовыми решениями:

Запихивание нескольких классов-наследников в один динамический массив
Снова здравствуйте. У меня есть абстрактный класс Shape, а так же классы Circle и Rectangle, которые его наследуют. Необходимо сделать...

Вместо фото один большой файл с непонятным разрешением
На карте памяти от фотика были фотографии, потом они куда-то пропали, но место осталось занято и появился файл с названием USBC╣Ш,...

Большой динамический массив
Столкнулся с проблемой, имеется большой массив создаваемый динамически (~1000000 ячеек) и примерно на 350000 на одной и тойже ячейке...

11
 Аватар для abit
870 / 529 / 149
Регистрация: 03.02.2013
Сообщений: 1,859
10.02.2013, 03:25
я дважды сбился с мысли, пока читал вашу трогательную историю...
ответ да, возможно

только мне не понятно чем вас не устраивают контейнеры? чего вы возитесь с массивами
0
1 / 1 / 0
Регистрация: 18.10.2011
Сообщений: 16
10.02.2013, 03:37  [ТС]
С краткими описаниями у меня тяжко... :-)

Но ведь указали могут указывать только на один элемент. Т.е. для некого массива в N элементов придется создавать N указателей. Или я ошибаюсь?

Насколько я могу судить исходя из тех немногочисленных знаний, которые у меня есть - под вектор (контейнер) также выделяется динамически память и главное преимуществе перед динамическими массивами - можно изменять количество элементов во время выполнения в зависимости от нужд.
Но у меня нет такой необходимости. Грубо говоря у меня есть двухмерная сетка заданного размера и нужны соответствующие структуры, которые будут содержать определенную информацию (плотности, токи, поля и т.д.) в каждом из узлов сетки до следующей итерации (следующего полета частиц).
0
 Аватар для abit
870 / 529 / 149
Регистрация: 03.02.2013
Сообщений: 1,859
10.02.2013, 03:39
по поводу вашей "некой структуры"
воспользуйтесь свойствами неконстантых указателей

C++
1
2
3
4
5
6
7
8
int*a;
    int *p;
    a = new int (10);
    a[5]=4;
    p = (a+5);
    cout << p[0];
    cout<<endl;
    delete[] a;
здесь p[0] вернёт a[5], понятно, что p[1] вернёт a[6] и т.д.

если говорить о векторе (хотя это не единственный контейнер), то у него куда больше прекрасных свойств, чем вы указали, к тому же не стоит думать о delete, так что описанных вами проблем не будет
2
1 / 1 / 0
Регистрация: 18.10.2011
Сообщений: 16
10.02.2013, 04:23  [ТС]
Набросал простенькую прожку, чтобы убедиться на живом примере - все прекрасно работает.
Спасибо Вам большое!

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

Добавлено через 16 минут
Попутно возник еще один вопрос.

Как снять ограничение в 2Gb для массива? Какая верхняя грань? Размер RAM?

Видимо вывод о том, что надо использовать динамический массив вместо статического - было ошибочным в том плане, что максимальный размер не увеличиться.
На данный момент могу задать массив, который будет содержать порядка нескольких десятков миллионов элементов. А как быть если этого мало?
Потому как если нужно держать в памяти порядка 30 параметров для каждого узла на двухмерной сетки, то получается, что максимально допустимый размер сетки будет порядка 800х800 - а это довольно скудно (в глобальном плане для моей задачи).

Заранее спасибо!
0
 Аватар для abit
870 / 529 / 149
Регистрация: 03.02.2013
Сообщений: 1,859
10.02.2013, 04:28
C++
1
Как снять ограничение в 2Gb для массива? Какая верхняя грань? Размер RAM?
ну там кроме рам есть другие факторы...
а как с этим работать... всё зависит от среды 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
 Аватар для abit
870 / 529 / 149
Регистрация: 03.02.2013
Сообщений: 1,859
10.02.2013, 04:57
Цитата Сообщение от ken_guru Посмотреть сообщение
cout << sizeof(size_t); возвращает значение 4

Среда - MVS 2008 PE (на Win7 x64, размер RAM 8Gb)

Объемы памяти - Скорее всего порядка десятка Gb
использую не double, а long double - часто приходиться работать со значениями близкими к нулю и там важна большая точность - иначе решение задачи может начать расходиться.
так... ну в случае 64-битных систем вполне реально адресовать несколько 10-ков гигов, я конечно этим никогда не занимался)
собстна главное ограничение похоже у вас в size_t, т.е. при

a = new int (huge_mass);

это huge_mass у вас должно быть типа size_t (кстати если не так - исравьте) типа

C++
1
2
const size_t huge_mass = большое число;
a = new int (huge_mass);
однако, очевидно вам нужно ещё и иметь 64-битный компилятор C++ (MVS 2008 PE 64-битная?), чтобы работать с такой адресацией (у них свой предел для 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
 Аватар для abit
870 / 529 / 149
Регистрация: 03.02.2013
Сообщений: 1,859
10.02.2013, 05:28
Цитата Сообщение от ken_guru Посмотреть сообщение
Простите - глупость говорю. Точнее написал не то, что хотел сказать - у меня не значения бывают близкими к нулю (точнее это тоже бывает - но не это главное), а изменения тех или иных значений. Например, энергии - а они должна сохраняться с хорошей точностью. К тому же в реальности фигурирует не энергия, а квадрат скорости...
Но возможно я чего-то не понял и мне достаточно использовать double. Но если я не ошибаюсь, то double - 8 байт, а long double - 10 байт -т.е. переход к double погоды не сделает.... или это неверно?
long double - 10 байт? вообще-то 16 в теории... это на 32-битных платформах 10, точнее в целях ускорения доступа (там адресация 32-битная предполагает кратность 4 байтам для большей скорости в памяти выделяется 12 байт)
поглядите на результат
cout<<sizeof(long double);
в вашей системе

если ответ 12, то вам нужен 64-битный компилятор, с этим у вас не получится адресовать больше 4Гигов
если ответ 16, то у вас всё ок...
кстати а позволяет он создать два массива по 0x7fffffff ? я так понимаю нет...

а квадрат скорости...
храните сами скорости, или изменения энергии... а перед подачей умножайте на нужные константы, возводите в квадрат и т.д. и у вас при double будет 15 значащих цифр в числе, что вполне сравнимо с квантом энергии при работе в Джоулях)))

четверная точность придумана малясь для другого насколько мне известно и причина больше в аппаратуре, чем в повседневной необходимости
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.02.2013, 16:53
Помогаю со студенческими работами здесь

Большой динамический массив. EOF.
Задаём элементы массива пока не будет введён EOF. (Ctrl+Z или Ctrl+C). Память ограничена. Нужно создать массив динамически и если памяти...

Цикл выполняется один раз вместо нескольких
Есть папка с 354 файлами Нужно,чтобы стало 299 void Data::renewFiles() { QDir dir; dir.cd(QDir::currentPath() +...

Один запрос для вывода вместо нескольких
Здравствуйте. Пример таблицы в phpmyadmin id | title | group_id 1 | Кот | 0 2 |Рысь| 1 3 | Пес | 0 4 | Хомяк|0 5 | Лев | 1 ...

Цикл выполняется один раз вместо нескольких
Есть папка из 354 файлов,нужно,чтобы осталось 299 void Data::renewFiles() { QDir dir; dir.cd(QDir::currentPath() +...

Как из нескольких массивов разного размера сделать один
Здравствуйте! Запутался с алгоритмом. Суть такая: есть массив a со списком адресатов и массив b со статусом адресатов (те кто...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru