我遇到了 Fortran 和函数/子例程指针的问题。我有两个将数组作为参数的函数。在 f1 中是 a(n,n),在 f2 中是 a(n*n)。当我手动调用子例程时,我可以使用相同的数组执行此操作:
real :: a(5, 5)
call f1(a, 5)
call f2(a, 5)
但是,当我尝试使用指针执行此操作时,编译器会将其返回给我,并出现以下错误:
ptr => f2
1
Error: Interface mismatch in procedure pointer assignment at (1): Type/rank missmatch in argument 'a'
有没有解决的办法?我在考虑指针,但是我有同样的问题,要创建它我需要知道维度的数量。
作为参考,这是完整的代码(我希望它不会太长..)
program ptrtest
implicit none
interface
subroutine fnc(a, n)
integer :: n
real :: a(n, n)
end subroutine
subroutine f1(a, n)
integer :: n
real :: a(n, n)
end subroutine
subroutine f2(a, n)
integer :: n
real :: a(n*n)
end subroutine
end interface
procedure(fnc), pointer :: ptr => null()
real :: a(5, 5)
real :: b(4, 4)
ptr => f1
call ptr(a, 5)
write(*,*) a
!this one does not work..
!ptr => f2
!
!call ptr(b, 4)
!write(*,*) b
call f2(b, 4)
write(*,*) b
end program
subroutine f1(a, n)
integer :: n
real :: a(n, n)
integer :: i
a = 1
end subroutine
subroutine f2(a, n)
integer :: n
real :: a(n*n)
a = 2
end subroutine
我真的希望有办法做到这一点。我无法真正重写所有子例程,因此数组的维度每次都匹配:/
问候, 卡巴