А зря. Есть в FPC такой баг-перестраховка на Var-аргументах :
--------------
proc ( var arg: array of integer; ..)
begin
..
setlength(arg, value)
..
end;
-------------
будет ругаться, зато :
----------------
type
integerarty = array of integer;
var
..
proc ( var arg: integerarty; ..)
begin
..
setlength(arg, value)
..
end;
-------------
работает на "ура"
Я тоже не сразу понял, почему автор MSEgui всегда объявляет новый тип для открытых массивов.
Ничего удивительного. Ведь
- Код: Выделить всё
proc ( var arg: array of integer; ..)
и
- Код: Выделить всё
type
integerarty = array of integer;
proc ( var arg: integerarty; ..)
разные вещи.
Первое - Open Array Parameters. Может принимать в ккачестве параметров не только динамические массивы, но и обычные. Поэтому SetLength и не работает. Без модификатора var вообще передается через стек.
Второе же - ожидается передача именно дин. массива.
Не знаю как в FPC, а в Delphi этот "баг" прописан в документации и является фичей.
По теме: самый быстрый способ удалить из массива элемент это заместить его последним эл-том массива (предварительно можно финализировать), а сам массив, сократить на единицу.
Порядок эл-тов при этом конечно не сохраняется, но это далеко не всегда реально нужно. А все эти Move'ы с дин. массивами чреваты. Все-таки дин. массивы это refcounted объекты и не стоит с ними так.