0 / 0 / 0
Регистрация: 12.11.2009
Сообщений: 11
|
|
1 | |
большие массивы10.02.2010, 22:12. Показов 12234. Ответов 22
Метки нет (Все метки)
Кто-нибудь сталкивался с большими V данных?
Программа ничего сложного из себя не представляет - посчитать по формуле в каждой точке. Надо прочитать из txt файла. Проблема в том что массив требуется [160000][3]. Борланд с++ пишет стэйк оверфлоу. Кто-нибудь может помочь?
0
|
10.02.2010, 22:12 | |
Ответы с готовыми решениями:
22
Большие динамические массивы Как создать и отсортировать большие массивы Массивы. Все числа, большие 5 заменить противоположными Как хранить большие массивы строковых данных? |
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
|
|
10.02.2010, 22:13 | 2 |
Выдели память динамически
0
|
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
|
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
|
||||||
17.02.2010, 13:35 | 8 | |||||
нужно так:
1
|
0 / 0 / 0
Регистрация: 12.11.2009
Сообщений: 11
|
|
17.02.2010, 14:34 [ТС] | 9 |
valeriikozlov, спасибо, память выделилась, но её всё равно не достаточно.
кто-нибудь знает что ещё можно попробовать? буду очень благодарен!
0
|
4728 / 2549 / 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
|
4728 / 2549 / 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
|
4728 / 2549 / 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
|
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
|
||||||
17.02.2010, 16:42 | 16 | |||||
Нет не будет.
Считываете из файла по три значения в переменные x, y, z. Затем вызываете функцию (которая преобразует из нормальной записи координат в объединенную), например такую:
1
|
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
|
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
|
|
18.02.2010, 23:33 | 19 |
tretstoun, Day имеет ввиду, что данные нужно хранить в файле. Считывать нужно не все данные сразу в массив, а только те которые нужны на данный момент для вычислений.
1
|
1179 / 989 / 83
Регистрация: 29.10.2009
Сообщений: 1,385
|
|
19.02.2010, 11:36 | 20 |
Именно так!
Чуть подробнее - нужна тебе строчка - Код
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 | |
19.02.2010, 11:36 | |
Помогаю со студенческими работами здесь
20
Как лучше импортировать из Excel большие массивы данных? Массивы: вычислить значения заданной функции большие, чем A Целесообразно ли передавать большие массивы как параметры в метод? Одномерные массивы. Заменить все члены, большие данного Z, этим числом Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |