小编M. *_* B.的帖子

不同Fortran和C供应商之间的ISO_C_BINDING

是否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 c++ interop fortran fortran-iso-c-binding

2
推荐指数
1
解决办法
677
查看次数

在 C++ 和 Fortran 代码之间传递复数数组

我正在使用 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 数组。怎么可能:

  1. 为 C/C++ 中的复杂数组分配内存作为phi参数传入?
  2. 将数组作为参数传递给 Fortran 子例程,以便 Fortran 代码可以使用内存?

c++ fortran complex-numbers fortran-iso-c-binding

2
推荐指数
1
解决办法
1539
查看次数

将指针从C传递给fortran子程序

我试图从C调用fortran子例程,我可以在C中分配并安全地将指针传递给Fortran吗?子程序中的数组是自动数组(x(nmax)).

(我正在分配x然后将其传递给fortran)

c fortran fortran-iso-c-binding

2
推荐指数
1
解决办法
1405
查看次数

混合编程Fortran和C.

我是理论物理研究专业的学生,​​在宇宙学领域工作.在我的研究过程中,我使用了相当庞大的Fortran代码库,我使用C来满足编程需求.

我已经能够在众多测试文件中链接这两个程序,并且它们的工作非常出色.但对于他们来说,我一直在使用目标文件将它们全部链接起来.但是当我尝试通过C运行真实交易时,请包含对Fortran头文件的引用.它们似乎集成并相互调用,但Fortran头文件的格式与C编译器不兼容,因此当它跳转到头文件时,它会开始抛出无法理解语法的错误.

例如,Fortran头文件使用real*8定义双变量,因此当C读取它们时会抛出错误.文件中的注释也会发生同样的情况.

那么,我想问一下,有什么方法可以解决这个问题吗?即通过C使fortran格式头文件可读.

我查看了互联网,发现了令人困惑的答案,我不知道应该遵循哪一个.任何有关此事的帮助将不胜感激:)

c mixed fortran fortran-iso-c-binding

1
推荐指数
1
解决办法
2290
查看次数

如何在Fortran 2003程序中找到内存泄漏的原因?

我有一个使用Fotran 2003编写的Fortran程序并使用编译

英特尔(R)Fortran编译器XE,适用于在IA-32,版本12.1.2.273 Build 20111128上运行的应用程序

在长时间运行我的程序之后(这是一个物理计算)我读完了:
没有足够的内存来分配Fortran RTL消息缓冲区,消息

我猜想它与我的程序中的内存泄漏有关我如何找出泄漏发生的位置以及如何解决?

fortran memory-leaks fortran90 memory-leak-detector

1
推荐指数
1
解决办法
5327
查看次数

通过更改makefile来覆盖FORTRAN和C.

我有一个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)

c fortran makefile fortran-iso-c-binding

1
推荐指数
1
解决办法
909
查看次数

从C调用Fortran函数时的EXC_BAD_ACCESS

我环顾四周,虽然有很多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)

c fortran fortran-iso-c-binding

1
推荐指数
1
解决办法
305
查看次数

C/Fortran混合代码以奇怪的方式使用MPI/ScaLAPACK seg故障

我试图将这个代码从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)

c fortran mpi segmentation-fault scalapack

1
推荐指数
1
解决办法
539
查看次数

将FORTRAN对象传递给C,反之亦然

我有我的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)

c fortran object argument-passing fortran-iso-c-binding

1
推荐指数
1
解决办法
272
查看次数

关于Fortran的非常简单的问题 - UNIX编译

抱歉,如果这太天真或太明显但经过一段时间的搜索,我不是百分之百确定我理解fortran/unix接口.我的不确定性是关于在将fortran程序编译成unix可执行文件时遇到的.src,.f,然后.o和.out文件的性质.这样的谷歌文件扩展很难.但是,如果你能告诉我我是否有这样的话,我真的很感激!

.src是源文件,其中包含多余的fortran代码
.f是'主机语言特定包含文件',它告诉您的fortran编译器有关源代码的一些信息.它有时是互动的.
---获得.o或.out文件后,可以扔掉.src和.f文件,是吗?
.o是二进制目标文件,它来自编译但不链接fortran .f和.src文件.它包含相同的肉,但现在转换为机器特定的说明?.out是可执行的链接对象文件,它仍然依赖于.o文件,并且是特定于机器的.是不是真的需要.out文件扩展名,经常被省略?

我认为这涵盖了它.感谢您的任何更正或进一步说明.

凯尔

fortran compilation

0
推荐指数
1
解决办法
940
查看次数

如果一个数组在循环中重新分配并且从未在Fortran中释放,会发生什么?

我想知道以下代码对内存的作用:

program A

While (t < large number)
 allocate(a)
 ...

end program
Run Code Online (Sandbox Code Playgroud)

"allocate(a)"是指在每次迭代时引用相同的内存位置,如果在程序结束之前没有使用deallocate(a),是否存在内存泄漏?

fortran

0
推荐指数
1
解决办法
282
查看次数