Передача строк в функции C с помощью протокола SAS proc - PullRequest
3 голосов
/ 25 февраля 2010

Я ткнул носом в расширение обработки строк SAS с помощью некоторых функций C, таких как самый длинный алгоритм общих подстрок. Функции Proc FCMP становятся довольно неэффективными.

Встроенный компилятор C в proc proto, похоже, не дает ожидаемых результатов после написания алгоритма в Visual Studio. Думаю, я убедился в том, что строки, передаваемые в функцию C, кажутся заполненными пробелом длиной примерно 100 символов.

Прежде чем я продолжу писать код для определения места, где должна заканчиваться строка, я хотел бы знать, знает ли кто-нибудь об альтернативных подходах или вообще может поделиться идеями о написании функций C для SAS?

Вот пример кода

/* C functions*/
proc proto package=sasuser.funcs.sfuncs;
    /* A string length function */
    int cslen(const char *s);
    externc cslen;
    int cslen(const char *s)
    {
        int i=0;
        while (s[i++]!=0){}
        return i-1;
    }
    externcend;
    /* A char function */
    int cschar(const char *s,const int pos);
    externc cschar;
    int cschar(const char *s,const int pos)
    {
        return s[pos];
    }
    externcend;
run;
option cmplib=sasuser.funcs;
/* SAS wrappers */
proc fcmp outlib=sasuser.funcs.sfuncs;
    function slen(s $);
        val=cslen(s);
        return(val);
    endsub;
    function schar(s $,pos);
        val=cschar(s,pos);
        return(val);
    endsub;
quit;

Проверка функций с помощью

/* Tests */
data _null_;
    length str $6.;
    str="foobar";
    len=slen(str);
    firstchar=schar(str,0);
    lastchar=schar(str,5);
    shouldbenull=schar(str,6);
    put _all_;
run;

дает

str=foobar len=91 firstchar=102 lastchar=114 shouldbenull=32 _ERROR_=0 _N_=1

РЕДАКТИРОВАТЬ: Мы, оказывается, вы можете взломать себя вокруг этого, просто обрезая строку в обертках, например:

proc fcmp outlib=sasuser.funcs.sfuncs;
    function slen(s $);
        val=cslen(trim(s));
        return(val);
    endsub;
quit;

1 Ответ

3 голосов
/ 02 марта 2010

Я бы обратился в службу технической поддержки SAS (support@sas.com) за помощью в PROC PROTO и о том, как SAS передает строки в подпрограммы C.

Существуют и другие способы доступа к подпрограммам, написанным на C. Одним из них является использование CALL MODULE, функции MODULEN или функции MODULEC. Эти подпрограммы имеют возможность вызывать функции, которые хранятся в .dll (или .so в Unix). Ссылка на документацию по Windows CALL MODULE находится здесь:

http://support.sas.com/documentation/cdl/en/hostwin/61924/HTML/default/win-func-module.htm

Ссылка на документацию UNIX CALL MODULE находится здесь:

http://support.sas.com/documentation/cdl/en/hostunx/61879/HTML/default/unx-func-module.htm

Другой вариант - лицензировать SAS / TOOLKIT. SAS / TOOLKIT позволяет вам писать функции, PROC, форматы, информаторы и движки на C и других языках, которые можно использовать из SAS. Вот страница с информацией о SAS / TOOLKIT:

http://www.sas.com/products/toolkit/index.html

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