Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 38, средняя оценка - 4.92
tretstoun
0 / 0 / 0
Регистрация: 12.11.2009
Сообщений: 11
#1

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

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

Кто-нибудь сталкивался с большими V данных?

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

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

Кто-нибудь может помочь?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.02.2010, 22:12     большие массивы
Посмотрите здесь:

Большие числа - C++
Здравствуйте. Как в С++ работать с большими числами (600851475143, например)? Честно гуглил, но там ничего толкового не нашел. ...

Большие-маленькие - C++
На входе строка содержащая большие и маленькие буквы, необходимо большие сделать маленькими, а маленькие большими. Например...

Большие числа в C - C++
можно ли в языке С работать с большими целыми? Существует ли некое подобие BigInteger C#?

Большие факториалы - C++
Помогите написать программу,котороя щитает большые фактуриалы(100!,200! и тд)

большие числа - C++
скажите пожалуйсто есть ли какая нибудь библиотека в си++ для работы с большими числами (до 10^18), если нет то может у кого класс...

Слишком большие программы! - C++
Я начинаю писать консольные приложения на Dev C++. Компилирую. Я раньше не смотрел на размер, а сейчас увидел, что он больше 400 Кб!!! и...

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Genius Ignat
1235 / 773 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
10.02.2010, 22:13     большие массивы #2
Выдели память динамически
Day
1154 / 959 / 57
Регистрация: 29.10.2009
Сообщений: 1,385
11.02.2010, 12:41     большие массивы #3
А нужно обязательно держать весь масив в памяти?
Может быть можно считать точку за точкой ?

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

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

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

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

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

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

так не получается.
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,354
17.02.2010, 12:36     большие массивы #7
Двумерный массив - это матрица. Задай вопрос гуглу: "matrix source code c++".
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
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];
tretstoun
0 / 0 / 0
Регистрация: 12.11.2009
Сообщений: 11
17.02.2010, 14:34  [ТС]     большие массивы #9
valeriikozlov, спасибо, память выделилась, но её всё равно не достаточно.


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

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

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

Добавлено через 17 секунд
минимальные - ноль
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
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, Ваш компилятор ругается или нет?
tretstoun
0 / 0 / 0
Регистрация: 12.11.2009
Сообщений: 11
17.02.2010, 16:18  [ТС]     большие массивы #15
нет, не ругается, хотя я в цикле не проверял.

valeriikozlov, я понял Вашу идею но как это реализовать? у меня есть исходный текстовый файл с тремя столбцами, чтобы его прочитать мне все равно не обойтись без двумерного массива. А если в одномерный всё забить, то он будет уже 480000.
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
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
Day
1154 / 959 / 57
Регистрация: 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-ой
Удачи!
tretstoun
0 / 0 / 0
Регистрация: 12.11.2009
Сообщений: 11
18.02.2010, 23:27  [ТС]     большие массивы #18
Day, я не совсем понял как мне поможет перевод в бинарный файл? когда я буду с него читать всё равно потребуется большой массив, который компиллятор не потянет, или я неправильно понял?
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
18.02.2010, 23:33     большие массивы #19
tretstoun, Day имеет ввиду, что данные нужно хранить в файле. Считывать нужно не все данные сразу в массив, а только те которые нужны на данный момент для вычислений.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.02.2010, 11:36     большие массивы
Еще ссылки по теме:

упорядочить по возростанию числа большие 2 - C++
упорядочить по возростанию числа больше 2 , а остальные оставить на своих же местах

Выбираем маленькие и большие буквы - C++
l6hIun# c2/4l3H5# LHhKj87Gt^# Дано какой-то такой набор символов. С первой строки нужно вывести маленькие буквы, с второй большие с...

Strtol и слишком большие числа - C++
Если strtol скормить строчку со слишком большим числом, оно вернет LONG_MAX и установит errno в ERANGE. Вопрос - если strtol скормить...

Выводятся большие отрицательные числа - C++
В функции max двумерный массив переводится сначала в одномерный, при выводе одномерного массива вместо правильных элементов выводятся...

Большие буквы O заменить на маленькие - C++
Объясните где я сделал ошибку? Задание: все введенные большие буквы O заменить на маленькие. - он мне почему то все на оборот делает то...


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

Или воспользуйтесь поиском по форуму:
Day
1154 / 959 / 57
Регистрация: 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-тую строчку",
ну а если охота, можно на С++ класс придумать и операции перегрузить
(хотя тут я тебе не помощник)
Yandex
Объявления
19.02.2010, 11:36     большие массивы
Ответ Создать тему
Опции темы

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