И вновь динамические массивы!
RhinoFC
Новосибирск
Здравствуйте, уважаемые.
В общем, тема такая. Мне необходимо из скрипта работать с многомерным (двумерным) динамическим массивом, инициализированным в самом приложении.
В приложении объявлен тип TArray и зарегистрирован метод, возвращающий в скрипт переменную этого типа:
Теперь пытаюсь выполнить такой скрипт:
Всё работает, но крайне медленно. Этот код выполняется аж 42 секунды (на весьма неплохой машинке).
Подозреваю, что это из-за того, что тип TArray зарегистирован как fvtVariant, но зарегистировать его как fvtArray не удаётся. Парсер не воспринимает его как двумерный и вылетает при обращении к элементу массива.
Пробовал разные варианты, но всё сводится к одному, зарегить двумерный массив можно только как fvtVariant, а он сильно тормозит.
Что делать? Как лечить (и кого - FS или меня)?
Версия FS 1.9
В общем, тема такая. Мне необходимо из скрипта работать с многомерным (двумерным) динамическим массивом, инициализированным в самом приложении.
В приложении объявлен тип TArray и зарегистрирован метод, возвращающий в скрипт переменную этого типа:
type TArray = array of array of double;
...
procedure TForm.FormCreate(Sender: TObject);
begin
fsScript.Parent := fsGlobalUnit;
fsScript.AddRTTI;
// регистрирую тип TArray
fsGlobalUnit.AddType('TArray', fvtVariant);
// fsGlobalUnit.AddType('TArray', fvtArray); <- по идее должен быть этот вариант, но...
// регистрирую функцию получаения массива из приложения
fsGlobalUnit.AddMethod('function GetArray: TArray', CallMethod);
end;
function TForm.CallMethod(Instance: TObject; ClassType: TClass;
const MethodName: String; Caller: TfsMethodHelper): Variant;
var
i, j: Integer;
begin
if MethodName = 'GETARRAY' then
begin
// пусть пока так, но вообще, массив уже давно проинициализирован и заполнен данными, которые нужно обработать в скрипте
SetLength(FArray, 100, 100); // FArray: TArray - поле класса TForm
Result := FArray;
end;
end;
Теперь пытаюсь выполнить такой скрипт:
var
A: TArray;
i, j: integer;
begin
A := GetArray;
for i := 0 to 99 do
for j := 0 to 99 do
A[i, j] := i + j * i; // <- если зарегить TArray как fvtArray, здесь будет вылет
end.
Всё работает, но крайне медленно. Этот код выполняется аж 42 секунды (на весьма неплохой машинке).
Подозреваю, что это из-за того, что тип TArray зарегистирован как fvtVariant, но зарегистировать его как fvtArray не удаётся. Парсер не воспринимает его как двумерный и вылетает при обращении к элементу массива.
Пробовал разные варианты, но всё сводится к одному, зарегить двумерный массив можно только как fvtVariant, а он сильно тормозит.
Что делать? Как лечить (и кого - FS или меня)?
Версия FS 1.9
Комментарии
И, насколько я понимаю, результатов это не дало? ...Печально
Ау, разрабы!!! Чё делать будем? Вы здесь бываете вообще?
У тебя готовый массив передается копированием.
А ты реализуй массив как класс, а доступ к массиву - ч/з индексируемое свойство - все летать будет.