Размерность массива

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

Размерность массива

Сообщение NVP » 01.12.2010 20:07:42

Подскажите, плиз, возможно ли работать с массивом Var A:array[-1000000000..1000000000] of 0..1;
Если да, то как это реализовать?
NVP
незнакомец
 
Сообщения: 1
Зарегистрирован: 01.12.2010 20:00:50

Re: Размерность массива

Сообщение alexrayne » 01.12.2010 21:56:39

я бы предложил Вам всетаки упаковать етот массив, т.к. его элементы занимают 1бит нетолько для экономии памяти но и для ускорения работы вообще всей программы. компилятор несможет за Вас сделать ету работу.
Еще лучше както перепланировать ваш алгоритм чтобы он локально работал только с небольшим блоком массива размером 8 или 32 бита. - ето путь к реальному ускорению рабботы проги на порядки.

для таких вещей я например делал объект со свойством Items[] - ето свойство вызывало статические функции которые занимаются конверсией индекса того массива который Вы хотите в элемент и бит реального массива который все ето реализует.
alexrayne
постоялец
 
Сообщения: 125
Зарегистрирован: 03.12.2008 16:56:26

Re: Размерность массива

Сообщение Kitayets » 13.12.2010 01:10:54

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

смотрите - с памятью возиться не надо, о "дырах" в разреженных матрицах думать не надо, все основные алгоритмы уже реализованы, вывод графики тоже на хорошем уровне + многое другое о чём Вы подумать ещё не успели.

короче имя этим инструментам - matlab, scilab, GNU octave, ROOT и многие другие.
Kitayets
постоялец
 
Сообщения: 171
Зарегистрирован: 05.05.2010 21:15:24

Re: Размерность массива

Сообщение Maxizar » 13.12.2010 13:07:56

NVP - если вам это нужно для отмазки, то послушайте Kitayets. если же вам это нужно по работе или чем то еще и Вы будете с этим работать достаточно долго, то мой Вам совет разобраться и написать все это дело самому. (долго нудно, но это принесет свои плоды) Пример: Я по дипломному проекту считал Диэлектические стекла (слоистые среды) так вот программа разработанная на MathCad или MatLAb считала структуру в 80 слоев порядка 30 минут, на двухядерном 3GHz проце. когда препод сказал ну довай усложним модель и все такое.. и возьмем порядка 200-500 слоев Я плакаль :(( все дело считалось порядка 3-5 часов. Программа написанная на Lazaruse все дело просчитывала за 3-6 минут. Что касается больших массивов сложно но ведь ни кто не отменял обмануть всех и вся Ведь можно сделать масив масивов :) Так же действительно задумайтесь на счет упаковки скажем хотябы в тип Word. Все только зависит от задач и времени.
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: Размерность массива

Сообщение Kitayets » 13.12.2010 17:09:09

2Maxizar

между MathCad и MatLab -разница весьма существенная. на MatLab делают весьма "взрослые" расчёты, как в науке так и в промышленности. и совсем необязательно что низкая производительность конкретной программ является следствием ограничения самой системы matlab.

Вопрос на самом деле, ЧТО нужно топик стартеру - посчитать, или научиться программировать на object free pascal.

Если нужно считать, то лучше взять соответствующие инструменты, потому как на реализацию алгоритмов уйдёт уйма времени (судя по постановке вопросов в первом посте) - и наверняка они будут не оптимальными в лучшем случае и с ошибками в худшем.

Если нужно научиться программированию на objfpc - то начать читать литературу по 1) языку 2) алгоритмам 3) структурам данных и много практики.

что касается вопроса ТС по существу - то выбрать представление и реализовать работу с такого типа массивами можно по разному - всё зависит от того, что потом с этом массивом планируется делать.

можно и в лоб попробовать:

bigArras: array[0..2000000000] of bytebool

но размер такого массива почти 2Гб. на x86_64 можно, думаю, с таким массивом работать как обычно :)
Kitayets
постоялец
 
Сообщения: 171
Зарегистрирован: 05.05.2010 21:15:24

Re: Размерность массива

Сообщение hinst » 13.12.2010 21:57:50

а что никто про TBits не сказал. уже есть же
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Re: Размерность массива

Сообщение alexrayne » 13.12.2010 22:41:04

вообще документация незапрещает применить тут и упакованный массив, только непонятно насколько удачный доступ к элементам его компилятор сделает.

Добавлено спустя 2 минуты 53 секунды:
hinst писал(а):а что никто про TBits не сказал. уже есть же

Пасиба, век жыви век учись
alexrayne
постоялец
 
Сообщения: 125
Зарегистрирован: 03.12.2008 16:56:26

Re: Размерность массива

Сообщение Kitayets » 15.12.2010 13:19:17

что касается TBits - то это позволит уменьшить размер используемой памяти в восемь раз (относительно массива bytebool), но если у вас уже есть подпрограммы для работы с массивами - придётся их переписывать (перегружать) для работы с объектами.

Тогда получается что-то типа вот такого:

Код: Выделить всё
var
     bigBitsArray: TBits;
     ...
begin
...
   bigBitsArray:= new TBits.Create(2000000000);
...
   FreeAndNil(bitBitsArray);
end.


ну и напоследок - количество элементов в TBits ограничено до 524256 штук !
соответственно нужна будет коллекция из 2000000000 / 524256 = 3815 элементов типа TBits чтобы покрыть такой массив. ну и соответствующий код по инициализации и доступа к отдельным битам.
Kitayets
постоялец
 
Сообщения: 171
Зарегистрирован: 05.05.2010 21:15:24


Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13

Рейтинг@Mail.ru