Функция с переменным числом параметров

отредактировано 18:20 Раздел: FastScript
Здравствуйте!

Можно ли добавить функцию с переменным числом параметров? По аналогии с
Delphi сделал так:

Func(AParam: array of Variant): Variant;

Функция добавилась. Но вот написать как в Delphi:

Func([x,y,5]) - не получается.

Или, можно ли для функции (или вообще) "отключить" проверку количества
параметров? Для скриптового языка это вполне нормально.


Спирин Сергей.
Компания "Паритет Софт".

Комментарии

  • отредактировано 18:20
    Попробуйте описать так:
    Func(AParam:Variant): Variant;
  • отредактировано 18:20
    Спасибо ;)

    Так действительно все работает. Ввела в заблуждение разница с Delphi. В Delphi для передачи вариантного массива необходимо использовать VarArrayOf. Конструкция же [,,] используется для динамического массива вариантов. Эта разница объяснима? Или так исторически сложилось? ;)

    Спирин Сергей.
    Компания "Паритет Софт".

    P.S. Кстати, пустой массив - [] не воспринимается, дает "expression error". Проблема обходится параметром по умолчанию, но все-таки ;)
  • отредактировано 18:20
    Вообще кострукция Func(AParam: array of Variant): Variant должна работать.
    Какую ошибку выдает при таком объявлении?
    написал:
    P.S. Кстати, пустой массив - [] не воспринимается, дает "expression error". Проблема обходится параметром по умолчанию, но все-таки 
    Просто в самом синтаксисе это не учтено.
  • отредактировано 18:20
    написал:
    Вообще кострукция Func(AParam: array of Variant): Variant должна работать

    Конструкция то работает, только в "одну строку" что-то я не понимаю как это использовать: ;)

    Func(?????) // В Delphi - Func([x,y,z])

    Понятно, что можно:

    V : array of variant;
    SetLength(V, 3)
    V[1] := ...
    .....
    .....
    и, наконец, Func(V)

    Но для целей передачи произвольного кол-ва параметров это как-то... ;)

    Кстати, если можно, еще консультацию. Имеем вариантный массив элементы которого тоже могут быть вариантным массивом, то есть:

    V := VarArrayCreate([1, 100], varVariant);
    V[1] := VarArrayCreate([1, 10], varVariant);

    Как теперь "достучаться" до элемента [1,1]?

    В Delphi - V[1][1] := '111111';
    В скрипте на такое - "List index out..". ;)
  • отредактировано 18:20
    А, так:
    var
    v,v1,v2:variant;
    begin
    V := VarArrayCreate([0 ,1], varVariant);
    V[0] := VarArrayCreate([1, 8], varVariant);
    v[1] := VarArrayCreate([1, 6], varVariant);
    v[0,1] := 1;
    v[0,2] := 2;
    v[0,3] := 3;
    v[0,4] := 4;
    v[0,5] := 5;
    v[0,6] := 6;
    v[0,7] := 7;
    v[0,8] := 8;
    v[1,1] := 11;
    v[1,2] := 12;
    v[1,3] := 13;
    v[1,4] := 14;
    v[1,5] := 15;
    v[1,6] :=16;
    ShowMEssage(V[1,1]);
    end.
  • отредактировано 18:20
    написал:
    А, так:
    Бр.. ;) Так еще хуже.

    1. Почему результат 16?
    2. Если закомментировать все присвоения кроме v[1,1] := 11, то результат правильный 11. Гм...

    3. С массивом, который создан в Delphi с помощью VarArrayCreate и возвращен как результат функции не работает, получается нужно преобразовывать, как?

    4. Опять все наоборот по сравнению с Delphi - V[x,y] - для многомерных массивов, а у нас вложенные.
  • отредактировано 18:20
    Предыдущий пост можно игнорировать, работать этот бред и не должен ;)
    Пока это можно сделать только через дополнительные переменные:
    var
    v,v1,v2:variant;
    begin
    V := VarArrayCreate([0 ,1], varVariant);
    V[0] := VarArrayCreate([1, 8], varVariant);
    v[1] := VarArrayCreate([1, 6], varVariant);
    v1 := v[0];
    v2 := v[1];
    v1[1] := 0;
    v1[3] := 3;
    v2[1] := 4;
    v2[2] := 5;
    ShowMEssage(V1[3]);
    end.

    Еще можно зарегистрировать финкцию VarArrayRef() и попробовать так ShowMEssage(VarArrayRef(V[1])[2])
  • отредактировано 18:20
    написал:
    Предыдущий пост можно игнорировать, работать этот бред и не должен  ;)
    Пока это можно сделать только через дополнительные переменные:
    Да, то что можно сделать через доп. функции это было очевидно сразу. К сожалению, у меня задача в обшем виде, поэтому "полумеры" мне не очень подходят. Остановился на "избыточном варианте" - всегда создавать многомерный массив, здесь пока проблем не обнаружил. На будующее, мне кажется, стоит подумать о введении синтаксиса "массив в элементе массива" - V[x][у]....

    В любом случае, большое спасибо, Вы мне реально помогли. ;)

    Спирин Сергей.
    Компания "Паритет Софт".

  • отредактировано 18:20
    SpirinS написал: »
    ...стоит подумать о введении синтаксиса "массив в элементе массива" - V[x][у]....

    Как же плохо, что это до сих пор не сделано... :)
  • отредактировано 18:20
    написал: »
    ...
    Еще можно зарегистрировать финкцию VarArrayRef() и попробовать так ShowMEssage(VarArrayRef(V[1])[2])

    точно также не работает.
      Script.AddMethod('function VarArrayRef(const A: Variant): Variant', CallMethods); // регистрация
    ...
    function TCustomAdvReport.CallMethods(Instance: TObject; ClassType: TClass;
      const MethodName: String; var Params: Variant): Variant;
    begin
      Result := null;
      if MethodName = 'VARARRAYREF' then
        Result := VarArrayRef(Params[0]);
    
    end;
    
    ...ну как же все-таки обратиться к элементу вариантного массива, который является массивом?
    Через вспомогательные переменные - это просто ужасно: данные копируются, теряется производительность...

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

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