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

Fortran模拟到C++;函数参数 在C++中,各种选项都可以将参数传递给函数(通过值、引用、指针、引用const、指向const、……)。 我想知道对于所有这些选项,Fortran模拟是什么。这种类比将从概念的角度出发,而不是从互操作性的角度出发,fortran,Fortran,据我所知,Fortran通过引用传递其参数,但有一些例外(非连续数组)。考虑到这一点,以下转换是正确的,还是可以提供更好的属性 void f(X);//传递值 这只是传递的原始值的副本 SUBROUTINE f(x) TYPE(X), VALUE :: x ... END SUBROUTINE f void f(X&X);//按参考传递 这里的x是一个值已更新的引用。由于Fortran中的“默认”是通过引用传递,因此我看到还有两个可能的选项:参数anINTENT(OUT)或IN

据我所知,Fortran通过引用传递其参数,但有一些例外(非连续数组)。考虑到这一点,以下转换是正确的,还是可以提供更好的属性

  • void f(X);//传递值

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

    SUBROUTINE f(x)
       TYPE(X), VALUE :: x
       ...
    END SUBROUTINE f
    
  • void f(X&X);//按参考传递

    这里的
    x
    是一个值已更新的引用。由于Fortran中的“默认”是通过引用传递,因此我看到还有两个可能的选项:参数an
    INTENT(OUT)
    INTENT(INOUT)

  • void f(X const&X);//通过引用传递到const

    此处
    x
    是一个值无法更新的引用

    SUBROUTINE f(x)
       TYPE(X), INTENT(IN) :: x
       ...
    END SUBROUTINE f
    
  • void f(X*p);//通过指针传递

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

    SUBROUTINE f(x)
       TYPE(X), INTENT(INOUT) :: x
       TYPE(X), POINTER :: p => x
       ...
    END SUBROUTINE f
    
  • void f(X const*p);//通过指针传递到常量

    这里的
    p
    是一个指针,指向复制过来的常量。然而,这与
    f(X*p)

  • void f(X*const p);//传递常数指针

    这里的
    p
    是一个不能更改的指针,但它指向的对象可以更改。同样地,
    p
    是一个副本,而不是参考

    SUBROUTINE f(x)
       TYPE(X), INTENT(INOUT) :: x
       TYPE(X), POINTER, PARAMETER :: p => x
       ...
    END SUBROUTINE f
    
    SUBROUTINE f(x)
       TYPE(X), INTENT(IN) :: x
       TYPE(X), POINTER, PARAMETER :: p => x
       ...
    END SUBROUTINE f
    
  • void f(X常数*常数p);//传递常数指针

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

    SUBROUTINE f(x)
       TYPE(X), INTENT(INOUT) :: x
       TYPE(X), POINTER, PARAMETER :: p => x
       ...
    END SUBROUTINE f
    
    SUBROUTINE f(x)
       TYPE(X), INTENT(IN) :: x
       TYPE(X), POINTER, PARAMETER :: p => x
       ...
    END SUBROUTINE f
    
  • void f(X*&p);//通过引用传递到指针

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

    SUBROUTINE f(p)
       TYPE(X), POINTER, INTENT([IN]OUT) :: p
       ...
    END SUBROUTINE f
    
  • void f(X const*&p);//通过引用传递到指向常量的指针

    此处
    p
    引用指向常量对象的指针。 这里似乎没有类似的情况

  • void f(X*const&p);//通过引用传递到常量指针

    这里的
    p
    是对指针的引用,指针不能更改,但它指向的对象可以更改

    SUBROUTINE f(p)
       TYPE(X), POINTER, INTENT(IN) :: p
       ...
    END SUBROUTINE f
    
  • void f(X常数*const&p);//通过引用传递到常数指针到常数

    这里的
    p
    是对指针的引用,指针不能更改,指针指向的对象也不能更改。这里有类似的吗


当你想的每一种语言时,你必须标记所有的语言,当这个问题都是关于FORTRAN的,或者最小限度地FORTRAN和C++的时候。有时候,当一个参数传递到一个函数和/或在执行后被复制时,临时数组就被创建了。后者取决于伪参数的intent属性。因此,在进行复制时,我认为它们实际上并不等同于通过引用传递,即使最终结果是相同的。非连续数组的实际参数可能确实涉及copy-in/copy-out,也可能不涉及copy-in/copy-out,但这并不太取决于是否存在intent属性或它是什么。你在评论中的最后一句话非常重要:只要观察到所需的效果,论点如何传递并不重要。复制输入/输出、按值、按引用并不仅仅由意图或其他属性决定。意图实际上并不值得关注。看看你传递的是什么类型的数组。是相邻的吗?编译器在编译时是否知道它是连续的?您传递给假定形状的参数是假定大小还是显式大小?它是指针还是可分配的或值?意图在这里是最不重要的一位。请注意,即使是
也是使用地址传递的。但它是副本的地址。