1

Как написать функцию Variadic в Microsoft Visual Foxpro?Функции Variadic в Visual FoxPro

Вариадическая функция - это переменная, которая принимает переменное количество аргументов - см. http://en.m.wikipedia.org/wiki/Variadic_function. Примеры даются практически для любого другого языка программирования в мире по адресу http://rosettacode.org/wiki/Variadic_function, но не для хорошего лиса.

Поэтому, учитывая следующую функцию:

Function PrintVars(var1,var2,var3) 
    ? var1 
    ? var2 
    ? var3 
End Func 

Как мы позволяем любое количество аргументов?

ответ

0

У вас есть ограниченная возможность сделать это в VFP.

FUNCTION printvars 
PARAMETERS p1, p2, p3, p4 
    ? "Parameter count", PARAMETERS() 
    ? p1 
    ? p2 
    ? p3 
    ? p4 
RETURN 

вызовов это так: printvars (1, 2)

и ваши результаты будут:

Parameter count 2 
     1 
     2 
.F. 
.F. 

VFP будет инициализировать любой параметр вы явно не передавать с логическим .F. стоимость. Функция PARAMETERS(), очевидно, говорит вам, сколько из них действительно было передано.

Передача слишком большого количества параметров приведет к ошибке, которую ваш оператор PARAMETER должен указать больше параметров.

+0

В соответствии с моим комментарием к Tamar мы придем к выводу, указав максимальное количество параметров - единственный способ сделать это в VFP? Просто вслух вслух я ждал, когда кто-то придет вместе с волшебным трюком, включающим макроподстановку или массивы или указатели, или передав ссылку или вызов Windows API или что-то в этом роде. – Caltor

+1

Да, вам нужно указать максимальное количество параметров в инструкции PARAMETER. Если вы хотите передать один массив, содержащий фактические параметры, небо - это предел! Это может быть вашим лучшим способом, если вы действительно не знаете, сколько вещей вам может понадобиться. – LAK

+1

В дополнение к простым параметрам вы могли бы фактически передать объекты, которые могли бы иметь много свойств, массивов, псевдонимов и т. Д., Но я думаю, что намерение будет распространяться на одни и те же типы данных. – DRapp

1

Я бы не согласился с тем, что это ограниченная возможность. Вам не нужно ничего особенного делать. По умолчанию VFP позволяет пропускать меньше заданного количества параметров.

Кроме того, не используйте функцию PARAMETERS(), чтобы узнать, сколько параметров вы получили. У этого есть недостаток; если вы вызываете другую процедуру перед ее использованием, она сообщает вам, сколько параметров было передано этой программе. Вместо этого используйте PCOUNT(); он всегда сообщает вам, сколько параметров было передано текущей программе.

Вот код, который показывает, что случилось с ПАРАМЕТРАМИ():

DEBUG 

Subproc("abc", 123) 

RETURN 

PROCEDURE Subproc(cParm1, nParm2) 

DEBUGOUT "Immediately on entry to Subproc" 
DEBUGOUT " PARAMETERS() returns ", PARAMETERS() 
DEBUGOUT " PCOUNT() returns ", PCOUNT() 

Subsubproc() 

DEBUGOUT "After call to Subsubproc" 
DEBUGOUT " PARAMETERS() returns ", PARAMETERS() 
DEBUGOUT " PCOUNT() returns ", PCOUNT() 

RETURN 

PROCEDURE Subsubproc 

RETURN 

После выполнения этого кода, посмотрите в окно Debug Output.

+1

Правда. Я не склонен много думать о различиях между PCOUNT() и PARAMETERS(); мы выполняем всю служебную работу, связанную с параметрами, в начале любой заданной функции, поэтому это не имеет значения. Ограничение на объект (по сравнению с большинством современных языков) заключается в том, что вы должны указать по крайней мере столько параметров в инструкции PARAMETERS, сколько вы намереваетесь на самом деле назвать. – LAK

+0

Вы говорите, что единственный способ сделать это - это сигнатура функции с максимальным количеством параметров (согласно http://msdn.microsoft.com/en-us/library/3kfd3hw9(v=vs.80).aspx максимальное количество пройденных параметров равно 26) и использовать PCOUNT(), чтобы проверить, сколько было передано? Хороший улов с PARAMETERS vs PCOUNT. Не могу поверить, что я развиваюсь с VFP около 20 лет и никогда не использовал или не сталкивался с DEBUGOUT. Я всегда просто использовал? или STRTOFILE в прошлом. – Caltor

+1

Другой альтернативой является передача объекта, который содержит свойство для каждого параметра или свойство массива. Честно говоря, мне никогда не нужно было больше, чем (или где-нибудь рядом) 26 параметров. Если да, вы можете пересмотреть дизайн. –

Смежные вопросы