У меня проблема с фортраном и указателями функций / подпрограмм. У меня есть две функции, которые принимают массив в качестве аргумента. В f1 это (n, n), в f2 это (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
Я действительно надеюсь, что есть способ сделать это. Я не могу переписать все подпрограммы, поэтому размеры массива совпадают каждый раз: /
С уважением, Каба