Fortran类似于C ++函数参数

时间:2017-11-09 15:33:37

标签: fortran

在C ++中,各种选项都可以将参数传递给函数(通过值传递,引用,指针,对const的引用,指向const的指针,......)。 我想知道Fortran模拟对于所有这些选项会是什么。这种类比从概念的角度来看,而不是互操作性的观点。

据我所知,Fortran通过引用传递其参数,但此规则有一些例外(非连续数组)。考虑到这一点,以下转换是否正确,或者是否有更好的属性可以给出?

  • void f(X x); // Pass by value

    这只是传递的原始值的副本

    SUBROUTINE f(x)
       TYPE(X), VALUE :: x
       ...
    END SUBROUTINE f
    
  • void f(X &x); // Pass by reference

    此处x是其值已更新的引用。由于引用传递是Fortran中的“默认”,我看到剩下两种可能的选项:参数INTENT(OUT)INTENT(INOUT)

    SUBROUTINE f(x)
       TYPE(X), INTENT([IN]OUT) :: x
       ...
    END SUBROUTINE f
    
  • void f(X const &x); // Pass by reference-to-const

    此处x是无法更新其值的参考。

    SUBROUTINE f(x)
       TYPE(X), INTENT(IN) :: x
       ...
    END SUBROUTINE f
    
  • void f(X *p); // Pass by pointer

    这只是传递指针的副本。但是,这意味着应该合并属性POINTERVALUE,但Fortran中不允许这样做。我能想象的唯一选择是

    SUBROUTINE f(x)
       TYPE(X), INTENT(INOUT) :: x
       TYPE(X), POINTER :: p => x
       ...
    END SUBROUTINE f
    
  • void f(X const *p); // Pass by pointer-to-const

    这里p是指向复制的const的指针。但是,这与f(X *p)

    的问题相同
    SUBROUTINE f(x)
       TYPE(X), INTENT(IN) :: x
       TYPE(X), POINTER :: p => x
       ...
    END SUBROUTINE f
    
  • void f(X * const p); // Pass by const-pointer

    此处p是一个无法更改的指针,但它指向的对象可以。同样p是副本而不是参考

    SUBROUTINE f(x)
       TYPE(X), INTENT(INOUT) :: x
       TYPE(X), POINTER, PARAMETER :: p => x
       ...
    END SUBROUTINE f
    
  • void f(X const * const p); // Pass by const-pointer

    这里p是一个无法改变的指针,它指向的对象也不能改变。同样p是副本而不是参考

    SUBROUTINE f(x)
       TYPE(X), INTENT(IN) :: x
       TYPE(X), POINTER, PARAMETER :: p => x
       ...
    END SUBROUTINE f
    
  • void f(X * & p); // Pass by reference-to-pointer

    这是对指针的引用,p及其指向的对象都可以更改。

    SUBROUTINE f(p)
       TYPE(X), POINTER, INTENT([IN]OUT) :: p
       ...
    END SUBROUTINE f
    
  • void f(X const * & p); // Pass by reference-to-pointer-to-const

    这里p引用了一个指向常量对象的指针。 这里似乎没有类似的东西。

  • void f(X * const & p); // Pass by reference-to-const-pointer

    此处p是对指针的引用,指针无法更改,但指向的对象可以。

    SUBROUTINE f(p)
       TYPE(X), POINTER, INTENT(IN) :: p
       ...
    END SUBROUTINE f
    
  • void f(X const * const & p); // Pass by reference-to-const-pointer-to-const

    这里p是对无法改变的指针的引用,它指向的对象也不能改变。这里有类似的吗?

0 个答案:

没有答案