Страница 1 из 1

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

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

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

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

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

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

СообщениеДобавлено: 13.12.2010 01:10:54
Kitayets
если приходится иметь дело с матрицами больших размерностей
возможно, что для таких задач лучше использовать соответствующие инструменты?

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

короче имя этим инструментам - matlab, scilab, GNU octave, ROOT и многие другие.

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

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

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

СообщениеДобавлено: 13.12.2010 17:09:09
Kitayets
2Maxizar

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

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

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

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

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

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

bigArras: array[0..2000000000] of bytebool

но размер такого массива почти 2Гб. на x86_64 можно, думаю, с таким массивом работать как обычно :)

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

СообщениеДобавлено: 13.12.2010 21:57:50
hinst
а что никто про TBits не сказал. уже есть же

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

СообщениеДобавлено: 13.12.2010 22:41:04
alexrayne
вообще документация незапрещает применить тут и упакованный массив, только непонятно насколько удачный доступ к элементам его компилятор сделает.

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

Пасиба, век жыви век учись

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

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

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

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


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