ASSOCIATED — 포인터의 연결 상태 확인하기

ASSOCIATED — 포인터의 연결 상태 확인하기

포인터를 다루다 보면 "이 포인터가 지금 어떤 대상에 연결돼 있나?"를 확인하고 싶을 때가 있어요. 아직 아무것도 가리키지 않는 포인터에 접근하면 곤란하니까요. ASSOCIATED는 포인터의 연결 상태를 묻는 조회 함수(inquiry function)로, 연결된 대상이 있는지 또는 특정 대상과 연결됐는지 알려줘요.

출처: ASSOCIATED (The GNU Fortran Compiler)

본문

시그니처

RESULT = ASSOCIATED(POINTER [, TARGET])

설명

ASSOCIATED(POINTER [, TARGET])는 포인터 POINTER의 상태를 판단하고, TARGET이 주어지면 POINTER가 그 대상 TARGET에 연결돼 있는지도 판단해요.

클래스

조회 함수(Inquiry function)예요.

인자

  • POINTERPOINTER 애트리뷰트를 가져야 하며, 타입은 아무거나 될 수 있어요.
  • TARGET (선택) — 포인터이거나 타겟이어야 해요. POINTER와 같은 타입, kind 타입 매개변수, 배열 랭크를 가져야 해요.

POINTERTARGET 어느 쪽도 연결 상태(association status)가 정의되지 않은(undefined) 상태여선 안 돼요.

반환값

ASSOCIATED(POINTER)LOGICAL(4) 타입의 스칼라 값을 돌려줘요. 경우를 나누어 보면 이래요.

  • (A) 선택 인자 TARGET이 없을 때, POINTER가 어떤 대상에 연결돼 있으면 참이고, 그렇지 않으면 거짓이에요.
  • (B) TARGET이 스칼라 타겟으로 주어졌을 때, TARGET이 크기가 0인 저장 시퀀스가 아니고 POINTER가 가리키는 대상이 같은 저장 단위를 차지하면 참이에요. POINTER가 분리(disassociated)돼 있으면 거짓이에요.
  • (C) TARGET이 배열 타겟으로 주어졌을 때, TARGETPOINTER가 같은 모양이고 크기가 0인 배열이 아니며, 요소가 크기가 0인 저장 시퀀스가 아니고, 배열 요소 순서대로 같은 저장 단위를 차지하면 참이에요. (B)와 마찬가지로 POINTER가 분리돼 있으면 거짓이에요.
  • (D) TARGET이 스칼라 포인터로 주어졌을 때, TARGETPOINTER에 연결돼 있고 두 대상이 크기가 0인 저장 시퀀스가 아니며 같은 저장 단위를 차지하면 참이에요. TARGET이나 POINTER 중 하나라도 분리돼 있으면 거짓이에요.
  • (E) TARGET이 배열 포인터로 주어졌을 때, POINTERTARGET이 가리키는 대상이 같은 모양이고 크기가 0인 배열이 아니며 요소가 크기가 0인 저장 시퀀스가 아니고 배열 요소 순서대로 같은 저장 단위를 차지하면 참이에요. TARGET이나 POINTER 중 하나라도 분리돼 있으면 거짓이에요.

예제

program test_associated
  implicit none
  real, target  :: tgt(2) = (/1., 2./)
  real, pointer :: ptr(:)
  ptr => tgt
  if (associated(ptr)     .eqv. .false.) call abort
  if (associated(ptr,tgt) .eqv. .false.) call abort
end program test_associated

ptrtgt에 연결된 뒤 두 검사 모두 참이 되어야 해요.

표준

Fortran 90 이후부터 지원돼요.

더 알아보기

  • 분리된 포인터를 돌려주는 함수로 NULL이 있어요. ASSOCIATED와 짝을 지어 생각하면 편해요.
  • GNU Fortran 내장 프로시저 전체 목록은 Intrinsic Procedures에서 확인할 수 있어요.