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

большие массивы

10.02.2010, 22:12. Показов 12229. Ответов 22
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Кто-нибудь сталкивался с большими V данных?

Программа ничего сложного из себя не представляет - посчитать по формуле в каждой точке. Надо прочитать из txt файла.

Проблема в том что массив требуется [160000][3]. Борланд с++ пишет стэйк оверфлоу.

Кто-нибудь может помочь?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.02.2010, 22:12
Ответы с готовыми решениями:

Большие динамические массивы
При работе с динамическими массивами сталкнулся вот с такой ошибкой (нехватка оперативной памяти):...

Как создать и отсортировать большие массивы
Нужно отсортировать несколько массивов по возрастанию, но проблема в том, что нужно брать массивы с...

Массивы. Все числа, большие 5 заменить противоположными
Все числа, большие 5 заменить противоположными Не понимаю, как написать эту программу. :(...

Как хранить большие массивы строковых данных?
Есть пары строк TPairString = array of string. Есть большой-пребольшой массив TPairsString = array...

22
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
10.02.2010, 22:13 2
Выдели память динамически
0
Day
1179 / 989 / 83
Регистрация: 29.10.2009
Сообщений: 1,385
11.02.2010, 12:41 3
А нужно обязательно держать весь масив в памяти?
Может быть можно считать точку за точкой ?

Динамически память выделяется так:
double *a = malloc(160000*sizeof(double));
или
double *a = new double[160000]

Только боюсь, что такой огромный и динамически не выделится
1
230 / 227 / 65
Регистрация: 18.12.2009
Сообщений: 316
11.02.2010, 13:25 4
Если глобально объявлять, или динамически, усе будет впорядке.

double * a= new double [16000*3];

delete [] a;
0
0 / 0 / 0
Регистрация: 12.11.2009
Сообщений: 11
13.02.2010, 15:08  [ТС] 5
Спасибо! Попробую с динамической памятью.

Кто-нибудь знает проблема может быть вызвана самим компилятором? Я пользуюсь borland c++.
0
0 / 0 / 0
Регистрация: 12.11.2009
Сообщений: 11
17.02.2010, 12:28  [ТС] 6
у меня глупый вопрос - можно выделить память динамически под двумерный массив?

double *A = new double[200000][3];

так не получается.
0
Эксперт С++
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
17.02.2010, 12:36 7
Двумерный массив - это матрица. Задай вопрос гуглу: "matrix source code c++".
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
17.02.2010, 13:35 8
Цитата Сообщение от tretstoun Посмотреть сообщение
у меня глупый вопрос - можно выделить память динамически под двумерный массив?
double *A = new double[200000][3];
так не получается.
нужно так:
C++
1
2
3
   double **A = new double*[200000];
    for(int i=0; i<200000; i++)
        A[i]=new double[3];
1
0 / 0 / 0
Регистрация: 12.11.2009
Сообщений: 11
17.02.2010, 14:34  [ТС] 9
valeriikozlov, спасибо, память выделилась, но её всё равно не достаточно.


кто-нибудь знает что ещё можно попробовать? буду очень благодарен!
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
17.02.2010, 14:39 10
tretstoun, А что у Вас за задача? Может быть она и не требует выделения большой памяти. Не откроете секрет.
0
0 / 0 / 0
Регистрация: 12.11.2009
Сообщений: 11
17.02.2010, 15:34  [ТС] 11
valeriikozlov, нет не секрет. это задача по физике,
есть исходный файл - таблица значений грав.поля, которое создаёт на поверхности цилиндр, находящийся на заданной глубине.
необходимо пройти по каждой точке внутри этой поверхности, предположим 10#10 и так же, опускаясь на единицу вниз, дойти до заданной глубины.
в каждой точке расчитать ковариацию значений грав.поля элементарного цилиндра и эту ковариацию вместе с координатами соответствующей точки поместить в выходной файл.

проблема возникает когда поле не 10#10 а 400 # 400 и больше.

буду признателен за помощь!
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
17.02.2010, 15:49 12
tretstoun, А координаты точки какие максимальные и минимальные значения принимают?
0
0 / 0 / 0
Регистрация: 12.11.2009
Сообщений: 11
17.02.2010, 15:52  [ТС] 13
x - 400
y - 400
z - 80

Добавлено через 17 секунд
минимальные - ноль
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
17.02.2010, 16:00 14
Ну в принципе можно значение координат совместить в одном int, если уж совсем не получается с памятью. Т.е. нужно будет массив [160000], а не [160000][3].
Например имеем число 80400400, тогда:
x - 400
y - 400
z - 80
или имеем число 02003052, тогда:
x - 52
y - 3
z - 2
Нужно будет написать две функции: одна переводит из нормальной записи координат в объединенную, а вторая из объединенной в нормальную.
Только тогда вопрос: а на одинарный массив размером 160000, Ваш компилятор ругается или нет?
0
0 / 0 / 0
Регистрация: 12.11.2009
Сообщений: 11
17.02.2010, 16:18  [ТС] 15
нет, не ругается, хотя я в цикле не проверял.

valeriikozlov, я понял Вашу идею но как это реализовать? у меня есть исходный текстовый файл с тремя столбцами, чтобы его прочитать мне все равно не обойтись без двумерного массива. А если в одномерный всё забить, то он будет уже 480000.
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
17.02.2010, 16:42 16
Цитата Сообщение от tretstoun Посмотреть сообщение
то он будет уже 480000.
Нет не будет.
Считываете из файла по три значения в переменные x, y, z. Затем вызываете функцию (которая преобразует из нормальной записи координат в объединенную), например такую:
C++
1
2
3
4
5
6
7
8
9
int func(int x, int y, int z)
{
    int temp=z;
    temp*=1000;
    temp+=y;
    temp*=1000;
    temp+=x;
    return temp;
}
и записываете значение которая вернет функция уже в одномерный массив, размером 160000
1
Day
1179 / 989 / 83
Регистрация: 29.10.2009
Сообщений: 1,385
17.02.2010, 19:13 17
Я бы все-таки для такого массива использовал бинарный файл.
Создаешь файл FILE *f = fopen(Name, "wb");
Заполняшь его нулями.
Потом
fclose(f);
f = fopen(Name, "rb+"); - Можно будет и читать и писать
Пишешь так:
fseek(f, off, 0); - Подвод к нужной точке
fwrite(&d, sizeof(double), 1, f); // d - записываемое число (double),
а можно писать и блоками по 3 числа, например, тут ты - хозяин
(Надеюсь, элементарную работу с файлами ты сечешь)
Нужно достать число из "массива" - fread..., Засунуть его тыда - fwrite...
Все равно, даже если транслятор или программа во время исполнения,
сделает вид, что им такие размеры - нипочем, массив твой будет скорее всего находиться
в виртуальной памяти и в файле подкачки. Т.е. фактически - на диске.
Уж лучше управлять этим процессом самому. Тем более, что при современных скоростях
дисководов и методах кэширования доступа ты разницу и не заметишь.
А главное - не будешь зависеть от конкретного компа и его операционки, решай задачу
хоть в ДОСе, хоть на 286-ой
Удачи!
1
0 / 0 / 0
Регистрация: 12.11.2009
Сообщений: 11
18.02.2010, 23:27  [ТС] 18
Day, я не совсем понял как мне поможет перевод в бинарный файл? когда я буду с него читать всё равно потребуется большой массив, который компиллятор не потянет, или я неправильно понял?
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
18.02.2010, 23:33 19
tretstoun, Day имеет ввиду, что данные нужно хранить в файле. Считывать нужно не все данные сразу в массив, а только те которые нужны на данный момент для вычислений.
1
Day
1179 / 989 / 83
Регистрация: 29.10.2009
Сообщений: 1,385
19.02.2010, 11:36 20
Цитата Сообщение от valeriikozlov Посмотреть сообщение
tretstoun, Day имеет ввиду, что данные нужно хранить в файле. Считывать нужно не все данные сразу в массив, а только те которые нужны на данный момент для вычислений.
Именно так!
Чуть подробнее - нужна тебе строчка -
Код
double x[3];
fseek(f, 3*I*sizeof(double),0); 
fread(x, sizeof(double), 3, f);
Посчитал, что-то изменил в ней -
Код
fseek(f, 3*I*sizeof(double),0); 
fwrite(x, sizeof(double), 3, f);
Чуть посложнее, чем прямое обращение к элементам массива в памяти,
ну да можно функции написать "Взять I-тую строчку", "Записать I-тую строчку",
ну а если охота, можно на С++ класс придумать и операции перегрузить
(хотя тут я тебе не помощник)
0
19.02.2010, 11:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.02.2010, 11:36
Помогаю со студенческими работами здесь

Как лучше импортировать из Excel большие массивы данных?
Надо определиться с выбором способа обработки больших массивов данных, собранных в Excel....

Массивы: вычислить значения заданной функции большие, чем A
Кому не сложно и кому позволяет время напишите код или подскажите с чего начинать . Задача выглядит...

Целесообразно ли передавать большие массивы как параметры в метод?
В классе есть метод и несколько массивов, с которыми метод выполняет операции. Для разных случаев -...

Одномерные массивы. Заменить все члены, большие данного Z, этим числом
Дана последовательность действительных чисел а1, а2,..., а„. Заменить все ее члены, большие данного...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru