2

在研究 FCMP 以帮助回答这里的另一个问题时,我对proc fcmp使用该VARARGS选项时的工作原理感到有些困惑,以便能够使用可变数量的参数调用该函数。FUNCTION 语句的 sas 支持页面提供了以下示例,并明确指出“该示例暗示求和函数可以调用如下:sum = summation(1, 2, 3, 4, 5);。”

options cmplib=sasuser.funcs;

proc fcmp outlib=sasuser.funcs.temp;
function summation (b[*]) varargs;
    total = 0;
    do i = 1 to dim(b);
        total = total + b[i];
    end;
return(total);
endsub;
sum=summation(1,2,3,4,5);
   put sum=;
run;

运行它似乎运行良好并生成一个输出报告,显示sum=15该报告似乎表明调用函数summation(1,2,3,4,5)按预期工作。

但是,如果我尝试在数据步骤中以相同的方式使用该函数

data _null_;
test=summation(1,2,3,4,5);
run;

我在日志中收到错误

错误 72-185:求和函数调用的参数太多。

错误 707-185:求和子例程调用的参数 1 需要数组。

这让我很困惑。我错过了一些明显的东西吗?

第二条错误消息说该函数需要一个数组作为参数 1。忘记了在fcmpproc 中以这种方式调用该函数似乎有效并且 SAS 支持似乎表明这就是重点的事实;期望一个确实可以具有不同长度的数组实际上与接受可变数量的参数不同,数组是一个参数

4

2 回答 2

3

如果指定 VARARGS,则函数中的最后一个参数必须是数组。

后来:

注意:从 DATA 步调用此函数时,必须将 VARARGS 作为数组提供。

http://documentation.sas.com/?docsetId=proc&docsetTarget=n10vesidziklh1n1l7kidq4dqd0r.htm&docsetVersion=9.4&locale=en

请确保使用最新版本的文档,在本例中为 9.4。除非您不幸卡在 9.2 版上。这对我有用 - 请注意,这不是我期望它的工作方式......但它确实:)。

data demo;
    array test(4) (1, 2, 3, 4);
    check = summation(test);
    put check=;
run;
于 2017-11-27T16:45:35.967 回答
1

只是根据您的评论进行澄清“提供一种方法来定义带有可变数量参数但只能在定义它的 proc fcmp 中使用的函数有什么意义?”。

FCMP 可以使用 inlib=proc 选项或 CMPLIB 选项加载函数。由于 FCMP 知道如何调用 varargs 函数,您仍然可以使用该选项,只需从其他 proc fcmp 步骤或 fcmp 函数。

于 2017-11-27T20:23:20.720 回答