【问题标题】:Fortran pointer error: "Invalid character in name "Fortran 指针错误:“名称中的字符无效”
【发布时间】:2017-01-01 19:45:35
【问题描述】:

我有一个名为 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),指针,连续 :: d1(:)

.............1

1 错误:(1) 处名称中的字符无效

好像不喜欢“指针”这个关键词?

谁能给我一些建议?我是 Fortran 新手。

【问题讨论】:

  • 您可以尝试改用real(kind=dp),..... 吗?
  • 第 13 个字符似乎是逗号。确保逗号只是一个普通的逗号,而不是一些奇怪的类似逗号的非 ascii 字符。还要检查该区域中的其他字符。
  • 如果您删除d1 上的contiguous 属性,问题是否仍然存在?
  • 当我删除“连续”关键字时它就消失了!但是我刚刚做了什么?
  • 似乎编译器不喜欢函数结果的contiguous 属性,而且它只是没有一个很好的错误消息。您使用的是哪个版本的 ifort?

标签: fortran mpi intel-fortran


【解决方案1】:

@francescalus 是对的。您的 ifort 版本还不支持函数结果的完全合法contiguous 属性。对于任何新的 Fortraner,在 Fortran 2008 中为数组指针和假定形状的虚拟数组引入了 contiguous 属性。非连续数组的例子有:

foo(::2) ! odd-numbered elements
bar%re   ! real part of a complex array

告诉编译器数组是连续的可以简化内存遍历和元素地址计算,从而潜在地提高性能。

可以使用查询函数is_contiguous(x) 测试连续性,其中x 是任何类型的数组。这将返回一个默认的逻辑标量 如果x 是连续的,则值为.true.,否则为.false.。如果x 是一个指针,它必须与一个目标相关联。

C 语言中的数组始终是连续的,因此在 Fortran 2003 中,ISO_C_binding 中的 c_loc 不允许用于数组指针或假定形状的数组。在 Fortran 2008+ 中,c_loc 允许用于任何连续的目标(在执行时)。对于数组指针,contiguous 属性有一个运行时要求,即它只与一个连续的target 相关联(通过指针分配)。

ptr => some_target

但是,程序员有责任确保指针永远不会与不连续的部分相关联;因此,必须在每次分配指针后检查is_continuous(ptr)

【讨论】:

    猜你喜欢
    • 2020-09-16
    • 2020-02-26
    • 1970-01-01
    • 2012-06-06
    • 2017-09-16
    • 2016-08-08
    • 2014-05-14
    • 1970-01-01
    • 2017-01-11
    相关资源
    最近更新 更多