Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics Fortran通用接口包含伪参数为无限多态指针的过程的警告_Generics_Fortran_Polymorphism - Fatal编程技术网

Generics Fortran通用接口包含伪参数为无限多态指针的过程的警告

Generics Fortran通用接口包含伪参数为无限多态指针的过程的警告,generics,fortran,polymorphism,Generics,Fortran,Polymorphism,我编写了一个包含三个模块过程的通用接口 module MTest implicit none interface Mesh module procedure :: MeshG,MeshR,Meshc end interface Mesh contains logical function MeshR(IVal) real(4),intent(in) :: IVal MeshR=.true. end function MeshR

我编写了一个包含三个模块过程的通用接口

module MTest
  implicit none
  interface Mesh
    module procedure :: MeshG,MeshR,Meshc
  end interface Mesh
  contains
    logical function MeshR(IVal)
      real(4),intent(in) :: IVal
      MeshR=.true.
    end function MeshR

    logical function MeshC(IVal)
      complex(4),intent(in) :: IVal
      MeshC=.true.
    end function MeshC

    logical function MeshG(IVal)
      class(*),pointer,intent(in) :: IVal
      MeshG=.false.
    end function MeshG
end module MTest

program main
  use MTest
  implicit none
  real(4) :: a
  write(*,*) Mesh(a)
end program main
当我用ifort编译它时,编译器给了我两个警告:

Test.f90(8):警告#6738:此特定过程的类型/等级/关键字签名与共享相同泛型名称的另一个特定过程匹配。[MESHR]

logical function MeshR(IVal)
---------------------^

Test.f90(13):警告#6738:此特定过程的类型/等级/关键字签名与共享相同泛型名称的另一个特定过程匹配。[MESHC]

logical function MeshC(IVal)
---------------------^

由于我们无法在函数或过程调用中将具体类型的数据(如实数或复数)传递给无限的polomorhpic指针,因此我不太明白编译器为什么给我这样的警告。然而,这些警告似乎不会在我的简单测试程序中引起任何问题。那么,有人能向我解释一下这些警告是怎么回事吗?在某些情况下,它们会导致严重的问题吗?非常感谢。

(由于我忘记了F2008 12.5.2.5p2中的限制,因此对以下内容进行了材料编辑。)

<> P>一个关于泛型引用的适当的特定过程的选择规则不考虑指针和可分配的哑参数的当前限制,这些声明需要声明类型中的匹配。p>

在FORTRAN 2003中,规则甚至不考虑哑参数的可分配或指针性质。F2003中的具体过程选择基于实际参数的数量、名称和类型+种类+等级

因此,从特定过程选择的角度来看——由于无限多态对象与任何对象类型兼容,因此在确定应选择哪个特定过程作为参考时存在歧义,其中实际参数为实(4)或复杂(4)

当接口被扩展时(即当接口被声明时),编译器需要诊断这种模糊性,即使您的接口的实际使用并不模糊


(需要意图的规则(中)要在多态参数的声明类型中匹配的指针或可分配参数的限制性也比它们需要的更大。如果它们在将来的修订版中被放宽,则肯定有可能出现不明确的引用。伪参数消歧的限制性比其他要求的限制性更大,这会导致向后的可能性兼容的语言将在将来更改。)

根据f2003标准:

非多形实体仅与声明类型相同的实体类型兼容。非无限多态实体的多态实体与相同声明类型的实体或其任何扩展的类型兼容即使不受限制的多态实体不被视为具有声明的类型,但它与所有实体的类型兼容。如果一个实体与某一类型的实体类型兼容,则该实体被称为与该类型的实体类型兼容

因此无法解析接口(gfortran在该点返回错误)。所以一个无限多态可以有任何类型,包括real

在下面的代码中,您可以看到一个示例,其中
类(*),指针
变量具有实型

module mod1
  implicit none
contains
    function fun1(x)
      real,target       :: x
      class(*), pointer ::fun1
      fun1 => x
    end function

    function fun2(IVal)
      class(*),pointer,intent(in) :: IVal
      logical fun2
       fun2=.false.
      select type(IVal)
         type is (real)
            print*, 'type is real'
            fun2 = .true.
      end select
    end function fun2
end module mod1

program main
  use mod1
  implicit none
  real     :: a
  write(*,*) fun2(fun1(a))
end program main
返回:

 type is real
 T

有一件事我不明白,“即使一个无限多态实体不被认为具有声明的类型,它的类型与所有实体都兼容”,但是,我们仍然不能传递,例如,一个实变量或一个指向无限多态伪参数的实指针。如果我们使用“write(,)fun2(a)”而不是“write(,)fun2(fun1(a))”,甚至将“a”声明为实指针,编译器仍将给出错误消息。除意图规范外,该限制用于阻止被调用过程更改指针指向的对象的类型(这可能与实际参数的类型不一致)。如果伪参数不是指针,则可以将实变量或复变量传递给类(*)伪。