Целью является создание единой процедуры распределения, которая может обрабатывать распределение одного ранга одного типа. Затем наша библиотека кода может иметь один вызов со стандартизованным захватом ошибок.Процедура распределения полиморфных массивов в Fortran
Ошибка компилятора следующим образом:
generic_allocation.f08:32:27:
call myAllocator (array_int, source_int, lambda)
1
Error: Actual argument to ‘myarray’ at (1) must be polymorphic
generic_allocation.f08:33:27:
call myAllocator (array_real, source_real, lambda)
1
Error: Actual argument to ‘myarray’ at (1) must be polymorphic
Может ли этот код исправить?
Тест код пытается выделить целочисленный массив, а затем реальный массив:
module mAllocator
implicit none
contains
subroutine myAllocator (myArray, source_type, lambda)
class (*), allocatable, intent (inout) :: myArray (:)
class (*), intent (in) :: source_type
integer, intent (in) :: lambda
integer :: alloc_status = 0
character (len = 512) :: alloc_message = ''
allocate (myArray (1 : lambda), source = source_type, stat = alloc_status, errmsg = alloc_message)
if (alloc_status /= 0) then
write (*, "(' allocation errmsg = ', g0, '.')") trim (alloc_message)
stop 'Fatal error in subroutine myAllocator'
end if
end subroutine myAllocator
end module mAllocator
program generic_allocation
use mAllocator, only : myAllocator
implicit none
integer, parameter :: lambda = 10
integer, parameter :: source_int = 1
real, parameter :: source_real = 1.0
integer, allocatable :: array_int (:)
real, allocatable :: array_real (:)
call myAllocator (array_int, source_int, lambda)
call myAllocator (array_real, source_real, lambda)
end program generic_allocation
Первая версия кода полагались на платформе select type
конструкции, как показано на FORTRAN: polymorphism allocation. Другая используемая ссылка - Fortran polymorphism, functions and allocation.
gfortran версия 6,0
$ gfortran -v
Using built-in specs.
COLLECT_GCC=gfortran
COLLECT_LTO_WRAPPER=/opt/gnu/6.0/libexec/gcc/x86_64-pc-linux-gnu/6.0.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: ./configure --prefix=/opt/gnu/6.0 --enable-languages=c,c++,fortran,lto --disable-multilib --disable-werror
Thread model: posix
gcc version 6.0.0 20160227 (experimental) (GCC)
* Цель состоит в том, чтобы создать единую процедуру распределения, которая может обрабатывать любое распределение рангов одного уровня. * Разве это не означает, что 'allocate' предоставляет? –