我们还需要子程序吗?

Ste*_*ini 6 fortran fortran95

在Fortran中,函数和子例程之间存在明显的区别:函数返回一个值,子例程不返回任何值.这引入了两者之间的一系列差异.一个例子是调用语义:你可以像在其他语言中一样调用函数,但是为了调用子例程,你必须首先发出一个call语句.

通过在Fortran95中添加指针和数据类型,似乎没有任何技术限制可以使任何子程序成为一个函数,并保留子程序仅用于遗留.函数可以返回零(您只返回一个虚拟整数),一个或多个值(例如,您可以返回指向类型的已分配实例的指针,如C++ STL对).

我错了吗?由于子程序具有的功能和功能没有,我们是否还需要Fortran编程中的子程序?

jan*_*neb 18

如果搜索comp.lang.fortran存档,您将找到有关函数语义的讨论.IIRC事实证明,标准中没有明确规定具有副作用的功能是什么和不允许的功能.

例如,编译器可以优化

x = foo(args)+ foo(args)

x = 2*foo(args)

或者换个例子,考虑一下

x = y + foo(y)

如果foo()改变了y的值怎么办?请记住,Fortran没有序列点的C概念.

一般来说,几位专家的建议只有在纯函数时才使用函数,否则使用子程序.而且,这也是我跟随自己的建议.


duf*_*ymo 5

我不认为子程序会去任何地方.大多数其他语言允许使用和不返回值的方法.我看不出有什么理由说这是件坏事.不应该动摇任何人改变一件事.

Legacy一个人说,只要Fortran这样做,子程序就会持续存在.只要Fortran存在,编写一个执行操作并且不返回任何内容的方法就没有错.

更新:

你为什么说"麻烦"?有什么大不了的?我不同意子程序在适当的情况下使用时"麻烦"的想法.

自版本77以及可能更早版本以来,Fortran一直在区分函数和子例程.其他C系列语言也可以.为什么这突然间这么麻烦?即使是长时间使用指针和对象的语言也有返回void的方法.

  • @Stefano Borini:没有人试图强迫你使用你不喜欢的Fortran功能.就个人而言,我怀疑我不是唯一有这种想法的Fortran程序员,我发现指针更多的是麻烦而不是改变价值的函数 - 被称为子程序. (2认同)
  • @Stefano - 最好停止用所有这些“无用”语言编写代码。我可以在 Java、C、C++ 或 C# 中调用返回 void 的方法。我不觉得它没用。我已投票决定结束此活动。这不是一个真正的问题,主观且有争议的。 (2认同)