我有一个名为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错误:名称中的字符无效(1)
它似乎不喜欢“指针”关键字?
有人能给我一些提示吗?我是Fortran的新手。
答案 0 :(得分:2)
@francescalus是对的。您的ifort版本尚不支持功能结果的完全合法的contiguous
属性。对于任何新的Fortraners,Fortran 2008中引入了contiguous
属性,用于数组指针和假定形状的虚拟数组。非连续数组的示例如下:
foo(::2) ! odd-numbered elements
bar%re ! real part of a complex array
告诉编译器数组是连续的,简化了内存遍历和元素地址计算,可能会提高性能。
可以使用查询函数is_contiguous(x)
测试连续性,其中x
是任何类型的数组。这将返回默认的逻辑标量
如果.true.
是连续的,则值为x
,否则为.false.
。如果x
是指针,则它必须与目标关联。
C语言中的数组总是连续的,因此Fortran 2003中c_loc
中的ISO_C_binding
不允许使用数组指针或假定形状数组。在Fortran 2008+中,c_loc
被允许用于任何连续的目标(执行时)。对于数组指针,contiguous
属性有一个运行时要求,它只与一个连续的target
相关联(通过指针赋值)。
ptr => some_target
但是,程序员有责任确保指针永远不会与非连续的部分相关联;因此,必须在每次指针赋值后检查is_continuous(ptr)
。