По какой-то причине мне нужно передать указатель Fortran на подпрограмму. Подпрограмма находится внутри модуля, и основная программа использует этот модуль для обеспечения явного интерфейса.Как передать указатель fortran в подпрограмму?
Мой вопрос: какой атрибут я должен указывать в фиктивном аргументе подпрограммы, чтобы получить переданный указатель?
Я пробовал код ниже.
module aaa
contains
integer*4 function print_ptr_arr_1(ptr)
implicit none
integer*4, intent(in), pointer :: ptr(:)
print *, 'as pointer'
print *, size(ptr)
print '(10i3)', ptr
print *
end function print_ptr_arr_1
integer*4 function print_ptr_arr_2(ptr)
implicit none
integer*4, intent(in), target :: ptr(:)
print *, 'as target'
print *, size(ptr)
print '(10i3)', ptr
print *
end function print_ptr_arr_2
integer*4 function print_ptr_arr_3(ptr)
implicit none
integer*4, intent(in) :: ptr(:)
print *, 'as assumed shape array'
print *, size(ptr)
print '(10i3)', ptr
print *
end function print_ptr_arr_3
end module aaa
и
program main
use aaa
implicit none
integer*4 :: i1, ierr
integer*4, target :: arr(10)
integer*4, pointer :: ptr_arr(:)
do i1 = 1, 10
arr(i1) = i1
end do
ptr_arr => arr
ierr = print_ptr_arr_1(ptr_arr)
ierr = print_ptr_arr_2(ptr_arr)
ierr = print_ptr_arr_3(ptr_arr)
nullify(ptr_arr)
end program main
Три подпрограммы в модуле ааа показывают правильные выходы, как показано ниже.
[email protected]:~/work/practice/fortran_pointer$ ./a.out
as pointer
10
1 2 3 4 5 6 7 8 9 10
as target
10
1 2 3 4 5 6 7 8 9 10
as assumed shape array
10
1 2 3 4 5 6 7 8 9 10
[email protected]:~/work/practice/fortran_pointer$
Что является правильным, а какие нет? Или все это правильно?
Большое вам спасибо. Это очень помогло. – user79973