Tag: fortran iso c binding

将Fortran整数数组传递给C子例程仅传递第一个元素

我试图将一个整数数组从Fortran传递给C,但我只能传递数组的第一个元素。 我有下面的测试程序再现错误。 我哪里错了? program test use foo integer (kind=c_int), allocatable :: hgmu_dose(:) allocate (hgmu_dose(0:10)) HGMU_dose(0)=22 HGMU_dose(1)=2 HGMU_dose(2)=3 HGMU_dose(3)=4 HGMU_dose(4)=5 HGMU_dose(5)=6 HGMU_dose(6)=7 HGMU_dose(7)=8 HGMU_dose(8)=9 HGMU_dose(9)=10 HGMU_dose(10)=11 print *, “HGMU_dose=”, hgmu_dose call test_interface(hgmu_dose) end program module foo use ISO_C_Binding implicit none interface subroutine test_interface(dose) bind(C,name=”INTERFACE”) import :: c_int import :: c_double import :: c_char integer (kind=c_int), allocatable […]

Fortran / C混合:如何在Fortran中访问动态分配的C数组?

我目前遇到内存问题:我有一个用Fortran编码的主程序,它调用C / C ++子程序来执行某些任务并将数据存储在动态分配的数组中。 问题是我需要在返回Fortran主程序时访问这些数据。 我试图在fortran中声明一个C指针(TYPE(C_PTR))指向数组,但它似乎不起作用。 该数组存在于C子例程中,但是当我回到Fortran主程序时尝试访问它时会出现段错误。 我在这里提供我的代码,任何想法? 谢谢你的帮忙 !! Fortran语言: PROGRAM FORT_C use iso_c_binding IMPLICIT NONE interface subroutine call_fc(pX,s) bind(C,name=’call_fc_’) import integer(c_int) :: s type(c_ptr), pointer :: pX end subroutine end interface integer(c_int) :: i integer(c_int) :: s integer(c_int), pointer :: X(:) type(C_ptr), pointer :: pX s=100 call call_fc(pX,s) call c_f_pointer(pX,X,(/s/)) ! This here […]

从Fortran传递2d数组到C

我很难将Fortard中的二维数组传递给C函数。 但是,在所有支持之后,以下代码100%正常运行。 以下是我的C函数: #include void print2(void *p, int n) { printf(“Array from C is \n”); double *dptr; dptr = (double *)p; for (int i = 0; i < n; i++) { for (int j = 0; j<n; j++) printf("%.6g \t",dptr[i*n+j]); printf("\n"); } } 以下是我的Fortran代码: program linkFwithC use iso_c_binding implicit none interface subroutine my_routine(p,r) bind(c,name=’print2′) import […]

将分配的C_PTR传递给Fortran数组到C

我在访问C中的数组时遇到了segfaults的问题,这个数组在下面的Fortran文件中分配。 有一些调试的假象,例如文件写入不写任何有意义的事实,我初始化一个我从未使用的变量i 。 但是,我发现了以下内容: 没有初始化i (但仍然声明它):没有段错误 不在C中打开文件:没有segfault 不在代码中的其他地方打印HESS (不是HESS_COPY ):no segfault 用不同的名称声明和初始化i :segfault 有谁知道什么可能会引起这种行为? 段错误本身出现在ARRAY_PTR = C_LOC(HESS_COPY(1, 1)) 。 我正在使用gfortran和gcc编译调试标志(没有优化)。 valgrind说有一个无效的写(前两个文件是我在下面显示的文件): Invalid write of size 8 at 0xBEEA3E: get_pointer (modsparsehess.f90:34) by 0xA75D7A: print_hess (sparse_hessian_c.c:108) by 0x866C95: quench_ (quench.f:316) by 0x7F2DBE: mc_ (mc.F:368) by 0x4B65E2: mcruns_ (mcruns.f:62) by 0x459245: MAIN__ (main.F:430) by 0x45A33F: main (main.F:21) Address […]

应该如何将多个Fortran字符串传递给C?

要将Fortran字符串传递给C,还会使用变量的大小传递隐藏参数。 这是一个有效的fortran定义,以及C(实际上是C ++ / CLI)方法: interface subroutine AppendExtension( + Filename) + bind(C, name=”AppendExtension”) character *1, intent(inout):: Filename end subroutine AppendExtension end interface 这是被调用的C ++ / CLI: extern “C” { void __declspec(dllexport) __cdecl AppendExtension( char * name, int buffersize) { String^ clistr = gcnew String(name); clistr = System::IO::Path::ChangeExtension(clistr->Trim(), gcnew String(“OUT”)); IntPtr p = Marshal::StringToHGlobalAnsi(clistr); char *pNewCharStr […]

如何在Fortran中调用C函数并正确传递uint32_t参数

您好我使用Fortran 90代码来调用C函数。 由于我在操作地址,因此应该在Fortran中正确匹配C函数的参数。 我正在使用ifort和icc来编译代码并在64位机器上工作。 一些测试显示这也适用于int32_t ,虽然为了防止最终的陷阱,我想保留uint32_t 我调用的C函数有以下原型 uint32_t encode_(uint32_t x, uint32_t y) uint32_t decode_(uint32_t dec) 我不能仅仅通过做类似的事情来调用这些函数 integer :: cod,encode cod = encode(i,j) 这会产生胡言乱语。 因此我使用了一种解决方法: void code2d_(uint32_t j[] ){ uint32_t i; i=encode_(j[0],j[1]); // the underscore is due to the FORTRAN naming convention printf(“Coded %10d \n”,i); } 随后在Fortran integer :: cod,code2d cod = code2d(i,j) 显然,我对参数类型的不匹配有一些问题。 不幸的是我不知道如何解决这个问题。 由于在我的解码/编码函数中完成了二进制地址算法,因此保留uint32_t非常重要。

C可变函数与Fortran的互操作性

有没有办法声明一个C variadic函数并从Fortran调用它? 我需要调用此函数来计算用字符串标记的向量之间的一些点积。 我的想法是声明类似下面的内容,其中变量参数列表包含字符串文字。 如果变量参数列表为空,那么我将在标准标签之间进行查找并执行计算。 如果用户指定了两个标签,我会检索这两个向量并得到它们的点积: extern “C” void compute_dot_product(double * dot_product, …) { va_list args; va_start(args, NULL); char * label1 = va_arg(args, char *); if (!label1) { // Do standard label lookup and compute dot product } else { // Compute dot product between the vectors with the specified labels char * label2 = […]

混合编程Fortran和C.

我是理论物理研究专业的学生,​​从事宇宙学研究。 在我的研究过程中,我使用了相当庞大的Fortran代码库,并使用C来满足我的编程需求。 我已经能够在众多测试文件中链接这两个程序,并且它们的工作非常出色。 但对于他们来说,我一直在使用目标文件将它们全部链接起来。 但是当我尝试通过C运行真正的交易时,包括对Fortran头文件的引用。 它们似乎集成并相互调用,但Fortran头文件的格式与C编译器不兼容,因此当它跳转到头文件时,它会开始抛出无法理解语法的错误。 例如,Fortran头文件使用real * 8定义双变量,因此当C读取它们时会抛出错误。 文件中的注释也是如此。 所以,我想问一下,有什么方法可以解决这个问题吗? 即通过C使fortran格式头文件可读。 我查看了互联网,发现了令人困惑的答案,我不知道应该遵循哪一个。 任何有关此事的帮助将不胜感激:)

fortran77,iso_c_binding和c string

我试图从C调用一些Fortran77代码,但我没有找到传递C char数组的正确方法。 SUBROUTINE My_F_Code (c_message) BIND(C, NAME=’my_f_code’) USE ISO_C_BINDING IMPLICIT NONE CHARACTER*(C_CHAR) c_message CHARACTER*(256) f_message CALL C_F_POINTER( C_LOC(c_message), f_message) WRITE(*,*) f_message,LEN(f_message) END 这个方法适用于Fortran 90和target,指针说明符,但Fortran 77似乎没有这样的东西。 所以,上面的代码不编译。 BIND(C)强制参数c_message为大小1.如何访问c_message字符串的其他元素? 编译:GCC 4.8.2

c-fortran互操作性 – 带指针的派生类型

我有很长的fortran代码,必须从python中使用。 我决定做Fortran-> C-> Python接口。 我遇到了一个问题:我在包含的Fortran模块中派生了类型 double precision, allocatable 输入成员。 当我尝试用ifort编译时,我得到了(与gfortran类似): Each component of a derived type with the BIND attribute shall be a nonpointer, nonallocatable data component with interoperable type and type parameters 这实际上与英特尔编译器文档和Fortran 2003标准一致:第15.2.5点。 有没有办法访问带有allocatable或指针的Fortran“type”?