аналог PvsDynArrayInsert

Вопросы программирования на Free Pascal, использования компилятора и утилит.

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

аналог PvsDynArrayInsert

Сообщение coyot.rush » 18.09.2010 22:08:56

вот тут http://www.rsdn.ru/article/Delphi/dynarrays.xml нашел описание функций для работы с динамическими массивами,
есть ли аналоги в fpc
Функции для работы с массивами

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

* PvsDynArrayClone – создает уникальную копию массива.
* PvsDynArrayInsert – вставляет новые элементы в любое место массива.
* PvsDynArrayRemove – удаляет элементы из массива.
* PvsDynArrayJoin – копирует элементы из одного массива в другой.

Кроме того, для алгоритма быстрой сортировки, нет никакой необходимости что-либо знать о типе и содержимом массива, достаточно иметь две процедуры: сравнения и обмена. Аналогично и для двоичного поиска, необходима только функция сравнения. Это позволяет написать функции сортировки и двоичного поиска в любом массиве.

* PvsQuickSort – процедура быстрой сортировки для любых данных представляемых как массив.
* PvsArrayQuickSort - процедура быстрой сортировки для любых массивов как статических, так и динамических.
* PvsDynArrayQuickSort - процедура быстрой сортировки для динамических массивов.
* PvsBinaryFind – процедура двоичного поиска в любом массиве.
* PvsDynArrayBinaryFind - процедура двоичного поиска в динамическом массиве.

Несколько замечаний по применению:

1. Одним из параметров этих функций является RTTI о типе массива, возвращаемая оператором TypeInfo. И действительно, как можно изменить размер массива, не зная размер его элемента, ведь в заголовке массива размер элемента не хранится. И это не искусственный прием, так поступает сама Delphi. Таких функций, как SetLength или Length фактически не существует, компилятор заменяет их своими системными функциями. В частности вызов SetLength транслируется в DynArraySetLength, с передачей ему RTTI.
2. Элементами динамического массива могут быть длинные строки, интерфейсы, динамические массивы и т.п. Поэтому при удалении такого элемента требуется выполнить финализацию всех находящихся в нем значений, какой бы вложенности они небыли. Предлагаемые функции корректно выполняют финализацию.
3. Функции полностью следуют стандартному поведению в отношении учета счетчика ссылок.
4. Для работы с динамическими массивами используются те же системные процедуры, которые использует сама Delphi.


извиняюсь :oops:
качать отсюда http://www.rsdn.ru/article/Delphi/DynArrays/PvsLibFD.zip
Аватара пользователя
coyot.rush
постоялец
 
Сообщения: 309
Зарегистрирован: 14.08.2009 08:59:48

Re: аналог PvsDynArrayInsert

Сообщение Sergei I. Gorelkin » 18.09.2010 23:58:34

Аналогов нет, и, скорее всего, даже указанные функции не будут работать, из-за "небольшого" отличия RTTI в FPC от Дельфи...
Отличие состоит в том, что typeinfo() для записей и массивов возвращает бессмысленную заглушку, а тот правильный указатель, который отдается во внутренние процедуры RTL, из пользовательской программы получить в принципе невозможно.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград


Вернуться в Free Pascal Compiler

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

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

Рейтинг@Mail.ru