이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
Date |
2009/01/07 13:17:54 |
Name |
MoreThanAir |
Subject |
포트란 문법 익숙하신 분 계신가요? |
포트란을 처음 써봐서 문법이 익숙치 못합니다.
특히 배열이나 스트럭쳐 개념은 더 그렇네요.
포트란에서 씨의 DLL을 사용할 생각입니다. 일단 간단한 함수 호출과 인자 주고 받기는 성공했는데요.
포트란에서 TYPE형의 배열을 어떤식으로 인자로 넘기는지 감이 안옵니다.
PROGRAM UseCDll
USE kernel32
IMPLICIT NONE
INTEGER i,ret
TYPE detectordata
INTEGER::id
INTEGER::volume
INTEGER::occupancy
REAL::speed
REAL::density
END TYPE detectordata
TYPE rampdata
INTEGER::id
REAL::rate
END TYPE rampdata
POINTER(p_USERFUNC,compute)
INTEGER(HANDLE)::dll_handle
INTEGER(BOOL)::free_status
TYPE(detectordata),ALLOCATABLE::detector(:)
TYPE(rampdata),ALLOCATABLE::ramp(:)
INTERFACE
SUBROUTINE compute (num,d,r) BIND(C)
USE,INTRINSIC :: ISO_C_BINDING
TYPE detectordata
INTEGER::id
INTEGER::volume
INTEGER::occupancy
REAL::speed
REAL::density
END TYPE detectordata
TYPE rampdata
INTEGER::id
REAL::rate
END TYPE rampdata
INTEGER(C_INT), VALUE::num
TYPE(detectordata)::d
TYPE(rampdata)::r
END SUBROUTINE compute
END INTERFACE
ALLOCATE(detector(2))
detector(:)%id=0
detector(:)%volume=0
detector(:)%occupancy=0
detector(:)%speed=0
detector(:)%density=0
ALLOCATE(ramp(2))
ramp(:)%id=0
ramp(:)%rate=0
detector(1)%id=1
detector(1)%volume=20
detector(1)%occupancy=7
detector(1)%speed=100
detector(1)%density=70
detector(2)%id=2
detector(2)%volume=50
detector(2)%occupancy=3
detector(2)%speed=80
detector(2)%density=50
write (*,*) "Loading library..."
dll_handle = LoadLibrary ("dllcomp.dll"C)
write (*,*) "Getting routine address..."
p_USERFUNC = GetProcAddress (dll_handle,"compute"C)
call compute(2,detector,ramp)
DO i=1,2
print *,ramp(i)
END DO
write(*,*) "Unloading library..."
free_status = FreeLibrary (dll_handle)
END PROGRAM UseCDll
위와 같은 소스에서 call compute 부분이 C 함수를 호출하는 부분인데
'The type of the actual argument differs from the type of the dummy argument'라는 에러가 생깁니다.
아마 subroutine의 선언부와 실제 사용에서 인자들이 형이 맞지 않는거 같은데요.
어떻게 함수로 넘길 수 있는지 조언 좀 부탁드립니다.
|
통합규정 1.3 이용안내 인용
"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
|