问题标签 [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 投票
2 回答
1864 浏览

fortran - “保存”一个公共块

我正在处理一些COMMON广泛使用块并且有时使用SAVE语句的遗留代码。在咨询了 Fortran 标准后,它说:

语句中斜线前后的公共块名称的出现SAVE具有指定该公共块中的所有实体的效果。

在什么情况下将变量放在公共块中并不意味着SAVE?由于该变量必须可以在包含该公共块的任何其他程序单元中访问,所以它怎么可能不被SAVE编辑?

0 投票
1 回答
262 浏览

fortran - 本地化 Fortran 77 中常用块变量的范围

我正在使用广泛使用 COMMON BLOCKS 来处理这个 F77 代码,并且这些 COMMON BLOCKS 也用于 C 程序(在名称修改之后)。如果 foo(a, b, ...) 是 fortran 代码的主要例程,那么无论如何都要使 COMMON BLOCKS 成为 foo() 的本地程序,以便我可以执行以下操作?

关键是要多次调用“foo”,每个调用都有独立的公共块,即使这些块具有相同的名称。我知道的唯一方法是在“foo”的第二次调用中重命名 COMMON BLOCKS 和相关子例程,使其成为另一个例程“foo1”,所以我可以这样做:

但这肯定是平凡且容易出错的。

0 投票
1 回答
1028 浏览

fortran - 在 Fortran 中使用公共块的问题

我正在使用有限元分析程序的 fortran 子程序。我必须在两个子程序之间共享变量,所以我使用的是 COMMON 块(编辑:模块更好)。问题是只有一些变量被传递给另一个子程序,其他的则没有。

我的代码是这样的: 第一个子程序:

第二个子程序我使用相同的语法。我通过将每个子例程中的 kmom 和 krot 值写入 txt 文件来控制结果:

结果是:

所以krot的价值就丢失了。任何建议都是最受欢迎的。

若昂

解决了:

在每个子程序中:

0 投票
1 回答
2038 浏览

c - Fortran 77 如何分配公共块变量?

我正在用 C 语言开发一个可以与 C、C++ 或 Fortran 代码一起使用的库。它使用的一种机制是捕获对堆栈、堆或数据/bss 段中页面的写入。在这种情况下,“堆”是库从映射文件中创建的特殊堆。我发现我的库未能捕获对 Fortran 应用程序中变量的写入。变量声明为

其中 I、J 和 K 是整数参数(即常量)。然后代码将 u 包含在一个称为“字段”的公共块中。

在GDB下调试的时候发现u的地址没有落入三个数据段中的任何一个的范围内。(因此库未能捕获写入!)然后我查看了 /proc//maps 伪文件,发现 u 的地址落入系统注释为“堆”的范围内。但是你是怎么进入这个“堆”的?在这种情况下,Fortran 77 代码不使用非标准的“allocate”关键字在堆上分配。谁能向我解释一下 Fortran 77(在 Ubuntu Linux x86-64 下)在“堆”上分配了哪些变量,以及如何首先创建这个“堆”?

0 投票
5 回答
1850 浏览

c++ - C++ 和 Fortran:从 C++ 访问 Fortran 公共块中的数组时出错

我正在尝试从 C++ 访问 Fortran 公共块结构中的数组。
我有一个包含 C++ 和 Fortran 的混合示例代码。

Fortran:

然后在 C++ 中:

在 C++ 中,如果我尝试打印值sample_.b

我得到 a(2) 的值:sample b:5

如果我尝试打印任何其他数组-a 值,我只会遇到分段错误......

我做错了什么?¿任何想法¿?
我想,也许我也必须将数组“a”的长度传递给 C++,但如果是这样,我也不知道该怎么做。

0 投票
3 回答
637 浏览

c++ - 使用 COMMON 语句编译包括 Fortran 库的 C++

我正在编译一个需要一些库的 C++ 程序。这些库的代码是用 Fortran 编写的,并且包含 COMMON 块。基本上我正在做类似的事情:

Lib1.a 和 lib2.a 用 Fortran 编码:

两者都包含一个头文件,其中包含以下内容:

COMMON 块似乎出了点问题。例如,在公共变量之后更改变量的顺序,或添加新变量,会导致随机不一致的结果。

我知道在可能的情况下不应使用 COMMON 语句,但我看不出在这种情况下可能出现什么问题。

0 投票
1 回答
411 浏览

namespaces - Fortran 命名空间冲突

我正在将几个模拟代码耦合在一起。目前,有 3 个代码,但将来可能会更多。您可以在下图中考虑信息交换:

信息交换是通过每一侧的有限接口完成的。

我最近诊断出一个问题,sim1 中的一个公共块与 sim2 中的子程序同名,这导致了分段错误。简单的解决方案是更改 sim1 中公共块的名称,但这并不理想,因为如果 sim1 的开发人员推出 sim1-2.0,那么我将不得不再次挖掘并更改该公共块的名称。由于接口相对有限,我想知道是否更好的解决方案是编写一个简单的模块:

因为这应该将 sim2 中的所有例程放入 sim2_mod 命名空间,这可以use在有限的基础上进行。这是一个好主意吗?一个坏主意?有没有这行不通的情况?sim2 中使用的通用块是否仍然具有全局范围?

0 投票
1 回答
288 浏览

c++ - 如何从通用块重新设计 Fortran 和 C++ 混合语言库 - 全局结构别名?

我有一个程序,主要由 Fortran 77 和一个 C++ 包装器组成,该包装器可以读取和写入数据库。应用程序的两个部分通过使用一个功能共享数据,如果您使用一个名为 Fortran 公共块的全局 C/C++ 结构,则该功能可以共享数据。我很确定这种 C++/Fortran 集成的别名方法 1) 适用于许多编译器套件,2) 是 *not8 标准。我尝试维护我的代码,以便它尽可能多地使用标准组件。此外,这种集成已被证明是脆弱的。

在 utd.h 中:

在 utd.cpp 中:

在points.i中:

有没有更好的办法?我可能想将公共块转换为模块。然后,我确信用全局结构为公共块起别名的业务已经不存在了。您如何从 C++ 构建 Fortran 模块?你如何从这样的模块中读取数据?

您对 C++/Fortran 集成有何建议?

0 投票
2 回答
1631 浏览

initialization - Fortran COMMON 块初始化

Fortran 新手,我被要求使用 Salford/Silverfrost 编译器使用 Fortran 77 编写的旧 Fortran 代码库(最初的开发人员已去世)。

最初的开发人员COMMON广泛使用命名块(模拟全局变量,AFAIU),并且他EQUIVALENCE在需要时使用(重新)初始化块,如下面的代码片段:

这是一种可接受的编程实践还是只是一种黑客行为?另外,由于我正在尝试将代码移植到 GFortran,它是否可移植?(我知道像这样REAL*8的声明只是对编译器的提示,并不能保证)

0 投票
3 回答
2090 浏览

fortran - 从多个公共块fortran 77制作多个模块

目前在我的程序中,我有几个公共块分布在几个子程序和函数中。当我向其中添加变量时,我有时会忘记更改公共块的所有实例。我想将这些公共块制作成模块,这样我就可以在一个地方向模块添加和删除变量,而不必担心在我的子程序中更新模块的所有实例。

我是否需要在初始化模块中的变量的程序中包含“使用”语句,或者我是否需要在模块中包含程序?我通常会为此使用通用块,但我正在尝试实现模块,因为我认为随着复杂性的增加,它们将帮助我的代码保持可读性。

注意:模块中变量的某些值需要能够在它们从一个程序传递到另一个程序时进行更改。

我试图编写一个简化的测试程序来熟悉模块,但无法让它工作。我熟悉 fortran 77,但以前从未使用过模块。我感谢任何帮助或建议。

我正在使用 gfortran 4.6.1

主文件