我很难理解为什么一段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中的指针。但更重要的是,一个编译器如何处理它就好了,而不是另一个呢?
答案 0 :(得分:2)
此处的问题与pointer
和not-pointer
无关。当一个指针(例如map%s
(类型的指针组件))在一个过程中被引用以与没有pointer
属性的伪参数相关联时,它就是目标该指针的em>是与虚拟相关联的参数。
你真正的问题是与论证的种有关。
组件s
虽然是指针,但默认为实数。子例程的伪参数是真实的,但是真实的R8
。对于某些处理器,默认实数具有与实数R8
相同的种类值。对于一些人来说,它还没有。您可能会遇到这两种情况 - 无论是通过编译器的设计,还是通过您使用过的标志。
对于编译器标志,通常情况下将默认实数提升为double,quadruple等,精度不会在给定显式类值的情况下更改相应类型的变量 - 即使是那些类型的值与默认的真实相同。
因此,为了使您的代码更具可移植性,请考虑将组件s
声明为real(R8)
。