Подключите SAS к библиотеке C - PullRequest
4 голосов
/ 16 сентября 2010

Это связано с вызовом функций C (из динамических библиотек) из SAS. Есть 4 файла. первые 2 (1 c-файл и 1 sas-файл) являются положительным контролем с использованием двойных чисел. Остальные файлы проблемные.

C-FILE-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 pointersVoid.c
// gcc -shared -o pointersVoid.dll pointersVoid.o

SAS-FILE-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-FILE-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-FILE-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 в SAS-FILE-2. Любые предложения, чтобы это работало?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...