Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 52, средняя оценка - 4.98
nill
10 / 10 / 0
Регистрация: 16.08.2009
Сообщений: 417
#1

Тип данных для очень большого массива - C++

07.02.2010, 14:28. Просмотров 7591. Ответов 24
Метки нет (Все метки)

Есть массив где больше четырех миллионов элементов

C++
1
int massiv[1070190][4]={0};
когда так пишу программа компилируется нормально

но при выполнении выдает ошибку
в коде программы в массив даже ничего не записываю но все равно прога вылетает

пробовал писать так

C++
1
double massiv[1070190][4]={0};
вылетает так же

можно как то использовать такой массив ?

если нет то какой максимальный размер массива можно использовать ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.02.2010, 14:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Тип данных для очень большого массива (C++):

Cохранение очень большого массива в текстовый файл - C++
Помогите пожалуйста. Мне требуется сохранить карту в своей игре в текстовый файл. Класс карты: class cMap { public: ...

Обработка большого массива данных на C++ - C++
Суть проблемы. На работе, дали задание проработать 1 большой файл (вывести графики результата анализа и т.д.). Файл: двоичный. ~ 71 Мб ...

Сортировка очень большого файла. - C++
вопрос таков: есть очень большой файл, его нужно отсортировать. Так как файл большой его нужно извлекать по частям. Как это можно...

что лучще использовать для большого массива тескста - C++
Добрый день. Столкнулся с проблемой со следующей проблемой мне надо выводить таблицу в текстовом формате где 10 столбцов и много...

Класс очень большого числа. Перегрузка operator++ - C++
Число хранится в массиве. Не могу сделать перегрузку ++. Помогите. byte* massiv; massiv = new byte; Big* operator++() {...

Мне очень нужна программа для игры gta samp 0.3c для взлома базы данных - C++
Мне очень нужна программа для игры gta samp 0.3c для взлома базы данных

24
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
08.02.2010, 15:58 #16
такое количество памяти выделяется динамически без проблем:

C++
1
int *pI = (int*)malloc (1070190*sizeof(int)*4);
0
insideone
Модератор
Автор FAQ
3643 / 922 / 51
Регистрация: 10.01.2010
Сообщений: 2,479
08.02.2010, 16:12 #17
Цитата Сообщение от nill Посмотреть сообщение
А как начсет скорости если создавать доп массивы это наверно еще медленее чем с vector ?
К сожалению не работал с vector. Смысл моего предложения - если вы не знаете сколько у вас данных всего и просто заполняете массив от 0 до n (где n то огромное число которое вам нужно) это позволит вам сделать такое с минимальными издержками. Выделение памяти для нового массива не думаю что очень тормозный процесс. При записи\чтении расчитывается сколько массивов надо проскочить, т.е. забрать \ записать данные стоит от их длинны. Например есть 1000 элемент который надо записать а у вас блоки по 600, то 1000 элемент лежит во втором блоке и значит нужно выполнить всего 1 операцию на переключение и 1 операцию вычитания (1000-600 = 400 (блок из которого берем во втором массиве)). Я думаю это мелочь При этом можно организовать массив любой мерности, достаточно написать простую функцию которая преобразует n мерные координаты в линейные как я описывал выше
0
nill
10 / 10 / 0
Регистрация: 16.08.2009
Сообщений: 417
08.02.2010, 17:34  [ТС] #18
novi4ok,
а где здесь имя массива ?

попробовал
C++
1
int *massiv = (int*)malloc (1070190*sizeof(int)*4);
когда хочу обратиться к массиву программа не компилируеться
error C2109: subscript requires array or pointer type

insideone,
понятно а без использования класса это можно сделать ?
программа у меня очень простая и ООП мне там не нужно

Добавлено через 1 час 18 минут
novi4ok,

попробовал записать так
C++
1
2
int *massiv = (int*)malloc (1070190*sizeof(int)*4);
massiv[0]=1;
код работает но мне то нужен двумерный массив

а обращение к двумерному массиву
C++
1
massiv[0][0]=1;
выдает ошибку о которой я написал
error C2109: subscript requires array or pointer type
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
08.02.2010, 17:37 #19
вот так примерно:
C++
1
2
3
4
5
6
7
8
9
10
11
#define NUMBER_ROWS 1070190
#define ROW_LENGTH  4
 
    int *pIntArray = (int*)malloc (NUMBER_ROWS*sizeof(int)*ROW_LENGTH);
 
    int index_of_column = 1;
    int index_of_row = 0;
    
    *(pIntArray+(index_of_row*ROW_LENGTH)+index_of_column) = index_of_column * index_of_row;
 
    int intElement = *(pIntArray+(index_of_row*ROW_LENGTH)+index_of_column);
0
nill
10 / 10 / 0
Регистрация: 16.08.2009
Сообщений: 417
08.02.2010, 17:46  [ТС] #20
novi4ok,
вопрос все тот же
как присвоить значение массиву?
скажем элементу [0][0]

C++
1
pIntArray[0][0]=1;
ошибка
error C2109: subscript requires array or pointer type


как и предыдущий пример все это работает только для одномерного массива
C++
1
pIntArray[0]=1;
работает но мне то нужен двумерный массив
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
08.02.2010, 18:10 #21
Цитата Сообщение от nill Посмотреть сообщение
novi4ok,
вопрос все тот же
как присвоить значение массиву?
скажем элементу [0][0]

C++
1
pIntArray[0][0]=1;
вот так:

*(pIntArray+(0*ROW_LENGTH)+0) = 1;
1
nill
10 / 10 / 0
Регистрация: 16.08.2009
Сообщений: 417
08.02.2010, 18:26  [ТС] #22
теперь все работает и работает быстро огромное спасибо novi4ok
использую самый простой вариант

C++
1
2
int *massiv = (int*)malloc (1070190*sizeof(int)*4);
*(massiv+(0)+0) = 1;
незнаю тут спросить или создать новую тему

а как такой массив передать в функцию ?
1) что писать в прототип функции?
2) что писать при определнии функции ?
3) что писать при вызове функции ?
0
insideone
Модератор
Автор FAQ
3643 / 922 / 51
Регистрация: 10.01.2010
Сообщений: 2,479
08.02.2010, 18:53 #23
Я предпологаю в функцию вам надо передавать простой указатель на начало массива. Зачем что то другое?
0
nill
10 / 10 / 0
Регистрация: 16.08.2009
Сообщений: 417
08.02.2010, 19:35  [ТС] #24
опять проблема вылезла прога вылетает после 5 минут
думаю проблема в оперативной памяти количество ее стремительно уменьшаеться пока прога запущенна, надо как то удалять массив из нее
0
insideone
Модератор
Автор FAQ
3643 / 922 / 51
Регистрация: 10.01.2010
Сообщений: 2,479
08.02.2010, 20:28 #25
Не совсем понял в чем трудность, нижеприведенный пример нормально работает. 17 МБайт памяти не слишком уж и много (хотя я понимаю что все относительно)
C++
1
2
3
4
5
int* Array = new int[1070190*4];
// Тут что то делаем с массивом как надо
 
// Когда массив уже не нужен делаем так
delete [] Array;
ps. Для malloc есть free однако я им не пользовался так что поищите информацию про него. free освободит выделенную malloc память.
0
08.02.2010, 20:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.02.2010, 20:28
Привет! Вот еще темы с ответами:

Пользовательский тип данных для C - C++
Помогите пожалуйста создать пользовательский тип данных для языка C, так как мне не хватает обычных....

Целочисленный тип данных для 10^50 - C++
Существует ли в C++ целочисленный тип данных, который вмещает 10^50?

тип данных для двоичного числа - C++
подскажите пожалуйста у меня есть двоичные числа какой тип данных нужен для них? ну всмысле я эти числа сам беру из файла и когда потом...

Тип данных для размера файла - C++
warning C4244: 'initializing' : conversion from 'std::streamoff' to 'int', possible loss of data . Как это устранить? Код: ...


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

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru