问题标签 [fortran-common-block]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2079 浏览

fortran - gfortran 中的常见块错误(字节填充)

我正在尝试编写一个 fortran 代码,但是当我尝试将数据从子程序中的一个变量传递到另一个变量时,错误是:common /c/kf,eff,q
1 Warning: Padding of 4 bytes required before 'q ' 在 (1) 处的常见 'c' 中;重新排序元素或使用 -fno-align-commons。

从子程序输入到计算的 q 值没有被传递。如果子程序输入时q的值为5e-3,则子程序计算时q的值为3.57e-315

请帮助

查看代码

0 投票
1 回答
244 浏览

pointers - 如何在 Fortran 中的下一个内存地址分配/获取变量的值

我有两组全局变量,每组都存储在一个命名common块中,如下所示:

我希望能够对这些变量做两件不同的事情:

  • 将每组变量的值存储在一个数组中,这样最终结果将是由定义的数组integer :: a(3) = (/ x1, y1, z1 /), b(3) = (/ x2, y2, z2 /)
  • 将第二组中的值存储在第一组的对应变量中。即:x1 = x2y1 = y2z1 = z2

但是,在实际代码中,每组中的变量远不止 3 个。因此我希望能够使用循环来做到这一点。在 C/C++ 中,我可以通过递增指针轻松地做到这一点。但是,指针在 Fortran 中的工作方式不同。有没有办法做到这一点?

0 投票
0 回答
118 浏览

fortran - 如何在 Fortran 公共块中使用可分配字符?

我试图在 Fortran 77 中的公共块内有一个可分配的字符。但编译器总是抱怨

我的代码是

我看到使它工作的唯一方法是不使用allocatable

但这会很麻烦,因为我必须提前知道字符的长度。

我怎么能allocatable在一个common街区工作?

0 投票
2 回答
734 浏览

c - 从 C 作为结构访问 Fortran 公共块

我正在尝试在 C 中定义和声明一组结构,然后在 fortran 中与它们进行交互,然后再将它们传递回去以在 C 函数中进行操作。我知道可以通过使用 c 结构和 fortran 通用块来实现互操作性。我尝试了几种方法都没有成功。

限制:使用 cvfortran、f77。转换为较新的格式是不现实的。对于 C,使用 MSVS C 编译器。

这是 cvfortran 手册第 618 页的建议:(http://jp.xlsoft.com/documents/intel/cvf/cvf_pg.pdf

“举个例子,假设你的 Fortran 代码有一个名为真的公共块,如图所示:”

“您可以使用以下外部数据结构从您的 C 代码访问此数据结构:”

每当我尝试这个时,我都会收到“未解析的外部符号 _Really 在函数 xxx 中引用的错误,它无法编译。

CVFortran 手册中的方法:

Fortran

C

所以然后我尝试了我在下面粘贴的内容,其中我在头文件中定义了一个结构类型,然后尝试使它在 c 外部。我还应该提到,我将 C 函数导出为带有 .def 文件的 dll,以便可以从我的 fortran 模块中调用它。这不会产生任何错误,但会为我的所有变量返回零值。

示例程序:

Fortran

C 函数

C 头文件

我知道因为我使用的是旧编译器,所以问这个问题有点牵强,但任何指导都将不胜感激。

我也尝试过这里列出的方法:http: //www.yolinux.com/TUTORIALS/LinuxTutorialMixingFortranAndC.html

0 投票
1 回答
283 浏览

fortran - 值未使用公共块传递给子程序

我正在尝试在 Fortran 主程序和子程序之间传递参数。然而,由于某种原因,在子程序中获得了不同的值。我正在使用常见的块。

我希望nzcur=1,但我得到了nzcur=0

我认为这可能是数据类型不匹配,因为我没有定义它,只是作为一个公共块。

0 投票
1 回答
257 浏览

memory - FORTRAN 公共块的内存中实际发生了什么?

我带着沉重的 C 背景进入 FORTRAN。这一切都非常简单,除了COMMON块如何工作的实际机制让我感到困惑,而且我找不到任何详细描述它们的地方。

假设我COMMON在 FORTRAN 中有以下块。

据我了解,这将留出一块内存,其中包含三个...事物,这些事物与块中的名称并没有真正关联,实际上如果如果稍后在我的源代码中有下一个代码:

那么现在 X 与以前在 A 中的任何东西相关联,同样的 Y 与 B 和 Z 与 C 相关联。

所以这意味着COMMON/MYBLOCK/...声明时是一个 void 指针数组?没有与这些指针关联的类型,所以......分配值时分配内存?如果我A='A'在主线程中说,然后在MYSUB我说,会发生什么A=3.141592?如果我有一个想要A通过引用返回值的子例程(因为它是外部库的一部分),我可以说CALL MYSUB2(A)并指望编译器对其进行排序吗?还是我需要先调用MYSUB2局部变量,然后将其分配给A

很奇怪,FORTRAN 在其他任何地方都是一种强类型语言,但是COMMON块就像“做任何你想做的事,伙计,我们不在这里做类型”......

0 投票
1 回答
132 浏览

fortran - Fortran 中的 COMMON 块是否必须在 OpenMP 的每个子例程中声明为 threadprivate?

我正在修改一些旧的 Fortran 代码以使用 OpenMP 指令运行,它大量使用了COMMON块。我发现多个消息来源说,使用 OMP 指令将COMMON块声明为通过为每个 OpenMP 线程提供自己的副本THREADPRIVATE来解决块驻留在全局范围内的问题。COMMON我不确定的是,THREADPRIVATE指令是否需要在每个子程序的声明之后,或者是否在主程序(并且只有)PROGRAM中就足够了?

0 投票
0 回答
79 浏览

arrays - COMMON 块中带有指针的自定义类型未正确传递

(在我发现问题是在我的代码的不同位置引起的之后,于 2021-09-06 13:30 CEST 编辑)

我正在编写一些代码(不是我自己的),它们使用自定义类型来处理动态整数数组。这种类型的一个实例通过例程之间的公共块传递。看起来这不能正常工作或按预期工作,因为数组在传递给新例程后采用不同的值。一个最小的示例如下所示:

在 8.2.0 版本中使用 gfortran 编译后的输出如下所示:

虽然我期望它是:

谁能告诉我这里出了什么问题以及如何解决这个问题?

0 投票
1 回答
57 浏览

fortran - 公共块中的值不正确

如何使用 Fortran 在例程和子程序之间创建链接?

这是一个例子。当我打印 f1(2.) 和 f2(3.) 时,我得到第一个结果为真,第二个结果为假。

0 投票
0 回答
42 浏览

fortran - 有没有办法先验地知道特定系统的最大 COMMON 块大小是多少?

使用 ifort 和一些 HPC 代码,处理具有 30 年历史的 Fortran 代码,其中大型数据数组存储在COMMON块中。有没有办法知道,而不仅仅是编译并查看我是否收到错误,根据我的系统规格,这些阵列是否对于 HPC 来说太大了?如果我在计划运行代码的同一主机上编译,有没有办法让编译器询问这个限制是什么?