gpt4 book ai didi

fortran - 将指针传递给子例程,xlf 和 ifort 编译器之间的编译差异

转载 作者:行者123 更新时间:2023-12-02 01:30:20 25 4
gpt4 key购买 nike

我很难理解为什么一段 Fortran 代码在 IBM 编译器上编译没有问题,但在英特尔编译器上却引发编译时错误。这个片段是一个更大的代码的一部分,不是我写的,但是写这个的人主要使用 IBM 机器。

以下函数调用引发错误:

call mapsort_qsortRC(map%s(n:m),map%row(n:m),map%col(n:m))

其中 map 类型是自定义数据类型,有很多字段,但相关字段声明为:

 real   ,pointer :: s  (:)      ! the non-zero matrix elements
integer,pointer :: row(:) ! matrix row corresponding to each element
integer,pointer :: col(:) ! matrix col corresponding to each element

子程序mapsort_qsortRC声明为

recursive SUBROUTINE mapsort_qsortRC(S,row,col)

implicit none

!--- arguments ---
real (R8) :: S(:)
integer(IN) :: row(:),col(:)

精度类型R8定义为

integer,parameter :: R8 = selected_real_kind(12) ! 8 byte real

英特尔编译器引发错误“实际参数的类型与伪参数的类型不同”。关于 map 数据类型的变量 S。我可以看到我们正在将 real, pointer 传递给需要 real 的参数,但我不熟悉 fortran 中的指针。但更重要的是,一个编译器如何处理得很好,而另一个编译器却不行?

最佳答案

这里的问题与pointernot-pointer 无关。当一个指针,例如 map%s(类型的指针组件)在过程中被引用以与没有 pointer 属性的虚拟参数相关联时,它是那个指针的目标,它是与虚拟对象关联的参数。

您真正的问题是与论证的种类有关。

组件s,虽然是一个指针,但默认是真实的。子例程的伪参数是一个实数,但属于 R8 类型的实数。对于某些处理器,默认实数与种类 R8 的实数具有相同的种类值。对于一些它没有。您被困在这两种情况之间 - 要么是通过编译器的设计,要么是通过您使用的标志。

对于编译器标志,通常情况是将默认实数提升为双倍、四倍等,精度不会更改给定明确种类值的那些变量的相应种类 - 即使这些种类值与默认实数。

因此,为了使您的代码更具可移植性,请考虑将组件 s 声明为 real(R8)

关于fortran - 将指针传递给子例程,xlf 和 ifort 编译器之间的编译差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34644496/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com