目的は、任意のタイプのランク1の割り当てを処理できる単一の割り当てルーチンを作成することです。私たちのコードライブラリは、標準化されたエラートラップを持つ単一の呼び出しを持つことができます。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
FORTRAN: polymorphism allocationに示すように、コードの最初のバージョンはselect type
構築物に依存:
テストコードは、整数のアレイと、次に実際の配列を割り当てよう。使用される別の参考文献は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)
*目標は、任意のタイプのランク1の割り当てを処理できる単一の割り当てルーチンを作成することです。* allocateが提供するものではありませんか? –