FORTRAN 中等价的目的是什么?

问题描述 投票:0回答:2

我是一名电气工程师,非常熟悉 C、C++、C#、Python 和 MATLAB。我还用 ARM 汇编语言完成了有限的编码。我现在正在尝试理解 50 多年前编写的一些 Fortran 代码,以便将其转换为 MATLAB。

我正在阅读这段代码,我看到了 EQUIVALENCE 关键字。我不明白它的目的。我读到的内容表明关键字将两个变量的内存位置关联起来。因此,您可以声明一个 int 和一个 char,并通过 EQUIVALENCE 语句使它们存储在同一内存位置。

我不明白的是你为什么要这样做。这样做的目的是什么,为什么不一直使用一个变量而不是使用两个不同的变量来表示同一事物?

这对您编写代码有何帮助?

我相信我使用的 Fortran 版本是 Fortran IV,具有固定宽度语法,如打孔卡上所示。

      DIMENSION VAR1(6)
      EQUIVALENCE (TEMP1,VAR1(1)),(TEMP2,VAR1(2))
fortran
2个回答
3
投票

在用当前流行的语言查看代码一天后,我感觉自己老了。 Fortran 很旧。

Fortran 的历史与我们现在所说的计算机一样古老。对于我们这些相对年轻的人来说,现代计算机和编程对于 Fortran 先驱来说是完全无法识别的。

即使在这个网站上,您也可以看到很多有关等效性及其使用原因的问题。您会看到许多不同的问题和答案,因为它意味着一件事,但可以用来(用现代术语滥用)做很多事情。

50 年前的 Fortran 并没有很多工具,而那些工具却做了很多工作。哎呀,50 年前 Fortran 甚至没有字符数据类型,而

GO TO
是流量控制的首选。

正如问题所指出的,等价是指让两个事物共享内存的相同部分:存储关联。

存储关联有什么用?多种用途。

例如,知道您有两个变量或工作区,但不打算同时使用它们?不想和他们浪费记忆?使用相同的内存。

想玩弄数据表示技巧吗?使用相同的内存块并将其称为两个东西。

想要将大量模型参数传递给子程序?使用巨大的参数列表

function pmodel(x, y, z, p, t, dt)
pmodel = x+y+sqrt(z)*p*t/dt
end function

或者传递一个数组并且有一些不可读的东西

function pmodel(pars)
pmodel = pars(1)+pars(2)+sqrt(pars(3))*pars(4)*pars(5)/pars(6)
end function

或者使用共同的数组并使其等价

function pmodel()
common pars
equivalence (pars(1), x), (pars(2), y) ... ! Like our question here
pmodel = x+y+sqrt(z)*p*t/dt
end function

我们现在生活在不同的、更加幸福的时代。有了数据结构、更多的关联、廉价的内存以及对我们程序员同胞的关心。


因此,您可以声明一个 int 和一个 char,并通过 EQUIVALENCE 语句使它们存储的内存位置相同。

然而,事实并非如此。例如,虽然整数和实数、双精度和复数可以等价,但字符不允许与那些非字符事物等价。 (这并不意味着人们不这样做,也不意味着编译器阻止他们尝试,但 Fortran 77 及以后版本严格规定你不能。)


0
投票

现代版本的 Fortran 中尚未完全超越的一个重要用例是根据需要重塑数组

real a(32,32)
real b(1024)
equivalence (a,b)

允许寻址与一维或二维数组相同的数据,没有任何额外的恶作剧(并且没有内存重复)。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.