制作Fortran dll并从C#中调用它
我在fortran可执行文件中具有一个函数,我需要将其制作为dll文件,以便我可以从C#程序 调用其功能 FUNCTION TSAT11(P) C ** IGNORE IMPLEMENTATION ** TSAT11 = SX*TSAT2(X) + SXL1*TSAT3-273.15 RETURN END p是浮点,功能返回float 这里我在fortran中什么都不知道或从C#打电话,所以请更多地解释. 我正在使用Compaq Visual Fortran和C#2008. 谢谢您的时间. (如果您愿意,可以看到完整的代码在这里 [这是一个计算水和蒸汽属性的程序]) 解决方案 这是一个使用单精密浮子的示例. fortran库包含: FUNCTION TSAT11(P) !DEC$ ATTRIBUTES ALIAS:'TSAT11' :: TSAT11 !DEC$ ATTR
0 2024-04-13
编程技术问答社区
从C#调用FORTRAN dll并向结构数组赋值
i可以将C# struct传递到FORTRAN中.我什至可以将C# struct的数组作为FORTRAN FORTRAN的数组.我遇到麻烦的地方是我尝试将值返回到C#中时.这是一个示例: fortran dll是: MODULE TESTING TYPE VALUEREF INTEGER*4 :: A ENDTYPE VALUEREF CONTAINS SUBROUTINE TEST_REF(T,N) !DEC$ ATTRIBUTES DLLEXPORT :: TEST_REF !DEC$ ATTRIBUTES ALIAS:'TEST_REF' :: TEST_REF !DEC$ ATTRIBUTES VALUE :: N IMPLICIT NONE INTEGER*4 :: A,I,N TYPE(VALUEREF) :: T(N) A = 100 DO I=1
0 2024-04-12
编程技术问答社区
C/Fortran二维数组(基础)
我有一些有关2D数组的基本问题,例如: double bn[NNODES][NBASIS] 1- c中的声明是什么?和fortran? 2-第一个[]用于行编号,第二个用于C和Fortran的列? 3-使用bn时,例如BN [i] [J]," I"索引用于行," J"是用于列的?在C和Fortran中? 4-仅适用于一个(例如i = 15)和整个行? 谢谢 解决方案 一些示例是针对一个掩盖一个问题的正方形矩阵. C和Fortran使用不同的内存布局用于多维数组. c是行 - 马约尔,而Fortran是专栏.参见 http://en.wikipedia.org/wiki/wiki/row-major_order .在两种语言之间工作时,可以在声明中进行处理,例如在C: 中进行处理. double array [20][10]; 和在fortran中,使用iso_c_binding内在模块: real (C_DOUBLE), dimensi
0 2024-04-10
编程技术问答社区
使用F2py进行分割的故障
这是我在这里问的一个问题的后续. 我如何将输入阵列分配给f2py? > 我已经回答评论了这个问题.最初的问题不清楚,太长了.请参阅下面的评论1. 我正在尝试使用F2PY来包装各种fortran子例程/函数来读取用Fortran 77编写的各种原子物理代码输出的数据.我使用的是Anaconda Python分布(Python 3.4 64 bit)在Ubuntu 14.04(python 3.4 64位)( 64位)带GNU编译器套件(GCC,GFORTRAN等) 我有问题试图在Python中进行预言.我最初的问题涉及分配角色阵列.原来我的形状错误.我已经解决了这个问题(我认为),现在正在处理细分错误.我已经使用--debug-capi标志将fortran子例程与f2py编辑,以启用详细的错误报告. 这是我运行Python脚本时获得的终端输出的相关部分. debug-capi:Python C/API function adf04_2py.xxdata_04(
0 2024-04-10
编程技术问答社区
从fortran中写出二进制文件并在C中读取
我正在尝试读取从Fortran程序生成的二进制文件.我的输出中有奇怪的角色,可能是Fortran和C都有不同的endianess? 解决方案 您应该使用 acces="stream" ,但没有未形成.它是在C I/O之后直接建模的,因此理解它不应有任何问题.它是Fortran 2003的一部分,所有现代编译器都实施了Afaik(甚至像Open64或NEC这样的先进). fortran和c都在同一台机器上使用相同的endianness,除非您使用特殊的编译器功能.在平台之间传输文件时可能是有问题的. 如果使用的Fortran程序 access="sequential", form="unformatted" 您将在记录定界符方面遇到问题. 文件写为 access="direct", form="unformatted" 可能还可以. 其他解决方案 Fortran将标题放入其二进制文件中,因此您只能
0 2024-04-10
编程技术问答社区
从fortran调用C语言(ifort, gfortran)。
我是C程序员,他必须通过在C函数中添加一个呼叫来更新一个巨大的Fortran 2003程序. 首先,我需要写一个最小的fortran包装器(在现代的,自由形式的fortran中,不喊叫),该包装将用包含循环计数器的字符串正确调用C函数(如果可能的日期/时间,如果可能) ,从循环中. 这应该是"简单的",但是我完成的搜索都没有产生足够的片段来创建一个工作程序. 我正在使用最近的64位版本的GFORTRAN和Intel Ifort编译器在64位Linux下,并且测试代码需要使用两个编译器进行编译. 这是C定义,在文件send_to_port.c中: int send_to_port(int port, char *data, unsigned int length); 添加了最后一个参数,以允许Fortran不必担心尾随的null(我在C:data [length] ='\ 0'';)中不必担心它.我了解fortran"自动"添加了长度参数,因此Fortra
0 2024-04-10
编程技术问答社区
从Fortran向C语言传递2D数组
我很难将2D阵列从Fortran传递到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
0 2024-04-10
编程技术问答社区
将接口模块程序从fortran导入C语言中
我应该如何使用extern? 将Fortran interface导入C 假设我有以下fortran模块: !swapper module module swapper interface swap module procedure swap_r, swap_i, swap_c end interface contains !subroutine implementations here: !swap_r takes two double precision as argument !swap_i takes two integers as argument !swap_c takes two characters as argument end module swapper 然后我可以在C中进行以下操作? extern "C" void __swapper_MOD_swap(double*, double*)
2 2024-04-10
编程技术问答社区
在Fortran和C程序之间向管道写入的问题
我有一个由其他人编写的程序,因此从标准输入中读取一些内容,然后进行一些计算并输出结果.我想做的是用我在C中编写的另一个程序中的不同输入数据运行多次.为此,我使用popen: FILE *pipe = popen(".\\program.exe", "wt"); if (!pipe) { exit(1); } fprintf(pipe, "%d\n", thing1); fprintf(pipe, "%d\n", thing2); ... pclose(pipe); 问题在于它不起作用.它与" program.exe 我在做什么错? 编辑: 不幸的是,我没有该程序的源代码 解决方案 看起来应该可以起作用,不确定为什么不这样做.你确定吗 popen()在Windows机器上可用吗?我隐约记得它 某些Windows系统不可用.你可以尝试 简单的C程序,看看它是popen()还是Fortran程序. 作为解决方法,您可以
0 2024-04-09
编程技术问答社区
fortran 64 bit hex BOZ
在C ++中,这被接受: uint64_t mask = 0x7FC0000FF80001FFLL; 但是在fortran integer(kind=8), parameter :: mask = Z'7FC0000FF80001FF' 不适合Gfortan. 我认为这两个都是64位值?还是不是? Gfortran抱怨: 算术溢出从转换整数(16)到整数(8) 编辑: 所以,对不起,这是一些更扩展的问题描述. 我将在Fortran中进行一些换档,并在C ++中使用一些示例代码. 在示例C ++代码中,掩模是定义的: typedef uint64_t mask; static const mask dilate_2 = (mask)0x7FC0000FF80001FFLL ; static const mask dilate_1 = (mask)0x01C0E070381C0E07LL ; static const mask dilate_
0 2024-04-09
编程技术问答社区
向C语言子程序传递Fortran整数阵列,只传递第一个元素
我试图将整数数组从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_
0 2024-04-09
编程技术问答社区
使用MPI在进程之间共享大量数据
我的主要问题是如何将自定义的类型/结构的成员与通过mpi_win_allocate_shared分配的类型/结构(size,size,disp,...&baseptr,&win)相关联.感谢C或Fortran的帮助!下面我包括了我想在C和Fortran中做什么的草图. C中的一个示例大致如下: struct MyStruct{ int * ptr_int; double * ptr_dble; }; main(){ int n1,n2,n3; struct * data; // I am looking to use MPI to allocate a struct equivalent to the following: // data = calloc(n3,sizeof(struct MyStruct)) // for (int i=0;i
0 2024-04-09
编程技术问答社区
编写将int返回给Fortran的C函数
最终,我试图编写一个IPC计算器,用于使用Fortran来计算和C来传递两个Fortran程序之间的数据.当我完成时,希望看起来像: Fortran program to pass input -> Client written in C -> Server written in C -> Fortran program to calculate input and pass ans back C客户端/服务器部件已经完成,但是目前我被困在试图编写一个程序中输入的程序,将其传递给计算答案的C程序.但是,我看到了怪异的行为. fortran程序 program calculator !implicit none ! type declaration statements integer x x = 1 ! executable statements x = calc(1,1) print *, x end
0 2024-04-09
编程技术问答社区
Fortran to C , 修剪对分配给字符串的空间的影响
我有一个调用C函数的Fortran子例程. C函数的参数之一是Fortran字符串.它被初始化为长度为512字节的空字符串,并以trim(str)//char(0)的方式传递到C函数,即修剪并附加了A \0,以使C将其strlen视为0. character(len=512) :: str = "" call C_foo ( trim(str)//char(0) ) 现在在C函数中, 我可以做这个 吗 strncpy (str, "something", strlen("something") ) 我想知道的是,由于trim是其 docs ,将其传递给C实际上会更改分配给它的空间吗?在C函数中,strncpy会失败(就源字符串的长度 解决方案 详细说明我的评论,而无需进入" C"做什么,请考虑这个纯粹的fortran示例: character(len=512) :: g="" call f(trim(g)) end subroutine f(s) ch
0 2024-04-09
编程技术问答社区
混合编程。从C语言调用FORTRAN语言
我必须在C/C ++调用Fortran子例程时做概念证明. 我不知道我朝着正确的方向朝着什么,请指导我.. 我所做的是... 我写了以下fortran代码 INTEGER*4 FUNCTION Fact (n) INTEGER*4 n INTEGER*4 i, amt amt = 1 DO i = 1, n amt = amt * i END DO Fact = amt END SUBROUTINE Pythagoras (a, b, c) REAL*4 a REAL*4 b REAL*4 c c = SQRT (a * a + b * b) END 使用g77 AS g77.exe -c FORTRANfun.for 对其进行了编译 我写了以下C代码... #include extern int __stdcall FACT (int n); extern void __stdcall PYTHAGORAS (float a,
0 2024-04-09
编程技术问答社区
从c++调用FORTRAN库的问题
我遇到问题,当将函数放入使用" ar rcs"创建的库中时,从C ++调用Fortran子例程. fortran例程(tt.f90)是: Module A contains Subroutine SubIF2(ii) Integer*8, Intent(In) :: ii write(*,*) "hello", ii End Subroutine SubIF2 End Module A a C ++呼叫者(testcpp.cpp)代码是 #include using namespace std; extern"C" { void __a_MOD_subif2(long long int *ii); } main(){ long long int ii=5; __a_MOD_subif2(&ii); return 0; } fortran呼叫者(testf.f90)代码是 Program test
0 2024-04-09
编程技术问答社区
如何绑定f fortran中C的Char **论点?
我需要在fortran中绑定C函数. C函数的原型像 /* If argv[i] is NULL, then i is the length of argv[] */ int foo(char* argv[]); 我想在Fortran子例程栏中致电FOO ! If argv(i) is a blank string, then i is the length of argv. ! Constant MAX_STRING_LEN is the maximal length of any possible element in argv. subroutine bar(argv) character(len=*), intent(in) :: argv(*) character(kind=c_char), dimension(*), allocatable :: argv_c(*) !??? ! convert argv to argv_c element
4 2024-04-09
编程技术问答社区
在Fortran和C之间传递字符串
弗里斯特(Frist)我是将C(和CPP)与Fortran结合的新手.而且我是Fortran的新手.我一直在研究其他示例,并阅读有关ISO C绑定的信息.但是我很困惑为什么这不起作用.目前,我对指针如何与C一起使用. 有人可以解释一下我在这里做错了什么? program main use iso_c_binding implicit none character (len=100) :: string interface !char *foo2() character (kind=c_char, len=1) function foo2() bind(c,name='foo2') use iso_c_binding implicit none character (kind=c_char, len=1) :: output end
0 2024-04-09
编程技术问答社区
从FORTRAN到C++传递大量的数据
将大量数据(双数)从Fortran程序传递到C ++程序的最佳和最有效的方法是什么?现在我正在使用二进制文件,但还不够快! 我尝试了管道.我跟随 http://msdn.microsoft美国/库/MS682499(vs.85).aspx 用于C ++部分.但是对于Fortran部分(这是子处理器),我不知道如何正确编写数据.我必须像WRITE(*,*) AllTheNumbers那样在控制台上写入吗?因为在控制台上写作需要很多时间! 我的fortran代码编写数据: DO 281 I=1,NDOF DO 280 J=1,UBW IF (S(I,J).NE.0) THEN WRITE (*, 2770) I,(J+I-1) WRITE (*,2760) (S(I,J)) ENDIF 280
0 2024-04-09
编程技术问答社区
含有派生类型的Fortran派生类型可以从C语言访问
作为此帖子,我的派生类型作为成员本身的派生类型.下面的示例: module simple use iso_c_binding TYPE SIMPLEF INTEGER :: A INTEGER, POINTER :: B, C(:) END TYPE SIMPLEF TYPE COMPLEXF INTEGER :: X TYPE (SIMPLEF) :: Y END TYPE COMPLEXF end module simple 与上面的文章一样,目的是在C中具有类似的派生类型,并能够将值来回传递给Fortran.可以看到该解决方案在这里.但是,这里不仅是一种派生类型,它是一种派生类型,其成员是派生类型本身.我是否需要为y,即sety_a,queryy_a,sety_b,queryy_bsize,squeryy_b等的每个成员为复杂F,子例程创建?还是有更好的方法来解决这个问题? 解决方案 可以使用相同的方法.最好的是取决于您认为C客户与Fortr
2 2024-04-09
编程技术问答社区