【问题标题】:Implicit interface in matlabmatlab中的隐式接口
【发布时间】:2012-04-13 00:57:14
【问题描述】:

似乎我不擅长 FORTRAN 或 MATLAB,但对它们都略知一二。

虽然我发现 MATLAB 擅长处理矩阵,但我还发现 fortran 程序中的隐式接口相当方便(我可以将声明的变量,尤其是一些大型数组传递给隐式函数,而无需将它们作为输入伪参数,而且我可以轻松地将接口中声明的变量传递回调用程序)。

我只是想知道 MATLAB 中是否有任何类似的机制作为隐式接口,以便我可以像使用 FORTRAN 一样完成工作。 (全局变量似乎不太好,因为如果我尝试经常调用该函数,它只会变成一项乏味的工作——也许我错了)

你有什么看法?谢谢。


这是一个例子:

PROGRAM test_function
IMPLICIT NONE
REAL :: A, B
REAL :: C,D,E

A = 1
B = 2
D = 3
E = xf(A)-A

WRITE (*,*), "A = ", A
WRITE (*,*), "B = ", B
WRITE (*,*), "C = ", C
WRITE (*,*), "D = ", D  
WRITE (*,*), "E = ", E  

CONTAINS
FUNCTION xf(x)
    IMPLICIT NONE
    REAL, INTENT(IN) :: x
    REAL :: xf
    C = x+B
    D = x+D
    xf = A+B+C
END FUNCTION xf

END PROGRAM test_function

D 被传递到函数 xf(·) 中,而不被视为虚拟参数,并且 D 也可以不受限制地传递出去。程序给出的结果如下:

 A =    1.0000000    
 B =    2.0000000    
 C =    3.0000000    
 D =    4.0000000    
 E =    5.0000000

【问题讨论】:

  • 我不清楚 Fortran 中的隐式接口是什么。从您的问题文本来看,这是否意味着变量(可能具有相同的名称)以某种方式传入和传出子例程而不作为参数传递?
  • 我很清楚 Fortran 中的隐式接口是什么。但是问题中该术语的使用使我怀疑OP以非(Fortran)标准方式使用该术语。 OP可以更明确吗?
  • @Lagrange:您能否重新编辑您的代码 sn-ps 并将它们从 cmets 中删除。现在很难弄清楚你的程序是什么。
  • 抱歉,描述不明确。我用一个例子编辑了我的帖子。希望这可以使我的问题易于理解。谢谢
  • 在我看来,他的意思是编译器生成了一个 explicit 接口,而用户不需要这样做。此外,函数 xf 继承父块(在本例中为主程序)的范围。当然,在 fortran 中,xf 只能从父块调用,其他程序单元不能访问该例程。

标签: matlab interface fortran implicit


【解决方案1】:

我想我现在开始理解你的问题了。

为了记录,Fortran 的这个特性,显然你可以将参数传递给函数而不在函数签名中引用它们,这是一个坏事。当然,它只在这里有效,因为函数定义包含在与程序本身相同的源范围内。

如果您已年满 18 岁,请继续在您的程序中做一些危险的事情。如果不是,请立即停止并正确地做事——不要将参数传递给函数参数列表之外的函数,也不要将任何东西传递到函数之外,而不是通过函数本身的结果。

您也可以在 Matlab 中执行此操作。如果您在工作区中放置一个名为“a”的变量,那么任何引用名为“a”的变量的脚本都将引用该变量。 Matlab 函数则不同,它们定义了自己的范围单位。要从 Matlab 函数中引用工作区变量,您必须将其传入或使用全局变量功能。如果您不了解 Matlab 中脚本和函数之间的区别,请点击文档。

【讨论】:

  • 感谢您的建议。我会永远铭记在心。如果我声明一个常量(参数),那么它可以安全地传递给函数,对吧?
  • 在您 18 岁之前,除了通过参数列表(包括返回参数)之外,您绝不能将参数“传入”或传出函数。 18岁以后,你可以做你喜欢做的事。作为一个成年人,我承认对诸如 pi、e、光速等不太可能改变的事物使用全局参数。
猜你喜欢
  • 1970-01-01
  • 2015-10-20
  • 1970-01-01
  • 2011-09-02
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
  • 2016-06-21
相关资源
最近更新 更多