问题标签 [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.
module - 在 Fortran 90 中使用通用块和模块在内存方面是否存在差异
我最近在没有任何指导的情况下学习 Fortran,并尝试了不同的版本。我从这个网站发现:
MODULE 比 COMMON 块好吗?
几乎总是是的。使用 COMMON 块的唯一原因是如果您希望在只有 FORTRAN 77 编译器的计算机上使用您的程序(它们仍然存在),或者如果您控制数据在内存中存储的顺序非常重要。
好吧,使用模块在语法上肯定比使用通用块更甜。但是在这两种情况下,内存使用和分配有什么区别?它在性能和访问速度方面也有影响吗?这个问题有意义吗?
fortran - Fortran 77 中的字符数组尺寸标注混淆
我的子程序中有以下代码:
好吧,我实际上并没有写这个。所以我不了解这里的尺寸。是y
一个 999 元素宽的 80 个字符的长字符串数组吗?
如果是这样,我如何在没有公共块的情况下在 Fortran 90 中正确定义它?
c++ - 加载没有 RTLD_PRIVATE 或多个副本的共享库的两个实例
在 C++ 中,我需要运行使用 COMMON BLOCK 变量的旧 FORTRAN 库(我无法控制)的多个实例。我可以按照问题 3433522的规定成功地做到这一点,在那里我创建了库的 2 个物理副本,并在运行时使用dlopen
(参见下面的示例代码)加载这些副本。
但是,我想避免创建库的两个物理副本,因为它可能相当大。正如问题 3433522中所建议的,使用RTLD_PRIVATE
会起作用,但这在libgc
GCC 中不可用(据我所知)。我也研究过使用RTLD_DEEPBIND
而不是RTLD_LOCAL
,但这没有区别。知道如何使用 GCC 来实现这一点吗?
我的示例代码如下:
生成文件
/li>gen.f
/li>运行.cpp
/li>
c++ - C++ 中的公共块等价物
我正在尝试将旧的 Fortran 77 代码转换为 C++,并且大多数变量都在 Common 块中声明,例如:
据我了解,通用块仅用于使变量在整个程序中的不同子例程中可访问。因此,在 C++ 程序中,我是否能够使用变量(在主程序之外)创建结构并以这种方式将变量作为结构的成员调用?
c++ - C ++ - 将数据传递给结构
我正在将 Fortran 77 代码翻译成 C++,而 Fortran 77 使用通用块。我正在尝试用结构替换公共块,然后我将用函数中的值填充这些块,然后调用两者以在我的主程序中使用。目前我的代码如下所示:
这只是一个测试,因为目前我的 main 除了打印一个值之外什么也没做。我想要的是在我的data
函数中给定值的变量能够在整个代码中使用。目前,有两件事我很困惑:
1) 我的Pierson-Moskowitz
功能没有为 Ug 打印任何内容。我不明白为什么不呢?2)我不确定我什至需要这个data
功能。本质上,我正在翻译的 Fortran 代码使用子例程将值分配给公共块中的变量。我正在尝试通过使用结构然后使用函数来填充值来做类似的事情。
这段代码很短,我打算将所有内容都保存在一个文件中。任何帮助都非常感谢!
fortran - Fortran 77 代码中 EQUIVALENCE 语句的问题
我正在努力让光线追踪代码正常工作,我想我可能已经隔离了这个问题。我是使用 Fortran 77 的新手,但想获得更多使用这种语言的经验(即使它已经过时了)。我在其中一个子例程中有一些 EQUIVALENCE 语句,可用于将变量传递到子例程中(这可能是问题的一半)。
子程序:
在调用子例程或条目 ELECTX 之前,我在 RINDEX 子例程/条目中放置了一些打印语句。
我在调用 RINDEX 之前检查了一些输入
我从这段代码中得到的是:
所以这是一种冗长的询问方式——发生了什么事?例如,我希望像 f 这样的变量被传递到子程序 QPARAB 中,所以当我在子程序中打印时,我希望看到 F = 7。我可能从根本上误解了一些简单的东西。正如我所提到的,我似乎无法将 F 之类的变量放入子例程 QPARAB 中,这实际上是一个大问题,因为以下计算结果为 0 或 NaN。我希望它有一些价值。所以也许数据没有以某种方式进入?在某种程度上,其他一切(此时)似乎都在起作用。
这段代码来自哪里:
我正在使用一个小的 shell 脚本(这可能是一团糟):
我正在使用的 g77 例程下载于:http ://hpc.sourceforge.net/最后我使用 gfortran 得到了同样的错误,
fortran - fortran中的随机数生成器
我正在测试链接中提到的 RNG 代码(fortran 77 代码):
https
://www.cisl.ucar.edu/zine/96/spring/articles/3.random-6.html
它应用了 Park & Miller 算法.
程序的函数调用是
然而,该程序似乎没有响应 srand() 的播种,即 x 值不受初始播种的影响,并且始终等于 ~0.218。我怀疑这与公共块和数据块的定义有关,因为x的值相当于将种子放置为123456789,这是数据块中定义的初始化值。
有任何想法吗?
我正在用 gfortran 编译。
fortran - 将公共变量传递给 Fortran 中的子例程
我正在定制一个商业代码,它深度使用公共块来定义全局变量。
我想做的是只将其中一个变量传递给子例程,但不包含,因为我不需要其他几个定义为通用的变量。
我发现这样做的唯一方法是先前定义一个新的局部变量,为其分配全局变量的值,然后将新变量传递给子例程,但我不喜欢这种继续方式。
是否有解决方案告诉 Fortran 在将变量传递给子例程时将其转换为本地变量?
这里有一个例子:
主程序:
子程序:
arrays - 具有数组大小的 Gfortran COMMON 块
我想在 gfortran 上编译的旧 fortan 代码遇到一些问题。
代码的问题在于该函数假定 RE 是一个大小为 NEQ 的数组。但是,我无法事先指定数组的大小,因为它来自公共块。
由于代码很长,我希望在不使用模块变量的情况下修复 yhis。我可能想尝试的一件事是将 NEQ 作为参数插入,而不是通过公共块获取它。
c - 可见性、Fortran 公共变量、共享库的运行时加载
环境:Intel Linux,Red Hat 5。编译器:gcc 3.4.6(旧东西,具有严重基础设施的遗留环境,抱歉)
我有从 Fortran 派生的特定共享库的多个版本(称之为“shared_lib.so”),其中包含一个 COMMON 块和各种计算,并引用了该 COMMON 中的变量。
我需要能够(从最终产品可执行文件中其他地方的 C 代码)在运行时使用 dlclose() 和 dlopen() 在这个库的版本之间切换(其中所有版本的 COMMON 内容都是相同的)。在某些情况下,相同的 COMMON 也出现在作为静态库(称为“static_lib.a”)的一部分的代码中,该库也链接到可执行文件中,并且与我的项目分开维护,但具有与我的共享库。
我似乎看到 COMMON 的多个实例最终出现在可执行文件中,并且(更重要的是)静态库中实例中的变量值与中“相同”变量的值之间没有联系使用 dlopen() 拉入的共享库中的实例。
总之,我需要的是(在整个可执行文件中)加载 dlopen() 的 shared_lib.so 能够在 COMMON ABC 中设置/使用变量 XYZ,以及 static_lib.a 中的代码设置/使用 XYZ,并使其实际上是 XYZ 的同一个实例,或者至少使两者保持同步。这可能吗?
我对 shared_lib.so 中源代码的编译命令格式如下:
我构建 shared_lib.so 的命令形式如下:
我构建可执行文件的命令格式如下:
我需要从表单的 C 代码中做一些事情:
初始启动配置在所需变量方面确实似乎运行正常,但后续 dlclose() 和 dlopen() 序列的结果却没有。也许根本问题是 dlopen() 缺乏 gcc 在链接时拥有的一些智能。