Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.02.2013, 03:19
Ответы с готовыми решениями:

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

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

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

11
 Аватар для abit
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
 Аватар для abit
868 / 527 / 148
Регистрация: 03.02.2013
Сообщений: 1,845
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
868 / 527 / 148
Регистрация: 03.02.2013
Сообщений: 1,845
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
868 / 527 / 148
Регистрация: 03.02.2013
Сообщений: 1,845
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
868 / 527 / 148
Регистрация: 03.02.2013
Сообщений: 1,845
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
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
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 - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru