是否C/C++编译器供应商也支持Fortran ISO_C_BINDING模块的概念?例如,C/C++的大小int可能因来自不同供应商的编译器而异.因此,使用ISO_C_BINDING模块,我们知道Fortran C_INT类型是4个字节; 而不仅仅是一种 4.但是,我们仍然不知道intC/C++中的一般大小.我对么?是否有标准的C/C++ ISO_C_BINDING兼容编译器开关?
我正在使用 C++ 和 Fortran 代码。C++ 代码需要调用 Fortran 子例程。Fortran 子例程的一个参数具有 Fortran 类型complex。
C++ 代码位于一个文件中,Fortran 代码子例程位于另一文件中。我正在64位系统上使用gccand 。gfortranGNU/Linux
下面是显示 Fortran 子例程声明的片段(以及一些附加行):
SUBROUTINE minp (AMP,L,L2,FMINP,PHI)
REAL*4 AMP( L ),FMINP( L )
COMPLEX PHI( L )
Run Code Online (Sandbox Code Playgroud)
在 C++ 文件中,我知道传递给 Fortran 代码的参数需要通过引用传递,而不是通过值传递。Fortran 子例程使用关键字在 C++ 代码(位于源代码文件的顶部)中声明为函数extern。
extern "C"
{
minp_ (float *amp, int &L, int &L2, float *fminp, complex *phi);
}
Run Code Online (Sandbox Code Playgroud)
然而,该函数的最后一个参数是一个复杂的 C 数组。怎么可能:
phi参数传入?我试图从C调用fortran子例程,我可以在C中分配并安全地将指针传递给Fortran吗?子程序中的数组是自动数组(x(nmax)).
(我正在分配x然后将其传递给fortran)
我是理论物理研究专业的学生,在宇宙学领域工作.在我的研究过程中,我使用了相当庞大的Fortran代码库,我使用C来满足编程需求.
我已经能够在众多测试文件中链接这两个程序,并且它们的工作非常出色.但对于他们来说,我一直在使用目标文件将它们全部链接起来.但是当我尝试通过C运行真实交易时,请包含对Fortran头文件的引用.它们似乎集成并相互调用,但Fortran头文件的格式与C编译器不兼容,因此当它跳转到头文件时,它会开始抛出无法理解语法的错误.
例如,Fortran头文件使用real*8定义双变量,因此当C读取它们时会抛出错误.文件中的注释也会发生同样的情况.
那么,我想问一下,有什么方法可以解决这个问题吗?即通过C使fortran格式头文件可读.
我查看了互联网,发现了令人困惑的答案,我不知道应该遵循哪一个.任何有关此事的帮助将不胜感激:)
我有一个使用Fotran 2003编写的Fortran程序并使用编译
英特尔(R)Fortran编译器XE,适用于在IA-32,版本12.1.2.273 Build 20111128上运行的应用程序
在长时间运行我的程序之后(这是一个物理计算)我读完了:
没有足够的内存来分配Fortran RTL消息缓冲区,消息
我猜想它与我的程序中的内存泄漏有关我如何找出泄漏发生的位置以及如何解决?
我有一个FORTRAN代码,它调用C例程来计算度量.FORTRAN代码是:
program fortran
implicit none
interface
double precision function fpli_hv(A, d, n)
real :: A(5,3)
integer :: d, n
end function fpli_hv
end interface
real :: A(5,3)
double precision :: HV
integer :: i, j
A(1,:) = (/1.1,3.2,2.0/)
A(2,:) = (/6.3,5.2,7.2/)
A(3,:) = (/3.3,4.4,9.1/)
A(4,:) = (/3.3,5.2,2.1/)
A(5,:) = (/7.6,1.7,4.3/)
HV = fpli_hv(A, 3, 5)
end program fortran
Run Code Online (Sandbox Code Playgroud)
c函数看起来像这样:
double fpli_hv(double *front, int d, int n, double *ref);
Run Code Online (Sandbox Code Playgroud)
为了俱乐部c和fortran,我需要在我的makefile中包含一个Makefil.lib.我这样做了,并按如下方式准备了我的makefile:
# The makefile should contain a set of suffix rules. All …Run Code Online (Sandbox Code Playgroud) 我环顾四周,虽然有很多EXC_BAD_ACCESS问题,但它们都没有帮助.
我正在使用Mountain Lion(我认为OSX 10.8?)和PGI 12.
我似乎无法从C调用fortran函数,我写了一个简化的案例,似乎我无法传递整数.
我的fortran功能是:
1 integer function smallFortran(a) result(res) bind(c,name='smallFortran_')
2 !integer function smallFortran(a) result(res)
3
4 use ISO_C_BINDING
5 implicit none
6
7 integer(kind=c_int), intent(IN) :: a
8 !integer, intent(IN) :: a
9
10 print *,'A = ', a
11 res = a;
12
13 endfunction smallFortran
Run Code Online (Sandbox Code Playgroud)
我的C函数是,
int main() {
int ier=7;
ier = smallFortran_(8);
}
Run Code Online (Sandbox Code Playgroud)
建立它..
matt@pontus:diffFst$ make
pgcc -c cDoDiffFst.c
PGC-W-0267-#warning -- "Unsupported compiler detected" (/usr/include/sys/cdefs.h: 81)
PGC/x86-64 OSX 12.9-0: compilation completed with …Run Code Online (Sandbox Code Playgroud) 我试图将这个代码从Fortran 翻译成C.
这是我到目前为止:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "mpi.h"
#define PRINT_NOTHING 0
#define PRINT_UP_TO_MESGS 1
#define PRINT_UP_TO_ARRAYS 2
#define PRINT_UP_TO_MATRICES 3
#define PRINT_LEVEL PRINT_UP_TO_MATRICES
/*! Parameters: */
#define TOTMEM 425053208
#define INTMEM 13107200
#define NTESTS 20
#define DLEN_ 9
#define DBLESZ 8 /*! Size of a DOUBLE PRE. */
#define MEMSIZ 425053208/8 /*! Memory for DOUBLE PRE. */
#define MASTER 0
#define MPI_ERROR_CODE_ERROR_GRID 1
#define MPI_ERROR_CODE_NOT_FACT 2
#define MPI_ERROR_CODE_NOT_SOLVE 3
#define BLACS_USER_WONT_FIN_MPI 0
#define …Run Code Online (Sandbox Code Playgroud) 我有我的Fortran对象,即
this%object%a
this%object%b
this%object%c
Run Code Online (Sandbox Code Playgroud)
我想将其传递给用C编写的代码,我主要是FORTRAN程序员,对C的接触很少。我iso_c_binding过去一直在传递整数和数组,但现在我需要传递对象。
我通过以下方式定义对象
TYPE object
INTEGER :: a
INTEGER :: b
INTEGER :: c
END TYPE object
Run Code Online (Sandbox Code Playgroud) 抱歉,如果这太天真或太明显但经过一段时间的搜索,我不是百分之百确定我理解fortran/unix接口.我的不确定性是关于在将fortran程序编译成unix可执行文件时遇到的.src,.f,然后.o和.out文件的性质.这样的谷歌文件扩展很难.但是,如果你能告诉我我是否有这样的话,我真的很感激!
.src是源文件,其中包含多余的fortran代码
.f是'主机语言特定包含文件',它告诉您的fortran编译器有关源代码的一些信息.它有时是互动的.
---获得.o或.out文件后,可以扔掉.src和.f文件,是吗?
.o是二进制目标文件,它来自编译但不链接fortran .f和.src文件.它包含相同的肉,但现在转换为机器特定的说明?.out是可执行的链接对象文件,它仍然依赖于.o文件,并且是特定于机器的.是不是真的需要.out文件扩展名,经常被省略?
我认为这涵盖了它.感谢您的任何更正或进一步说明.
凯尔
我想知道以下代码对内存的作用:
program A
While (t < large number)
allocate(a)
...
end program
Run Code Online (Sandbox Code Playgroud)
"allocate(a)"是指在每次迭代时引用相同的内存位置,如果在程序结束之前没有使用deallocate(a),是否存在内存泄漏?