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)