Tag: fortran iso c binding

无法将数组从FORTRAN传递到C.

我试图将一个维度数组从FORTRAN程序传递给C. 调用C函数,但它保存的值是垃圾。 但是如果我尝试使用整数变量调用相同的函数,我可以传递所需的值。 任何人都可以帮我解决这个问题吗? 我使用的代码与此类似 文件:fortran_prog.f program test real*4 :: a(4) data a / 1,2,3,4 / call test_func(a) end program test 文件:c_prog.c int test_func(double a[]) { int i; for(i=0;i<4;i++) { printf("%f\n",a[i]); } return 0; }

使用iso_c_binding在Fortran-C桥中的字符串数组

我正在编写将使用Fortran的C互操作性机制从Fortran调用C函数的代码(在Fortran 2003中引入并在较新版本的gfortran和ifort中实现)。 这个答案几乎就是我所需要的,但我不能完全了解我应该在Fortran中使用哪个接口声明来获得一个看起来像这样的C函数: int use_array(int n, char * array[]){ int i; for(i=0; i<n; i++){ printf("Item %d = %s\n",i,array[i]); } return n; } 我不清楚Fortran端的接口应该是什么声明: interface function use_array(n, x) bind(C) use iso_c_binding integer (c_int) use_array integer (c_int), value :: n character(c_char) WHAT_SHOULD_GO_HERE? :: x end function use_array end interface 我知道我也必须处理空终止问题。

如何在C语言中“调用”fortran例程中分配一个数组

我认为头衔说我需要什么。 我知道我们可以使用“asd”函数来执行此操作,但由于某些原因,我需要在Fortran中进行分配(即在子例程“asd_”中)。 这是C代码: #include void asd(float **c) { *c = (float *) malloc (2*sizeof(float)); **c =123; *(*c+1)=1234; } void asd_(float **c); main () { float *c; asd_(&c); // asd(&c); would do the job perfectly printf(“%f %f \n”,c[0],c[1]); return 0; } 这是Fortran代码: subroutine asd(c) implicit none real, pointer, allocatable ::c(:) print *, associated(c) if(.not. associated(c)) allocate(c(2)) […]

将数组从C / C ++传递给Fortran并返回计算出的数组

我试图将数组从C / C ++传递到Fortran 2003模块,并将计算值返回到C / C ++。 我已经能够传递并返回单个值(标量),但是来回获取数组很难。 我在标量值上发现了许多线索,并且我已经成功地完成了这些工作。 在我的工作标量函数之后,我已经建模了基于数组的函数。 我正在使用gcc / gfortran。 这是Fortran模块(ConvertUnitsLib.f03)。 module ConvertUnitsLib use :: iso_c_binding ! for C/C++ interop real(c_double), bind(c) :: degF, degC public DegCtoF contains ! ! Convert temperature degrees Celsius Fahrenheit ! real(kind = c_double) function DegCtoF(degC) result(degF) & & bind(c, name = “DegCtoF”) real(c_double), intent(in), dimension(:) […]

在Fortran代码中调用C函数/子例程

我正在尝试编译和链接调用c子例程的Fortran代码: Fortran代码: program adder integer a,b a=1 b=2 call addnums(a,b) stop end program C代码: void addnums( int* a, int* b ) { int c = (*a) + (*b); /* convert pointers to values, then add them */ printf(“sum of %i and %i is %i\n”, (*a), (*b), c ); } 我使用以下命令在Windows环境中编译和链接。 ifort -c adder.f cl -c […]

将fortran 77函数传递给C / C ++

有可能将fortran 77函数作为回调函数指针传递给C / C ++吗? 如果是这样,怎么样? 我在网上找到的信息与fortran 90及以上相关,但我遗留的代码库是77。 非常感谢

将Fortran的二维数组传递给C.

我无法将Fortran中的二维数组传递给C.以下是我的C函数,它只是在屏幕上显示数组元素。 #include void print2(double *arr , int *n) { int y = *n; printf(“\ny = %d”, y); for(int i =0; i<y; i++) { for (int j = 0; j < y; j++) printf("%.6g", *((arr + i*y) + j)); printf("\n"); } } 到目前为止,我的Fortran代码如下: program linkFwithC use, intrinsic :: iso_c_binding implicit none real, dimension(3,3)::a a(1,1)=1 a(1,2)=2 a(1,3)=3 […]

Fortran派生类型,包含可从C访问的指针

我有一个Fortran代码,其中包含许多包含指针的派生类型。 我正在编写一个需要访问这些变量的C ++代码。 我不能在没有指针的情况下重写这些派生类型,因为它们在Fortran代码的数百个不同的地方使用。 以下是示例代码: module simple use iso_c_binding TYPE,bind(C) :: SIMPLEF INTEGER :: A INTEGER, POINTER :: B, C(:) END TYPE SIMPLEF end module simple 我需要从C访问SIMPLEF派生类型。我知道我不能使用它,因为Fortran指针不能在派生类型中,如果它应该可以从C访问。有任何解决方法吗? EXTENSION:作为前一个问题的扩展(由于IanH解决了),我已经派生出了具有成员派生类型的类型。 示例如下: TYPE COMPLEXF INTEGER :: X TYPE (SIMPLEF) :: Y END TYPE COMPLEXF 我是否需要为每个Y成员创建COMPLEXF子程序,即SETY_A,QUERYY_A,SETY_B,QUERYY_BSIZE,QUERYY_B等? 或者有更好的方法来解决这个问题吗?

创建一个返回char *的C函数的FORTRAN接口

现在,我已经对此持续了大约一个星期,并且在论坛之后搜索了论坛,以便清楚地解释如何从C向FORTRAN发送char *。 为了让事情更令人沮丧,从FORTRAN向C发送char *参数是直截了当的…… 从FORTRAN向C发送char *参数(这很好): // The C header declaration (using __cdecl in a def file): extern “C” double GetLoggingValue(char* name); 来自FORTRAN: ! The FORTRAN interface: INTERFACE REAL(8) FUNCTION GetLoggingValue [C, ALIAS: ‘_GetLoggingValue’] (name) USE ISO_C_BINDING CHARACTER(LEN=1, KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: name END FUNCTION GetLoggingValue END INTERFACE ! Calling the function: GetLoggingValue(user_name) 当尝试使用类似逻辑从C返回char *时,我遇到问题后出现问题。 […]