整数变量在 forall 构造后不再可用

Posted

技术标签:

【中文标题】整数变量在 forall 构造后不再可用【英文标题】:Integer variable no longer usable after forall construct 【发布时间】:2012-05-09 09:20:28 【问题描述】:

我有一个整数变量,它在我的子程序的开头声明。在我将它用作forall 构造中的控制变量后,我不能再将它用作do 循环的控制变量。编译器(Intel,v. 12.0.3)抱怨

xyz.f90(1210): error #6404: This name does not have a type, and must have an explicit type.   [I]
            do i=1,sp_basis%num_dim
---------------^
xyz.f90(1210): error #6063: An INTEGER or REAL data type is required in this context.   [I]
        do i=1,sp_basis%num_dim

我试图写一个小例子来复制这种行为(并使用与实际有问题的相同的编译器选项编译文件,除了-c),但是这个编译和工作得很好,所以下面是我的(稍微缩短)有问题的代码(implicit none 适用于该代码所属的整个模块):

subroutine xyz(stuff)

   use data, only: ppm, npeaks

   ! some declarations
   integer :: i ! ...

   associate(sp_basis => public_spectra%basis(counter))

      spots = npeaks * np

      allocate(ref_curves(spots,npeaks,sp_basis%num_dim), stat=stat)
      if (stat.ne.0) then
         ! ...
      end if

      forall (i=1:max_dim) uppers(i) = ubound(sp_int%int,i)
      forall (i=1:max_dim) lowers(i) = lbound(sp_int%int,i)
      forall (i=1:npeaks,j=1:sp_basis%num_dim) peak_pos_hertz(j,i) = ppm_to_hertz(ppm(permutation(j),i), sp_axes(j))

      do peak_considered=1,npeaks
         do pos=(peak_considered-1)*np+1,peak_considered*np
            do i=1,sp_basis%num_dim   ! <-- COMPLAINT

如果我将 i 更改为未用作 forall 构造的控制变量的名称,一切正常。另外,这是我第二次遇到这个问题了。

这就是编译完成的方式(xyz.f90 是构成整个程序的众多文件之一):

ifort -c -g -C -check noarg_temp_created -traceback -warn -warn nodeclarations -nogen-interface xyz.f90

你们中有人知道问题可能是什么吗?

非常感谢您的宝贵时间!

【问题讨论】:

我刚刚尝试用一个简单的测试程序重现您看到的问题,但不能。从阅读 Metcalf et alFortran 95/2003 解释 看来,您正在尝试做的事情是完全有效的。您可以尝试发布一个自包含的最小示例程序来重现该问题吗? 您是否尝试在英特尔支持论坛中提出这个问题?据我所知,它们很有帮助,即使通常不是首先想到的,它也可能只是编译器中的一个错误。 对我来说,这看起来像是一个编译器“问题”。如果您为英特尔编译器付费,请使用他们的技术支持,这非常好。如果没有,请按照 @eriktous 的建议进行操作。 @Chris 我尝试构建一个最小的示例,但到目前为止我还没有想出一个给我同样错误的示例。 @eriktous 我还没有尝试过,但这似乎是一个不错的建议。我会在那里发布我的问题。谢谢! 【参考方案1】:

对于所有感兴趣的人,这是英特尔编译器中的一个错误。 Here 你可以阅读更多关于它的信息。此外,听起来这个错误将在 2012 年某个时间发布的编译器版本中得到修复。

【讨论】:

以上是关于整数变量在 forall 构造后不再可用的主要内容,如果未能解决你的问题,请参考以下文章

Fortran 95 构造(例如 WHERE、FORALL 和 SPREAD)通常会导致更快的并行代码吗?

[CF1166E] The LCMs Must be Large - 构造

c++没有合适的默认构造函数可用

给成员变量赋值的两种方法

Fortran forall 限制

题解 CF1375E Inversion SwapSort(构造)