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