Fortran:如何在公共块中传递函数名称
在 Fortran 中,是否可以将函数放在公共块中,如下所示: 常见 /myblock/ 函数 (其中 x 是某个变量,func 是一个函数)。
我的问题是我想创建一个函数 s(x) 来调用外部函数 func(x) 但不传递 func 到 s(x) 中。对于我的项目, s(x) 必须是只有一个变量的函数,即我不想这样做: 函数 s(x,func) s=func(x)
相反,我希望我可以这样做: 函数 s(x) 通用 /myblock/ 函数 s=func(x)
或者,如果有人有其他使用模块或其他东西的建议,这会很棒。
预先感谢您的任何帮助。
o。
然后在调用 s(x) 的子例程中具有相同的公共 (myblock)。
In Fortran, is it possible to put a function in a common block as in:
COMMON /myblock/ func
(where x is some variable and func is a function).
My problem is that I would like to create a function s(x) that calls an external function func(x) but without passing func in s(x). For my project, s(x) has to be a function of only one variable, i.e., I do not want to do:
function s(x,func)
s=func(x)
Instead, I am hoping I could do:
function s(x)
common /myblock/ func
s=func(x)
Or, if someone has some other suggestion using modules or something, this will be great.
Thanks in advance for any help.
o.
and then have the same common (myblock) in the subroutine that calls s(x).
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
我认为这不可能以任何便携式方式实现。某些实现可能允许您使用一些技巧来做到这一点。
I don't believe that this is possible in any portable way. Some implementations may allow you to use some tricks to do it.
现代的方法是使用指向函数的指针。该指针可以作为参数传递,或者为了这个问题的设计,可以将其放入模块中。例如,请参阅Fortran 中的函数指针数组
The modern way to do this is with a pointer to a function. The pointer could be passed as an argument or, for the design of this question, placed into a module. See, for example, Function pointer arrays in Fortran
我认为你不应该为此使用公共块,而应该使用模块。将函数
func
放入名为myfunctions
的模块中,然后在需要时插入use myfunctions
语句,仅此而已。I think you are not supposed to use common blocks for this, but modules. Put your function
func
in a module calledmyfunctions
and then when needed insert atuse myfunctions
statement and thats it.现代 Fortran 标准禁止这样做。从 Fortran 2003 的 5.5.2 开始:
公共块对象不应是...函数名称、条目名称...
并且无论如何,使用全局变量来传递非常量数据只是一个可怕的,糟糕的主意。正如 ja72 指出的,您可以使用模块来做到这一点,但我拒绝用示例代码来演示它。
Modern fortran standards prohibit this. From 5.5.2 of Fortran 2003:
A common-block-object shall not be ... a function name, an entry name...
And at any rate, using global variables to pass around non-constant data is just a terrible, terrible idea. As ja72 points out, you could do this with modules, but I refuse to demonstrate it with sample code.