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

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

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

Ответить
NVP
незнакомец
Сообщения: 1
Зарегистрирован: 01.12.2010 19:00:50

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

Сообщение NVP »

Подскажите, плиз, возможно ли работать с массивом Var A:array[-1000000000..1000000000] of 0..1;
Если да, то как это реализовать?
alexrayne
постоялец
Сообщения: 125
Зарегистрирован: 03.12.2008 15:56:26

Сообщение alexrayne »

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

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

Сообщение Kitayets »

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

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

короче имя этим инструментам - matlab, scilab, GNU octave, ROOT и многие другие.
Maxizar
постоялец
Сообщения: 385
Зарегистрирован: 20.03.2010 18:48:14

Сообщение Maxizar »

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

Сообщение Kitayets »

2Maxizar

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

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

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

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

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

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

bigArras: array[0..2000000000] of bytebool

но размер такого массива почти 2Гб. на x86_64 можно, думаю, с таким массивом работать как обычно :)
Аватара пользователя
hinst
энтузиаст
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Сообщение hinst »

а что никто про TBits не сказал. уже есть же
alexrayne
постоялец
Сообщения: 125
Зарегистрирован: 03.12.2008 15:56:26

Сообщение alexrayne »

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

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

Пасиба, век жыви век учись
Kitayets
постоялец
Сообщения: 174
Зарегистрирован: 05.05.2010 21:15:24

Сообщение Kitayets »

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

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

Код: Выделить всё

var
     bigBitsArray: TBits;
     ...
begin
...
   bigBitsArray:= new TBits.Create(2000000000);
...
   FreeAndNil(bitBitsArray);
end.


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