Fortran pointer error: "Invalid character in name "
Fortran pointer error: "Invalid character in name "
我有一个名为 m_mixing.F90
的文件。
在这个文件中,有一个函数给出了编译错误:
function getstackval(mix,sidx,hidx) result(d1)
type(tMixer), intent(in) :: mix
integer, intent(in) :: sidx
integer, intent(in), optional :: hidx
real(dp), pointer, contiguous :: d1(:) !!This line is causing problems!
type(dData1D), pointer :: dD1
if ( present(hidx) ) then
dD1 => get_pointer(mix%stack(sidx),hidx)
else
dD1 => get_pointer(mix%stack(sidx), &
n_items(mix%stack(sidx)))
end if
d1 => val(dD1)
end function getstackval
我编译如下:
mpiifort -c -g -DMPI -DFC_HAVE_FLUSH -DFC_HAVE_ABORT m_mixing.F90
这里是错误:
/opt/apps/siesta/siesta-trunk-r561/Src/m_mixing.F90:2533.13:
real(dp), pointer, contiguous :: d1(:)
.............1
1 Error: Invalid character in name at (1)
好像不喜欢"pointer"关键词?
谁能给我一些提示?我是 Fortran 新手。
@francescalus 是对的。您的 ifort 版本尚不支持函数结果的完全合法 contiguous
属性。对于任何新的 Fortraner,Fortran 2008 中引入了 contiguous
属性,用于数组指针和假定形状虚拟数组。非连续数组的示例是:
foo(::2) ! odd-numbered elements
bar%re ! real part of a complex array
告诉编译器数组是连续的可以简化内存遍历和元素地址计算,从而有可能提高性能。
可以使用查询函数 is_contiguous(x)
来测试连续性,其中 x
是任何类型的数组。这个 returns 一个默认的逻辑标量
如果 x
是连续的,则值为 .true.
,否则为 .false.
。如果 x
是指针,则它必须与目标相关联。
C 语言中的数组始终是连续的,因此 Fortran 2003 中不允许 ISO_C_binding
中的 c_loc
用于数组指针或假定形状数组。在 Fortran 2008+ 中,c_loc
允许用于任何连续的目标(在执行时)。对于数组指针,contiguous
属性有一个运行时要求,即它仅与连续的 target
相关联(通过指针赋值)。
ptr => some_target
但是,程序员有责任确保指针永远不会与不连续的部分相关联;因此,必须在每次分配指针后检查 is_continuous(ptr)
。
我有一个名为 m_mixing.F90
的文件。
在这个文件中,有一个函数给出了编译错误:
function getstackval(mix,sidx,hidx) result(d1)
type(tMixer), intent(in) :: mix
integer, intent(in) :: sidx
integer, intent(in), optional :: hidx
real(dp), pointer, contiguous :: d1(:) !!This line is causing problems!
type(dData1D), pointer :: dD1
if ( present(hidx) ) then
dD1 => get_pointer(mix%stack(sidx),hidx)
else
dD1 => get_pointer(mix%stack(sidx), &
n_items(mix%stack(sidx)))
end if
d1 => val(dD1)
end function getstackval
我编译如下:
mpiifort -c -g -DMPI -DFC_HAVE_FLUSH -DFC_HAVE_ABORT m_mixing.F90
这里是错误:
/opt/apps/siesta/siesta-trunk-r561/Src/m_mixing.F90:2533.13:
real(dp), pointer, contiguous :: d1(:)
.............1
1 Error: Invalid character in name at (1)
好像不喜欢"pointer"关键词?
谁能给我一些提示?我是 Fortran 新手。
@francescalus 是对的。您的 ifort 版本尚不支持函数结果的完全合法 contiguous
属性。对于任何新的 Fortraner,Fortran 2008 中引入了 contiguous
属性,用于数组指针和假定形状虚拟数组。非连续数组的示例是:
foo(::2) ! odd-numbered elements
bar%re ! real part of a complex array
告诉编译器数组是连续的可以简化内存遍历和元素地址计算,从而有可能提高性能。
可以使用查询函数 is_contiguous(x)
来测试连续性,其中 x
是任何类型的数组。这个 returns 一个默认的逻辑标量
如果 x
是连续的,则值为 .true.
,否则为 .false.
。如果 x
是指针,则它必须与目标相关联。
C 语言中的数组始终是连续的,因此 Fortran 2003 中不允许 ISO_C_binding
中的 c_loc
用于数组指针或假定形状数组。在 Fortran 2008+ 中,c_loc
允许用于任何连续的目标(在执行时)。对于数组指针,contiguous
属性有一个运行时要求,即它仅与连续的 target
相关联(通过指针赋值)。
ptr => some_target
但是,程序员有责任确保指针永远不会与不连续的部分相关联;因此,必须在每次分配指针后检查 is_continuous(ptr)
。