포스팅 목차
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) |
반응형
'SAS > SAS 함수' 카테고리의 다른 글
【SAS 함수】 47. CALL PRXDEBUG 함수 (0) | 2018.11.20 |
---|---|
【SAS 함수】 46. CALL PRXCHANGE 함수 (0) | 2018.11.20 |
【SAS 함수】 44. CALL POKE 함수 (0) | 2018.11.20 |
[SAS 함수] 43. CALL MODULEI 함수 (0) | 2018.11.20 |
[SAS 함수] 42. CALL MODULE 함수 (0) | 2018.11.20 |
댓글