Tag: fortran

可以从C或Fortran读取.Rdata文件格式吗?

我正在C上写一些R扩展(从R调用C函数)。 我的代码需要同时使用2个不同的数据集来计算统计量,我需要使用所有可能的对组合来执行此操作。 然后,我需要所有这些统计信息(非常大的数组)来继续C侧的计算。 这些文件非常大,通常约为40GB,这就是我的问题。 要在R调用的C上执行此操作,首先我需要加载R中的所有数据集以将它们传递给C函数调用。 但是,理想情况下,如果我能够直接从C或Fortran访问数据集,则可以按顺序在内存中同时维护这些文件中的2个: open file1 – open file2 – compute cov(1,2) close file2 hold file1 – open file3 – compute cov(1,3) … // same approach 这在R上很好,因为我可以加载/卸载文件,但是在调用C或Fortran时我没有任何加载/卸载文件的机制。 所以,我的问题是, 我可以直接从Fortran或C读取.Rdata文件,能够打开/关闭它们吗? 问题的任何其他方法? 据我所知,答案是否定的。 所以,我正在考虑从Rdata迁移到HDF5。

将c数组作为可变大小的矩阵传递给fortran

因此,我已经被委托将一些fortran子程序转换为C.这些子程序被称为主要在C中的大型程序的控制流程的一部分。 我正在逐个翻译函数,从调用堆栈顶部的函数开始。 我面临的问题是将数据从C传递到fortran。 假设我们在c中声明了一个数组 int* someCArray = (int*)malloc( 50 * 4 * sizeof(int) ); 现在,需要将此数组传递给fortran子例程以填充数据 someFortranFunc( someCArray, someOtherParams ); 当数组到达fortran land时,它被声明为一个可变大小的矩阵: subroutine somefortranfunc(somecarray,someotherparams) integer somefarray(50,*) 问题是fortran似乎没有正确调整数组大小,因为程序seg-faults。 当我调试程序时,我发现索引到 somefarray(1,2) 报告这是一个无效的索引。 对第一列中任何项的任何引用都可以正常工作,但是当它到达fortran时,数组中只有一个可用列。 我无法真正改变这是fortran中可变大小数组的事实。 任何人都可以解释这里发生的事情,有没有办法可以从C方面缓解问题? [编辑] 顺便说一下,fortran子程序是从替换的fortran代码中调用的 integer somedatastorage(plentybignumber) integer someindex … call somefarray(somedatastorage(someindex)) 其中数据存储是一个大的1d数组。 超出数据存储大小没有问题。 不过,不知何故,传递C数组和fortran(子)数组之间的差异导致了fortran子例程的差异。 谢谢!

MINLOC是否适用于从索引0开始的数组? (Fortran 90/95)

使用C一段时间后,我回到Fortran并在我的代码中将数组从索引0分配到N: real(kind=dp), dimension(:), allocatable :: a allocate(a(0:50)) 我需要找到数组最小绝对值的索引,所以我使用MINLOC,并检查这个我将它与MINVAL进行比较: minloc(abs(a(:))) minval(abs(a)) MINLOC的结果是指数42但MINVAL的结果相当于41 。 以下是输出的相关部分: Index ia(i) 39 0.04667 40 0.02222 41 0.00222 !This was clearly the minimum value 42 0.02667 MINLOC = 42 MINVAL = 0.00222 我假设这与Fortran内部没有正确处理索引为0的数组有关,因为以这种方式声明数组不是标准的Fortran样式(但它仍然是允许的!)。 任何人都可以确认这一点或提供解决方法吗?

从FORTRAN调用C代码

鉴于Microsoft FORTRAN 5.1和Microsoft C / C ++ 14.0,以及该版本FORTRAN附带的链接器(必须用于其他依赖项),如何创建C函数并从FORTRAN应用程序调用它?

程序统计工具

是否有一个工具能够解析我的源代码(fortran,C或C ++)并返回统计信息,如循环次数,平均循环大小,函数数量,函数调用次数,数量,大小和数组类型,变量等? 类似的东西,在我的架构上不易运行

Cython和fortran – 如何在没有f2py的情况下一起编译

最终更新 这个问题是关于如何编写一个setup.py ,它将编译一个直接访问FORTRAN代码的cython模块,就像C一样。 这是一个相当漫长而艰巨的解决方案之旅,但下面包含了完整的混乱。 原始问题 我有一个扩展,它是一个Cython文件,它设置一些堆内存并将其传递给fortran代码,以及一个fortran文件,这是一个古老的模块,我想避免重新实现,如果可以的话。 .pyx文件可以很好地编译为C,但是cython编译器会对.f90文件进行.f90 ,并出现以下错误: $ python setup.py build_ext –inplace running build_ext cythoning delaunay/__init__.pyx to delaunay/__init__.c building ‘delaunay’ extension error: unknown file type ‘.f90’ (from ‘delaunay/stripack.f90’) 这是我的安装文件(上半部分): from distutils.core import setup, Extension from Cython.Distutils import build_ext ext_modules = [ Extension(“delaunay”, sources=[“delaunay/__init__.pyx”, “delaunay/stripack.f90”]) ] setup( cmdclass = {‘build_ext’: build_ext}, ext_modules = ext_modules, … […]

C,C ++或Fortran的代码抛光器/重整器

假设您有一堆用C,C ++或Fortran编写的文件,由不同的作者编写,对格式化有不同的看法,如何评论,等等。 我想很多人都知道这样的情况。 有没有免费的工具,如: 统一的代码格式(缩进等) 创建标准评论机构 重命名变量 ?

无法将数组从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)) […]