悲催的科学匠人 - 冷水's blog
指针类型转换
采用fortran 2003标准iso_c_binding模块完成
program test
use iso_c_binding
implicit none
interface getptr
function fgetptr(string,ilen,ni,nj)
use iso_c_binding
implicit none
real,pointer,dimension(:,:) :: fgetptr
integer :: ilen,ni,nj
character ::string(ilen)
end function
function ggetptr(string,ilen,irank,ishape)
use iso_c_binding
implicit none
real,pointer,dimension(:,:) :: ggetptr
integer :: ilen,irank
integer :: ishape(irank)
character ::string(ilen)
end function
function hgetptr(string,ilen,ishape)
use iso_c_binding
implicit none
real,pointer,dimension(:,:) :: hgetptr
integer :: ilen
integer,dimension(:) :: ishape
character ::string(ilen)
end function
end interface
interface
function getchar(string)
character,pointer,dimension(:) :: getchar,string
end function
end interface
type(c_ptr) :: p
!character,target :: string(400)
character,pointer,dimension(:) :: string,pp
real,pointer,dimension(:,:) :: idata
integer :: ishape(2)
ishape(1) = 25
ishape(2) = 4
allocate(string(400))
call convt1(string, 25,4,idata)
write(*,*) '============================='
idata => fgetptr(string,400,25,4)
write(*,*) idata
write(*,*) '============================='
idata => ggetptr(string,400,2,ishape)
write(*,*) idata
write(*,*) '============================='
idata => getptr(getchar(string),400,ishape)
write(*,*) idata
end
function getchar(string)
character,pointer,dimension(:) :: getchar,string
getchar => string
end function
function fgetptr(string,ilen,ni,nj)
use iso_c_binding
implicit none
real,pointer,dimension(:,:) :: fgetptr
integer :: ilen,ni,nj
character ::string(ilen)
!
type(c_ptr) :: p
write(*,*) size(string)
p = c_loc(string)
CALL c_f_pointer(p,fgetptr,(/ni,nj/))
end function
function ggetptr(string,ilen,irank,ishape)
use iso_c_binding
implicit none
real,pointer,dimension(:,:) :: ggetptr
integer :: ilen,irank
integer :: ishape(irank)
character ::string(ilen)
!
type(c_ptr) :: p
write(*,*) size(string)
p = c_loc(string)
CALL c_f_pointer(p,ggetptr,ishape)
end function
function hgetptr(string,ilen,ishape)
use iso_c_binding
implicit none
real,pointer,dimension(:,:) :: hgetptr
integer :: ilen
integer,dimension(:) :: ishape
character ::string(ilen)
!
type(c_ptr) :: p
integer :: irank
irank = size(shape(hgetptr))
write(*,*) size(string),irank
p = c_loc(string)
CALL c_f_pointer(p,hgetptr,ishape(1:irank))
end function
subroutine convt1(odata, ni,nj,tdata)
implicit none
integer :: ni,nj
real,target :: odata(ni,nj)
real,pointer,dimension(:,:) :: tdata
integer :: i,j
real :: n
n=1.
do j=1,nj
do i=1,ni
odata(i,j) = n
n=n+1.
enddo
enddo
return
end subroutine