И вновь динамические массивы!

RhinoFCRhinoFC Новосибирск
отредактировано 16:14 Раздел: FastScript
Здравствуйте, уважаемые.
В общем, тема такая. Мне необходимо из скрипта работать с многомерным (двумерным) динамическим массивом, инициализированным в самом приложении.
В приложении объявлен тип 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

Комментарии

  • отредактировано 16:14
    С массивами это пожелание я писал раньше... полгода назад или больше.....
  • RhinoFCRhinoFC Новосибирск
    отредактировано 16:14
    Konst написал: »
    С массивами это пожелание я писал раньше... полгода назад или больше.....

    И, насколько я понимаю, результатов это не дало? ...Печально :)
    Ау, разрабы!!! Чё делать будем? Вы здесь бываете вообще? :)
  • отредактировано 16:14
    RhinoFC написал: »
    ...
    Всё работает, но крайне медленно. Этот код выполняется аж 42 секунды (на весьма неплохой машинке).
    ...
    Конечно!
    У тебя готовый массив передается копированием.
    А ты реализуй массив как класс, а доступ к массиву - ч/з индексируемое свойство - все летать будет.

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.