gpt4 book ai didi

将 SAS 连接到 C 库

转载 作者:行者123 更新时间:2023-12-04 09:37:29 48 4
gpt4 key购买 nike

这与从 SAS 调用 C 函数(制成动态库)有关。有4个文件。前 2 个(1 个 c 文件和 1 个 sas 文件)是使用 double 的阳性对照。剩下的文件是有问题的。

C-文件-1

#ifdef BUILD_DLL  
#define EXPORT __declspec(dllexport)
#else
#define EXPORT __declspec(dllimport)
#endif
#include "stdio.h"
#include "stdlib.h"
#include "string.h"

EXPORT void test (double *inarray, double *outarray, int n)
{
int i;
for (i=0; i<n;i++)
{
outarray[i]= inarray[i]*2;
}
return;
}

//gcc -c -DBUILD_DLL 指针Void.c
//gcc -shared -o pointersVoid.dll pointersVoid.o

SAS-文件-1
filename sascbtbl catalog 'work.api.MYFILE';  
data _null_;
file sascbtbl;
input;
put _infile_;
cards4;
routine test
module=pointersVoid
minarg=3
maxarg=3;
arg 1 input num byvalue format=IB4.;
arg 2 input num byvalue format=IB4.;
arg 3 input num byvalue format=PIB4.;
;;;;
run;
data test;
array arr(5) _temporary_ (7.56 2.356 63.54 5.14 8.2);
array ret(5);
rc=modulen ("*e","test",addr(arr(1)), addr(ret(1)), 5);
run;

这工作正常, ret 数组现在包含原始值的 *2。
但是当我们使用字符串时,我们会得到错误:

C-文件-2
#include "stdio.h"  
#include "stdlib.h"
#include "string.h"

char *strtrim_right(char *p)
{
char *end;
int len;
len = strlen(p);
while (*p && len)
{
end = p + len-1;
if(isalpha(*end))
*end = 0;
else
break;
len = strlen(p);
}
return(p);
}

EXPORT char **test (char **x, char **y, int n)
{
int i;
for (i = 0; i < n; i++)
{
y[i] = strtrim_right(x[i]);
}
}

/*
gcc -c -DBUILD_DLL pointers-array-string-void.c
gcc -shared -o pointers-array-string-void.dll pointers-array-string-void.o
*/

SAS-文件-2
filename sascbtbl catalog 'work.api.MYFILE';  
data _null_;
file sascbtbl;
input;
put _infile_;
cards4;
routine test
module=pointers-array-string-void
minarg=3
maxarg=3;
arg 1 input char byvalue format=$CSTR200. ;
arg 2 input char byvalue format=$CSTR200. ;
arg 3 input num byvalue format=PIB4. ;
;;;;
run;
data test;
array arr(5) $ _temporary_ ('PM23RO' '85AB12RE' 'RE147AMF' 'TAGH14MMF' 'LCA2Q');
array ret(5) $;
call module ("*e","test",addr(arr(1)), addr(ret(1)), 5);
run;

这不起作用并给出错误:
Unrecognized option - in ROUTINE statement
NOTE: Invalid argument to function MODULE
ret1= ret2= ret3= ret4= ret5= rc=. _ERROR_=1 _N_=1

我知道 C-FILE-2 运行良好,因为 dll 已经从另一个应用程序测试,所以错误源很可能是 SAS-FILE-2 中的 SAS 代码。有什么建议可以让它发挥作用吗?

最佳答案

在 64 位 SAS 中,您需要使用 addrlong并更新模块参数声明以具有 format=$ptr. datalen=8 .

如果你的 .dll 是 32 位的,你应该仍然可以通过添加 routine 来调用它的例程。声明选项 dlltype=32 . ("When I'm 64-bit: How to Still Use 32-bit DLLs in Microsoft Windows" Rick Langston,2015 年 SAS 全局论坛。)

关于将 SAS 连接到 C 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3727115/

48 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com