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

时间:2016-01-06 22:59:56

标签: fortran fortran90 intel-fortran

我很难理解为什么一段Fortran代码在没有IBM编译器问题的情况下编译,但会在intel编译器上引发编译时错误。这段不是我编写的更大代码的一部分,但编写此代码的人主要使用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

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

1 个答案:

答案 0 :(得分:2)

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

你真正的问题是与论证的有关。

组件s虽然是指针,但默认为实数。子例程的伪参数是真实的,但是真实的R8。对于某些处理器,默认实数具有与实数R8相同的种类值。对于一些人来说,它还没有。您可能会遇到这两种情况 - 无论是通过编译器的设计,还是通过您使用过的标志。

对于编译器标志,通常情况下将默认实数提升为double,quadruple等,精度不会在给定显式类值的情况下更改相应类型的变量 - 即使是那些类型的值与默认的真实相同。

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