代码之家  ›  专栏  ›  技术社区  ›  Stefano Borini

我们还需要子程序吗?[关闭]

  •  5
  • Stefano Borini  · 技术社区  · 15 年前

    call

    在Fortran95中添加指针和数据类型后,似乎在使任何子程序成为函数和保留子例程仅用于遗留程序方面没有技术限制。函数可以返回零(只返回一个哑整数)、一个或多个值(例如,您可以返回一个指针到一个类型的分配实例,比如C++ STL对)。

    我错了吗?在Fortran程序设计中,是否仍然需要子例程,因为子例程具有某些特性,而函数不具有这些特性?

    5 回复  |  直到 15 年前
        1
  •  17
  •   janneb    15 年前

    如果您搜索comp.lang.fortran档案,您会发现有关函数语义的讨论。IIRC结果是,标准中没有明确规定哪些是有副作用的函数,哪些是不允许的。

    例如,编译器是否可以优化

    x=foo(args)+foo(args)

    x=2*foo(参数)

    或者再举一个例子,考虑一下

    一般来说,一些专家的建议是只在纯函数的情况下使用函数,否则使用子例程。而且,这也是我自己的建议。

        2
  •  5
  •   duffymo    15 年前

    我不认为子程序会去任何地方。大多数其他语言允许方法返回值或不返回值。我看不出为什么这是件坏事。任何人都不应该改变任何事情。

    单是Legacy就说,子例程将像Fortran一样持久。只要有Fortran,编写一个执行操作且不返回任何内容的方法就没有问题。

    更新:

    你为什么说“麻烦”?有什么大不了的?我不同意在适当的情况下使用子例程是一个“麻烦”的观点。

        3
  •  1
  •   Rook    15 年前

    你又在用fortran编写C程序,是吗?;-)

    在我看来,是的,我们是。因为如果仅仅是因为一个原因的话——它们更容易理解,而且比函数更广泛地使用。

        4
  •  0
  •   Wildcat    15 年前

    如果我理解正确的话,Stefano并不反对子程序的想法。反对他们的意见是无稽之谈。他反对对子程序/函数使用不同的样式。

    Fortran是命令式编程语言。更确切地说,它是一种过程式编程语言(更确切地说,它是结构化编程语言)。

    该语言可能只有一种声明过程的样式。我同意你的看法,斯特凡诺。

        5
  •  -2
  •   Stefano Borini    15 年前

    我必须回答自己这个问题的事实是疯狂的,但事实就是这样。

    这种差异源于这样一个事实,即在Fortran中不能“像在其他语言中一样调用函数”。在C语言中,你可以调用一个整数函数而不需要赋值,例如

    int foo() {
        return 5;
    }
    int main() {
        foo(); // this works
    }
    

    module test
       implicit none
    
    contains
       integer function foo()
          print *, "hello"
          foo = 0
       end function
    
    end module
    
    program hello
       use test
       integer :: x
    
       x = foo() ! this works
       foo() ! this does not compile
    
    end program hello
    

    这意味着通过返回一个伪整数来“模拟”一个void函数仍然不允许在没有接收器变量的情况下调用。

    在Fortran中 void 返回类型不存在。从技术上讲,您可以用所有函数构造程序,替换 call 声明 x = 如上面所示,但这不会使您的语法与C或其他语言相似,因为在C或其他语言中,void返回函数和非void返回函数之间没有区别。子例程是唯一允许“返回void”的实体,但是执行调用的语义完全不同。除此之外,两者没有区别。

    推荐文章