Fortran指针错误:“名称中的字符无效”

时间:2016-08-25 11:36:14

标签: fortran mpi intel-fortran

我有一个名为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的新手。

1 个答案:

答案 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)