gfortran和ifort之间的编译器差异(可分配数组和全局变量)

GPMueller

代码

下面的MWE描述了我想使用的内容(请注意,我没有设计它,我只是尝试使用某人的代码,通常不使用全局变量)。

PROGRAM MAIN
IMPLICIT NONE

  integer :: N
  real(8), allocatable :: a(:,:)

  N=3
  allocate(a(N,3))

  a=initialize_array()

  CONTAINS
    function initialize_array() result(a)
    IMPLICIT NONE
        real(8) :: a(N,3)
        a=1
    end function initialize_array  

END PROGRAM MAIN

问题

gfortran给出一个错误,该错误表示为Error: Variable 'n' cannot appear in the expression at (1),指向real(8) :: a(N,3)函数内部。在子例程中它将起作用,那么这里可能是什么问题?

问题

为什么ifort(v。15.0.3)会编译它,而gfortran(v。4.8.4)却不能编译?

法国

正如其他人所评论的那样,很难说是否明确允许某些内容:该语言主要基于规则和限制条件。

因此,我不会证明代码不是错误的(并且不允许gfortran拒绝它),但是让我们看看发生了什么。

首先,我将反对高性能标记给出的一件事,因为这有点相关:

要声明尺寸取决于变量值(例如)的数组a(N,3),要求在编译时知道(或至少知道)变量的值。

显式形状数组的边界不一定总是由常量表达式给出(我们将其宽松地定义为“在编译时已知/已知”):在某些情况下,显式形状数组可以具有变量给定的边界。这些被称为自动对象(以及规范表达式所给定的界限)。

函数结果就是这样一个允许自动对象的地方。在问题的示例中用于函数结果的声明,与N主机关联并形成规范表达式。

a让我们看看gfortran如何响应程序的少量修改,而不是用所有其他约束来查看是否允许true声明

首先,是gfortran对象所针对的问题代码的精简版。

  integer n
contains
  function f() result(g)
     real g(n)
  end function f
end program

对于函数的结果f有名字g调用函数结果并不重要,那么调用它会发生什么f呢?

  integer n
contains
  function f()
     real f(n)
  end function f
end program

这对我来说很愉快。

如果我们将第一个块放入框架而不是主程序中怎么办?

module mod
  integer n
contains
  function f() result(g)
     real g(n)
  end function f
end module

那也可以编译。

自然的结论是:即使gfortran正确(我们错过了一些隐蔽的约束)拒绝第一个代码,也不拒绝其他代码还是非常不一致的,或者约束确实很奇怪。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在不同编译器(PGI和Intel)之间传递包含可分配数组的fortran派生类型

来自分类Dev

可分配数组值函数。gfortran与ifort

来自分类Dev

可分配数组值函数。gfortran与ifort

来自分类Dev

fortran 77和gfortran中的可分配数组

来自分类Dev

传递指向子例程的指针,xlf和ifort编译器之间的编译差异

来自分类Dev

数组和全局变量

来自分类Dev

用外部全局变量C分配数组大小

来自分类Dev

现有的OpenACC编译器是否支持包含可分配数组的派生类型?

来自分类Dev

现有的OpenACC编译器是否支持包含可分配数组的派生类型?

来自分类Dev

VS Ultimate和Express编译器之间的差异

来自分类Dev

运行和控制器angularjs之间的全局变量

来自分类Dev

运行和控制器angularjs之间的全局变量

来自分类Dev

常量和全局变量之间的区别

来自分类Dev

为什么C和C ++编译器将显式初始化和默认初始化的全局变量放在不同的段中?

来自分类Dev

Eclipse编译器和Javac之间的差异-枚举,接口和泛型

来自分类Dev

用move_alloc和源分配扩展可分配数组

来自分类Dev

外部变量和全局变量之间的区别?

来自分类Dev

静态变量和全局变量之间的区别

来自分类Dev

编译器宏以测试uint64_t和unsigned long long int之间的差异

来自分类常见问题

使用Intel编译器的Windows和Linux之间的性能差异:查看程序集

来自分类Dev

编译器差异:别名解析和名称查找之间的相互作用

来自分类Dev

编译器宏以测试uint64_t和unsigned long long int之间的差异

来自分类Dev

全局变量和重新分配以及内存泄漏

来自分类Dev

共享可分配数组

来自分类Dev

窗口属性和全局变量之间的区别

来自分类Dev

文件之间的 Python 命名空间和全局变量

来自分类Dev

MPI和全局变量

来自分类Dev

全局变量和innerHTML

来自分类Dev

使用 gfortran 编译器在 Fortran 代码中意外重新分配整数变量

Related 相关文章

  1. 1

    在不同编译器(PGI和Intel)之间传递包含可分配数组的fortran派生类型

  2. 2

    可分配数组值函数。gfortran与ifort

  3. 3

    可分配数组值函数。gfortran与ifort

  4. 4

    fortran 77和gfortran中的可分配数组

  5. 5

    传递指向子例程的指针,xlf和ifort编译器之间的编译差异

  6. 6

    数组和全局变量

  7. 7

    用外部全局变量C分配数组大小

  8. 8

    现有的OpenACC编译器是否支持包含可分配数组的派生类型?

  9. 9

    现有的OpenACC编译器是否支持包含可分配数组的派生类型?

  10. 10

    VS Ultimate和Express编译器之间的差异

  11. 11

    运行和控制器angularjs之间的全局变量

  12. 12

    运行和控制器angularjs之间的全局变量

  13. 13

    常量和全局变量之间的区别

  14. 14

    为什么C和C ++编译器将显式初始化和默认初始化的全局变量放在不同的段中?

  15. 15

    Eclipse编译器和Javac之间的差异-枚举,接口和泛型

  16. 16

    用move_alloc和源分配扩展可分配数组

  17. 17

    外部变量和全局变量之间的区别?

  18. 18

    静态变量和全局变量之间的区别

  19. 19

    编译器宏以测试uint64_t和unsigned long long int之间的差异

  20. 20

    使用Intel编译器的Windows和Linux之间的性能差异:查看程序集

  21. 21

    编译器差异:别名解析和名称查找之间的相互作用

  22. 22

    编译器宏以测试uint64_t和unsigned long long int之间的差异

  23. 23

    全局变量和重新分配以及内存泄漏

  24. 24

    共享可分配数组

  25. 25

    窗口属性和全局变量之间的区别

  26. 26

    文件之间的 Python 命名空间和全局变量

  27. 27

    MPI和全局变量

  28. 28

    全局变量和innerHTML

  29. 29

    使用 gfortran 编译器在 Fortran 代码中意外重新分配整数变量

热门标签

归档