C/C++

Где хранить большой массив данных?

Мне нужно написать программу, обрабатывающую большой массив данных: 2 двумерных массива на 1000 строк и 10 столбцов. На с++. Но, храня эти данные в быстрой памяти, запуская программу, мне выдает ошибку что функция использует 20500 байт в стеке: значение превышает 16384 и программа вылетает. Это понятно. А где тогда хранить эти массивы? В текстовом документе неудобно. Для работы с Экселем нет бесплатных библиотек. Уже 2 день ищу способ решения проблемы. Как вообще в таких случаях поступают?)) Подскажите новичку, пожалуйста))))
Юра Бехлер
Юра Бехлер
1 441
Да уж...

В общем так, большие куски данных нужно выделять из кучи, для этого в С есть malloc и free а в C++ -new и delete.

Если хочется именно двумерный массив, то можно завести переменную типа указатель на указатель для строк и проинициализировать ее указателями на выделенные строки.

Есть другой путь: выделяем просто кусок памяти, равный длина*ширина а потом для доступа к ячейке с координатами x,y вычисляем смещение по формуле
offset = размер_ряда * y + x

Можно совместить эти два подхода, чтобы меньше фрагментировать кучу.
Алексей Семиколенов
Алексей Семиколенов
9 624
Лучший ответ
Алексей Семиколенов Решил проиллюстрировать написанное выше программой для операций с динамическим 2D массивом элементов типа long. Вот что получилось: https://pastebin.com/ZA2xzagj
Он тебе просто намекает, что твои массивы не помещаются в стеке (по-видимому, ты пытаешься передать статические массивы в некую функцию по значению).
Размер стека можно увеличить при компиляции, но в данном случае это тупой подход - гонять массивы через стек. Передавай массивы по ссылке либо используй динамические массивы.
храни в файле. все данные по работе с файлом буферизируются.. если твои данные будут фиксированные, то рассчитать смещение к нужной записи будет не сложно, либо посмотри в сторону sqlite3
Используй ОЗУ, создавай динамический массив
>большой массив данных: 2 двумерных массива на 1000 строк и 10 столбцов.
Это не большой

>быстрой памяти
что вы подразумеваете под "быстрой памятью" с учетом всего сказанного?

>функция использует 20500 байт в стеке: значение превышает 16384 и программа вылетает
размер пользовательского стека в современных компиляторах около мегабайта по дефолту. Вы там на досовском программируете что-ли или ухитрились стек ядра на вызовах переполнить?

>А где тогда хранить эти массивы?
в куче. Открываете учебник и читаете, как инициализировать и использовать двумерные массивы.

Похожие вопросы