Функция с переменным числом параметров
Здравствуйте!
Можно ли добавить функцию с переменным числом параметров? По аналогии с
Delphi сделал так:
Func(AParam: array of Variant): Variant;
Функция добавилась. Но вот написать как в Delphi:
Func([x,y,5]) - не получается.
Или, можно ли для функции (или вообще) "отключить" проверку количества
параметров? Для скриптового языка это вполне нормально.
Спирин Сергей.
Компания "Паритет Софт".
Можно ли добавить функцию с переменным числом параметров? По аналогии с
Delphi сделал так:
Func(AParam: array of Variant): Variant;
Функция добавилась. Но вот написать как в Delphi:
Func([x,y,5]) - не получается.
Или, можно ли для функции (или вообще) "отключить" проверку количества
параметров? Для скриптового языка это вполне нормально.
Спирин Сергей.
Компания "Паритет Софт".
Комментарии
Func(AParam:Variant): Variant;
Так действительно все работает. Ввела в заблуждение разница с Delphi. В Delphi для передачи вариантного массива необходимо использовать VarArrayOf. Конструкция же [,,] используется для динамического массива вариантов. Эта разница объяснима? Или так исторически сложилось?
Спирин Сергей.
Компания "Паритет Софт".
P.S. Кстати, пустой массив - [] не воспринимается, дает "expression error". Проблема обходится параметром по умолчанию, но все-таки
Какую ошибку выдает при таком объявлении? Просто в самом синтаксисе это не учтено.
Конструкция то работает, только в "одну строку" что-то я не понимаю как это использовать:
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..".
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.
1. Почему результат 16?
2. Если закомментировать все присвоения кроме v[1,1] := 11, то результат правильный 11. Гм...
3. С массивом, который создан в Delphi с помощью VarArrayCreate и возвращен как результат функции не работает, получается нужно преобразовывать, как?
4. Опять все наоборот по сравнению с Delphi - V[x,y] - для многомерных массивов, а у нас вложенные.
Пока это можно сделать только через дополнительные переменные:
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])
В любом случае, большое спасибо, Вы мне реально помогли.
Спирин Сергей.
Компания "Паритет Софт".
Как же плохо, что это до сих пор не сделано...
точно также не работает. ...ну как же все-таки обратиться к элементу вариантного массива, который является массивом?
Через вспомогательные переменные - это просто ужасно: данные копируются, теряется производительность...