我是Fortran的新手。请看下面的代码:
c main program
call foo(2)
print*, 2
stop
end
subroutine foo(x)
x = x + 1
return
end
非常感谢您的帮助。谢谢你。
该程序违反了语言规则-x
子例程中的哑元参数通过line进行了修改x = x + 1
,但它与某个表达式(简单常量)相关联。通常,不能修改由表达式产生的值。
该特定代码在语法上仍然对Fortran 2008有效。在Fortran 2008中仍然像在Fortran IV / 66中一样仍然存在编程错误。这不是编译器需要诊断的东西。有些可能带有附加调试选项,也许直到运行时才提供。
由于该程序违反了语言规则,因此在您运行该程序时可能会发生任何事情。究竟是什么取决于编译器生成的代码。编译器可能已经为表达式所产生的值预留了可修改的存储,以使它在内部看起来像一个变量(程序可能会打印三个并且程序会继续执行),而可修改的存储可能会在程序中共享给其他实例。常量2
(突然2
到处都是3的值!),常量值的存储可能会存储在不可修改的内存中(程序可能会崩溃),编译器可能会发出错误消息,程序可能会因此而烦躁不安在卧室,该程序可能会向邻国宣战-这是编程错误-发生的情况尚不确定。
从Fortran 90开始,该语言中引入了一些功能,以允许程序员编写新代码,这些新代码对于编译器检查诸如此类的错误非常实用(在某些情况下,如果编译器被视为标准错误,则要求编译器对其进行检查。符合)。
对于所示的代码,应将主程序和子例程视为单独编译的-主程序不了解子例程的详细信息,反之亦然(子例程可能在主程序之后很长时间就可以编译,在另一台机器上,两者的输出在以后的某个阶段链接在一起-没有花哨的链接时间行为或静态分析,因此无法解决此类错误。语言规则是这样的,即在编译主程序时,编译器必须仅基于引用子程序的方式隐式地假定子程序的接口的详细信息-在主程序内部,子程序具有隐式的接口。
Fortran 90引入了显式接口的概念,其中以各种方式显式告知编译器子例程的接口,然后可以检查对子例程的任何引用均与该接口一致。如果过程是模块过程,内部过程或内部过程-该接口是自动实现的,或者对于外部子程序,过程指针等,程序员可以使用接口块显式描述该接口。
另外,Fortran 90引入了intent属性-过程的伪参数的特征,然后它又是过程接口的特征。自变量的意图向编译器指示该过程是否可以定义自变量(它也可能影响默认的初始化和组件分配状态),因此,表达式是否可以是有效的实际自变量。x
在子例程中foo
通常将声明为INTENT(INOUT)。
当使用具有基本实现质量的编译器时,这些新语言功能共同为此类编程错误提供了有力的防御。如果您是从语言开始的,那么建议您将这些新功能纳入您的标准方法中-即使用隐式无,所有过程通常应为模块过程或内部过程,仅在绝对需要时才使用外部过程,始终指定伪参数意图,使用自由格式源。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句