【问题标题】:Common block usage in FortranFortran 中的常见块用法
【发布时间】:2010-06-14 22:39:40
【问题描述】:

我是 Fortran 新手,只是在做一些简单的工作。作为一个新程序员,一般来说,不确定这是如何工作的,如果我的解释或符号不是最好的,请原谅。在 .F 文件的顶部有常见的声明。向我解释它的人说把它想象成 C 中的结构,并且它们是全局的。同样在同一个 .F 文件中,他们用什么类型声明了它。所以它是这样的:

COMMON SOMEVAR

INTEGER*2 SOMEVAR

然后当我实际看到它在其他文件中使用时,他们声明局部变量(例如 SOMEVAR_LOCAL)并根据条件设置 SOMEVAR_LOCAL = 1 或 0。

接下来还有一个条件语句会说类似

IF (SOMEVAR_LOCAL. eq. 1) 
SOMEVAR(PARAM) = 1;

(如果这不是正确的 Fortran,我再次道歉,但我现在无法访问代码)。所以在我看来,有一个类似“结构”的变量,叫做 SOMEVAR,它有一定的长度(2 个字节的数据?),然后有一个局部变量用作标志,这样以后就可以使用全局变量了struct SOMEVAR 可以设置为该值。但是因为有(PARAM),它就像那个特定实例的数组?谢谢。抱歉我的解释不好,但希望您能理解我的要求。

【问题讨论】:

    标签: fortran fortran-common-block


    【解决方案1】:

    只是为了放大@MSB 已经提到的内容:COMMON 块告诉编译器如何在内存中放置变量。几乎没有理由将它们用于现代 Fortran,即任何可以处理 Fortran 90 或更高版本的编译器,并且有充分的理由避免使用它们。

    还要补充一点:在现代 Fortran 中,您可以做 C 结构对用户定义类型所做的大致相同的事情。检查您的文档中的 TYPE。

    【讨论】:

    • 我完全同意。对于全局变量,对于新的 Fortran 程序,最好使用模块变量而不是公共块。某些变量不能放在公共块中,序列关联是陈旧的。 TYPE 是一种比普通变量更好的组织变量方法,并且更接近 C 结构。
    【解决方案2】:

    第一个声明将 SOMEVAR 作为两个字节的标量整数。您展示的用法 SOMEVAR 有一个数组——基于它被索引。这可以通过“序列关联”在 Fortran 中完成,但这是不好的做法。在一个文件中,您可以将 SOMEVAR 声明为 INTEGER*2 并将两个字节分配给该标量。在另一个文件中,您可以将其声明为 INTEGER*1 SOMEVAR(2),并保留两个字节,这次是为两个元素组成的数组,每个元素一个字节。在两个文件中使用相同的公共块会导致这两个变量逐字节重叠——序列关联。许多年前,当内存非常小时,程序员这样做是为了减少内存使用,因为他们知道不同的子程序在不同的时间使用变量。今天这样做的原因非常非常有限。大多数情况下不应该这样做,因为它很容易混淆。

    您还可以使用 EQUIVALENCE 语句设置序列关联。再次,最好避免。 TRANSFER 函数取代了人们必须做需要 EQUIVALENCE 语句的“棘手”事情的时代。

    【讨论】:

      猜你喜欢
      • 2013-06-27
      • 1970-01-01
      • 1970-01-01
      • 2012-12-28
      • 2012-04-19
      • 2015-11-19
      • 1970-01-01
      • 2013-08-26
      • 1970-01-01
      相关资源
      最近更新 更多