问题标签 [f2c]
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.
c - C中的外部结构
我有一个使用 f2c(Fortran 到 C 转换器)生成的 C 文件,其中包含以下 C 结构:
如何const_
在不修改 f2c 生成的变量的情况下在另一个 .c 文件中将此变量声明为外部变量?
c++ - 由 C++ 编译器优化时,F2C 翻译的代码中断
我有一个 c++ 程序,它的方法看起来像这样:
启用优化 (/O2) 后,第一个指针递减的第一行不会被执行。我正在并排调试优化的和非优化的构建,优化的构建逐步减少,而非优化的程序执行它。当它稍后使用 arr[*index] 访问数组时,这会产生明显的行为差异。
更新
正如@stefaanv 指出的那样,如果它改为减量的访问索引,编译器确实可以省略减量,它似乎会这样做。因此,省略的减量并不是导致行为差异的原因。取而代之的是,导致它的矩阵的使用存在某些问题。
进一步看,我已将其缩小为包含执行矩阵乘法的嵌套循环的方法。该方法的一部分如下所示:涉及 3 个数组:a、wa 和 t。在该方法的开始,f2c 翻译器使用减量,以便在 fortran 中为 6 x 6 的数组double[36]
在 c 中是一个平面。但是为了能够使用旧的索引,它将数组指针向后移动矩阵中的列数。
通常在这个 f2c 翻译的程序中,平面数组是传递的&someArray[1]
,方法从每个数组减一开始。@Christoph 指出这应该是有效的,因为数组的减量永远不会超出其声明的范围。
在这种方法的情况下,传入的数组不会作为指向数组更远元素的指针传递,&someArray[1]
但这里的数组是用固定大小声明的局部静态数组,例如mat[36]
直接传递给乘法方法。
所以问题是:
这是否意味着当您执行 f2c 在此处所做的操作时,行为未定义并且可能会在优化下中断,即从 double[36] 数组指针中减去 7,然后在正确的位置(偏移量 7)访问数组中的所有项目?
编辑:在C FAQ中找到了这个,这适用于这里吗?
只要指针指向同一个分配的内存块内,或者指向一个假想的“终止”元素,就可以定义指针算术;否则,行为未定义, 即使指针未取消引用。.... 参考文献:K&R2 Sec。5.3 页。100,秒。5.4 第 102-3 页,秒。A7.7 第 205-6 页;ISO 秒。6.3.6;理由二。3.2.2.3。
更新 2:
如果我使用递减索引而不是递减指针重新编译多维数组,
然后,无论优化如何,该方法都会产生相同的(预期的)输出。仅减一的一维数组似乎不会产生任何问题。
我可以将程序中的所有多维数组更改为使用上述访问方法,但是单个暗淡数组太多而无法手动更改,因此理想情况下我想要一个对两者都适用的解决方案。
新问题:
- f2c 是否可以选择使用此数组访问方法而不是指针摆弄?似乎这将是 f2c 中的一个简单更改,并生成定义良好的代码,因此您会认为它已经是一个选项。
- 这个问题是否有其他解决方案(除了跳过优化并希望程序表现良好,尽管依赖于未定义的行为)。
- 我可以在 c++ 编译器中做些什么吗?我使用 Microsoft C++ (2010) 作为托管 c++ 项目进行编译。
f2c - 如何阻止 f2c 打印每个子例程和函数的名称
我们的构建脚本在数千个子例程和函数上运行 f2c,因此我们的构建输出包含大量输出,例如:
我们正在运行 f2c 版本 20100827。
使用的 f2c 命令行是:
我找到了f2c 手册页,在那里看不到任何相关选项。
在不编辑 f2c 源代码的情况下,是否有其他方法,例如一些未记录的功能?
r - win7和linux mint上quantreg lib的不同速度
我在quantreg
win7 64bit 和 linux Mint Maya 64bit 上都使用库,我意识到速度差异很大。
我正在使用用 Fortran 编写的 Frisch-Newton 方法,并且我只测量 .Fortran() 调用的速度。
我正在分析长度为 1600 的向量。
在 Windows 上大约需要 2.5 秒,在 Linux 上大约需要 22 秒。而且我真的不明白为什么..
在此之后,我尝试通过 F2C 将 Fortran 代码翻译成 C 代码,并使用 clapack 函数将其编译成动态库。我通过 .C() 调用了这个函数,我再次测量了时间效率:
在 Windows 上需要 8 秒,在 Linux 上需要 22.5 秒。我真的很困惑。
一切都在 I7-3770、16GB RAM 上完成。
有人可以向我解释为什么它不起作用吗?
这是代码:
Fortran 代码:
C代码:
从 R 调用:
动态库的编译:
fortran - 在包含文件中使用 Do-Loop
在我的 fortran 代码中,我试图包含一个 DO 循环,但我最终得到一个“DO 循环或 BLOCK IF 未关闭”。如果在打开 INCLUDE 语句后出现任何其他 DO 循环,则它会将它们视为嵌套循环,向我表明包含的开始 DO 行被正确解释,但不是 END DO 语句。我已将包含的代码简化为基本代码,以确保它是循环而不是循环中的语句给出问题。控制变量在 DO 循环之前声明。
Fortran77 是否不允许在 INCLUDE 文件中使用 DO 循环?
如果它变化很大,我将 gfortran 用于我的编译器。
编辑:语法
Edit2:我使用的是 GCC 4.6.2。现在要注意,如果这有所不同,gfortran 是从 PSCAD 制作的 makefile 运行的。如果相关的话,我可以提供这方面的信息。
这是遇到此问题的代码:
测试.F:
HDR.INC:
Edit3:编辑代码中的错别字并从子程序中删除 RETURN。
compiler-errors - if (m <= 0 .or. n <= 0) return 在线语法错误
当我用 编译以下文件时f2c
,它会失败并显示非信息性语法错误消息
gfortran
编译它没有任何错误。你知道是什么原因造成的吗?你知道任何 fortran 编译器会很严格f2c
并且有很好的错误信息吗?
有问题的文件:
visual-studio-2010 - 将 Fortran 转换为 C 时出现链接错误(使用 f2c)
我正在尝试构建一个主要是 C 但有一些 Fortran 子例程的项目。代码很旧,我正试图让它在现代机器上运行。我的主函数调用了一个外部函数
该函数是一个用 Fortan 编写的子程序
我想使用 f2c 转换 Fortran 代码(包含这个和其他子例程)并将结果放入我的项目中。
f2c 确实转换了代码,并且生成的 C 代码确实可以编译。当我尝试构建项目时,有几个链接错误。
这些函数不会出现在原始 Fortran 代码中,也不会出现在其他任何地方。我只在 netlib 的 f2c 源中找到了它们的引用
谢谢你的帮助
c++ - Visual Studio (f2c) 中带有静态库的未解析外部
我已经成功使用f2c.exe将一些 Fortran *.f 文件转换为 *.c 文件。我确保它#include "f2c.h"
存在于每个 C 文件中,并在 MS VS2008 中添加了包含该头文件的目录:Properties -> C/C++ -> General -> Additional Include Directories
问题始于源文件中存在的所有 f2c IO 和数学函数报告的
未解决的外部符号s_rsue, e_rsue, s_rsfe, do_uio, f_close, do_fio, do_lio, f_open, s_stop, pow, pow_ri, sqrt, log, exp, tanh, cos, acos
错误:等。
我在这里读到我必须vcf2c.lib
首先通过下载 生成静态库文件libf2c
。因此,我nmake
在 VS2008中使用makefile.vc
并生成了vcf2c.lib
,然后将其复制到我的项目目录中并将其添加到 下Configuration Properties -> Linker -> Input -> Additional Dependencies
,但我仍然得到与以前相同的未解析外部符号。
我是否正确构建了这个库,以便 Visual Studio 能够识别其中的函数?我在这里想念什么?添加这个库似乎效果为零。谢谢你的帮助。
错误示例:
编辑:我一直在尝试诊断库文件本身的任何问题。我什至尝试下载其他人编译的版本,但仍然无法解决外部问题。以下是运行 dumpbin 的结果:
dumpbin /exports vcf2c.lib
我不知道这意味着什么。当我使用 /ALL 标志运行它时,我可以在其中看到所需的函数名称,但同样,我不确定如何确定它是否正确。源代码函数和库函数之间是否存在某种不匹配?16 位与 32 位、C 与 C++ 生成文件选项?
gcc - 无法编译和链接库
我尝试使用基于 fortran 代码的使用 gcc 编译的名为matlisp的库。在指定 f77 编译器后,我可以执行 autoreconf、configure 和 make 命令来获取文件 libmatlisp.so。
但是当我尝试使用它时,我得到:
当我执行命令 ld libmatlisp.so 我得到:
有没有办法改善这种情况?
我已经尝试过这个解决方案,但它不起作用。
我也尝试将编译器更改为 gfortran,但我收到一些运行时错误消息,提到缺少 libf2c 的一部分的库。
c++ - how to call fortran routines from C++?
I wish to call fortran routine cbesj.f from my C++ code and how do I achieve this?
Here are steps I have done:
Download cbesj.f plus dependencies from netlib amos webpage, http://www.netlib.org/cgi-bin/netlibfiles.pl?filename=/amos/cbesj.f
In the source dir,
f2c -C++PR *.f
g++ -c *.c
ar cr libmydemo.a *.o
[test_cbesj.cpp][1] and [mydemo.h][2] are used to call the subroutine in this way,
g++ test_cbesj.cpp -lf2c -lm -L. -lmydemo it returns bug:
test_cbesj.cpp:(.text+0xd6): undefined reference to `cbesj_(complex*, float*, long*, long*, complex*, long*, long*)'
What shall be the proper way to refer to cbesj_ subroutine in my problem? Thanks!
Thanks for casey: I think your approach is the best. But I still have set fault, why? Here we go:
in modemo.h
in test_cbesj.cpp,
Then,
Thanks for roygvib's reply! Good suggestions actually. Here is the changed test_cbesj.cpp:
No more seg fault. But out of some reasons, the code does not work as expected:
and answers are wrong and ierr also says so from the source code: