본문 바로가기
SAS/SAS 함수

【SAS 함수】 45. CALL POKELONG 함수

by 기서무나구물 2018. 11. 20.

포스팅 목차

    45. CALL POKELONG

     


    32bit와 64bit 플래폼 메모리에 직접 값을 작성한다.

    Category: Special

     

    MAIN

    문 법


    CALL POKE
     (source,pointer<,length>);
     

     

    Arguments

    source

     

         는 메모리에 쓰기위해 값을 가진 SAS 표현을 지정.

     

    pointer

     

         는 메모리 주소를 지정.

     

    length

     

         는 byte수를 지정.

     


    참 고

    단, 메모리에 직접 쓰는 것은 상당히 조심할 필요있습니다.

    숫자형은 기본 length이 8byte, 문자는 지정한 lenght를 쫓아감.

    addr_n은 118646592에서 118646599, addr_c는 118646896~118646899을 차지함.

    SAS Statements
    data _null_ ;
          retain num 1 chr 'char' ;
          addr_n = addr (num) ;
          addr_c = addr (chr) ;
          put addr_n = / addr_c = ;
    run;

     

    Results
    addr_n=118646592
    addr_c=118646896

     


    관련 함수

    함수명 함수내용
    ADDR 32비트 프랫폼에서 메모리 주소를 숫자 변수로써 반환한다.
    ADDRLONG 32비트와 64비트 프랫폼에서 해당 변수의 메모리 주소를 문자변수로 반환한다.
    CALL POKE 32비트 플랫폼에서 값을 메모리에 직접 작성한다.
    CALL POKELONG 32bit와 64bit 플래폼 메모리에 직접 값을 작성한다.
    PEEK 32비트 platform에서 숫자변수의 메모리 주소의 항목(내용)을 저장한다.
    PEEKC 메모리에서 문자변수에 대한 지정한 위치(주소)에 저장된 데이터를 Access한다.
    PEEKLONG 32비트와 64비트 platforms에서 숫자 변수에 대한 메모리의 데이터를 Access한다.
    PEEKCLONG 32비트와 64비트 platforms에서 문자 변수에 대한 메모리의 데이터를 Access한다.
    PTRLONGADD 32비트나 64비트에서 포인터 주소를 문자변수로 반환한다.

     


    예 제

     

    예 제 1 :

    변수 C1의 값(4)을 메모리에서 접근하여 취한후에, 그 값을 메모리 주소 addr(배열의 해당변수,즉 x8에서 x1까지)에 length 8(c1의 8자리를 가져옮)로 직접 기록한다.

     * peekc : 메모리에서 지정한 위치(주소)에 저장된 데이터를 Access한다. 

    SAS Statements
    data call_pokelong1(drop = _i);
          input teid @5 (bd01-bd20) (1.) @26 (si01-si10) (1.);
          array bd (*) 3 bd01-bd20;
          array bds(*) 3 bds01-bds20;
          do _i = 1 to dim(bd);
             bds(_i) = bd(_i);
          end;
          put bd(*) / bds(*);
    cards;
    110 11111110000111110001 1111111111
    ; 
    run;

     

    Results
    1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 0 0 0 1
    1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 0 0 0 1

     


    예 제 2 :

    call pokelong을 이용하여 bd01-bd20의 데이터를 bsd01-20으로 복사하자.


    - input문장 : 5번째 자리부터 24번째 자리까지를 변수 bd01-bd20까지 각 한자리씩 읽어서 배정한다.
    - call pokelong : bd01 위치에서 배열 bd의 개수 20개와 각 자리의 length(숫자는 기본 8) 만큼을 메모리에 읽은후에,

       메모리의 변수bds01 위치로부터 20*8만큼의 위치에 기록한다.`

    SAS Statements
    data call_pokelong2;
          array bd 3 bd01-bd20;
          array bds 3 bds01-bds20;
          input teid @5 (bd01-bd20) (1.) @26 (si01-si10) (1.);
          call pokelong(peekclong(addrlong(bd01), dim(bd) * 8),
          addrlong(bds01), dim(bd) * 8);
          put bd(*) / bds(*);
    cards;
    110 11111110000111110001 1111111111
    *
    12345678901234567890123456789012345;
    ; 
    run;

     

    Results
    1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 0 0 0 1
    1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 0 0 0 1

     


    SAS 함수(SAS Function) 리스트 링크

     

    엑셀(EXCEL)과 SAS 함수(SAS Function) 비교 리스트 링크

     

    SAS 데이터 스텝 구문 리스트(SAS Data Step Statement)
    반응형

    댓글