问题标签 [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.
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
请帮助
查看代码
pointers - 如何在 Fortran 中的下一个内存地址分配/获取变量的值
我有两组全局变量,每组都存储在一个命名common
块中,如下所示:
我希望能够对这些变量做两件不同的事情:
- 将每组变量的值存储在一个数组中,这样最终结果将是由定义的数组
integer :: a(3) = (/ x1, y1, z1 /), b(3) = (/ x2, y2, z2 /)
- 将第二组中的值存储在第一组的对应变量中。即:
x1 = x2
、y1 = y2
和z1 = z2
。
但是,在实际代码中,每组中的变量远不止 3 个。因此我希望能够使用循环来做到这一点。在 C/C++ 中,我可以通过递增指针轻松地做到这一点。但是,指针在 Fortran 中的工作方式不同。有没有办法做到这一点?
fortran - 如何在 Fortran 公共块中使用可分配字符?
我试图在 Fortran 77 中的公共块内有一个可分配的字符。但编译器总是抱怨
我的代码是
我看到使它工作的唯一方法是不使用allocatable
但这会很麻烦,因为我必须提前知道字符的长度。
我怎么能allocatable
在一个common
街区工作?
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
fortran - 值未使用公共块传递给子程序
我正在尝试在 Fortran 主程序和子程序之间传递参数。然而,由于某种原因,在子程序中获得了不同的值。我正在使用常见的块。
我希望nzcur=1
,但我得到了nzcur=0
。
我认为这可能是数据类型不匹配,因为我没有定义它,只是作为一个公共块。
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
块就像“做任何你想做的事,伙计,我们不在这里做类型”......
fortran - Fortran 中的 COMMON 块是否必须在 OpenMP 的每个子例程中声明为 threadprivate?
我正在修改一些旧的 Fortran 代码以使用 OpenMP 指令运行,它大量使用了COMMON
块。我发现多个消息来源说,使用 OMP 指令将COMMON
块声明为通过为每个 OpenMP 线程提供自己的副本THREADPRIVATE
来解决块驻留在全局范围内的问题。COMMON
我不确定的是,THREADPRIVATE
指令是否需要在每个子程序的声明之后,或者是否在主程序(并且只有)PROGRAM
中就足够了?
arrays - COMMON 块中带有指针的自定义类型未正确传递
(在我发现问题是在我的代码的不同位置引起的之后,于 2021-09-06 13:30 CEST 编辑)
我正在编写一些代码(不是我自己的),它们使用自定义类型来处理动态整数数组。这种类型的一个实例通过例程之间的公共块传递。看起来这不能正常工作或按预期工作,因为数组在传递给新例程后采用不同的值。一个最小的示例如下所示:
在 8.2.0 版本中使用 gfortran 编译后的输出如下所示:
虽然我期望它是:
谁能告诉我这里出了什么问题以及如何解决这个问题?
fortran - 公共块中的值不正确
如何使用 Fortran 在例程和子程序之间创建链接?
这是一个例子。当我打印 f1(2.) 和 f2(3.) 时,我得到第一个结果为真,第二个结果为假。
fortran - 有没有办法先验地知道特定系统的最大 COMMON 块大小是多少?
使用 ifort 和一些 HPC 代码,处理具有 30 年历史的 Fortran 代码,其中大型数据数组存储在COMMON
块中。有没有办法知道,而不仅仅是编译并查看我是否收到错误,根据我的系统规格,这些阵列是否对于 HPC 来说太大了?如果我在计划运行代码的同一主机上编译,有没有办法让编译器询问这个限制是什么?