1. 关于 subroutine 和 function,本质上是一样的,当然写法会有一些差别。详情你可以观看本站视频教程 http://v.fcode.cn/video-subroutine_and_function.html 2.混编是需要两种语言彼此配合的,而不是随意改动其中一个。 3.你在 fortran 里面是写了参数了,可是 C 语言的代码里并没有对应的“虚参” 4.我强调了很多很多次,让你先学会单独使用 fortran 的函数和子程序。然后再学习混编。你连一点点函数调用的“概念”都没有,怎么可能学会混编呢? 5.如果你要使用 common 来共享数据,那么 fortran 也有办法实现。详情请参考《Modern Fortran Explained》第12章 |
fcode 发表于 2015-12-23 18:32 群主大人,我这个程序在CVF上是链接上的,没有任何问题,出来的结果也是对的,我现在要做的工作就是把它移植到IVF上,所以我的问题是接口的问题,所有的虚参都是有定义的,在CVF上是通过COMMON /FLAG/ 和strctflag进行链接的,现在在IVF上这个链接不起作用了,所以我需要在fortran里面写一个接口让它链接上。 我这样写接口对吗: [Fortran] 纯文本查看 复制代码 USE ISO_C_Binding INCLUDE 'CHEM.TXT' C+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ TYPE, BIND(C) :: incrmnt C DOUBLE PRECISION(C_DOUBLE) :: y[lenth] C DOUBLE PRECISION(C_DOUBLE) :: ddy[lenth] C DOUBLE PRECISION(C_DOUBLE) :: above[lenth] C DOUBLE PRECISION(C_DOUBLE) :: below[lenth] INTEGER(C_int) :: bf,js,gross C Type(C_PTR), value :: incrmnt *lchild C Type(C_PTR), value :: incrmnt *rchild C Type(C_PTR), value :: incrmnt *father END TYPE incrmnt C TYPE, BIND(C) :: strctflag INTEGER(C_INT) :: IFLAG,NONEAR,GSN,GSO END TYPE strctflag C TYPE, BIND(C) :: ssflag INTEGER(C_INT) :: nstep,ifind,iinteg,ienlge,irecrd END TYPE ssflag C INTERFACE integer(c_int) subroutine bisrch BIND(C, Name="bisrch" ) c import c integer compar(type incrmnt *,type incrmnt *); c TYPE(C_PTR), VALUE :: p c integer(c_int),value :: flag,i END subroutine bisrch END INTERFACE type (incrmnt) :: fst C--------------------------------------------------------------- C的部分我没有改动,还跟昨天的帖子里面一样,如下: [C] 纯文本查看 复制代码 integer(c_int) subroutine bisrch BIND(C, Name="bisrch" ) c import c integer compar(type incrmnt *,type incrmnt *); c TYPE(C_PTR), VALUE :: p c integer(c_int),value :: flag,i END subroutine bisrch 我的接口主要就是在fortran里面添加的那一段,所以我在上个回复中只是粘贴了添加的那一部分,对不起,后来你跟我说subroutine和function在接口中的处理方式不一样,所以我又将C里面的函数bisrch()改成了上个回复中的样子,因而也没有把声明的部分写出来,实在抱歉。上面这两段在通过我写的接口编译没有问题,但是还是链接不上来,相当于没起到接口的作用,我想问一下问题出在哪里? 不好意思搞的这么麻烦你,十分感谢! |
1. function 和 subroutine 都可以。并没有本质区别。 2. 你必须把你所需要传递的变量都写在虚参列表里。 3. 所有的虚参都需要定义 4. 我建议你先学会如何单独使用 Fortran 的 function 和 subroutine,然后再学习混编。 |
fcode 发表于 2015-12-23 11:10 给你添麻烦了,十分抱歉! |
fcode 发表于 2015-12-23 11:10 我捣鼓了一中午,实在是不知道应该怎么办,范例里面写的我感觉自己看懂了,但是到了我自己要改动的时候,又不知道看了些啥,实在是抱歉这么打扰你,我现在也只能边做边学,老板给的东西比较大而且杂,我真的没办法从头学起,如果您有空,请尽可能详细的指点一下我,十分感谢!!! |
fcode 发表于 2015-12-23 11:10 是不是说subroutine就不行,必须要用function?可是我把他换成这种形式还是没有链接上啊? fortran的部分: [Fortran] 纯文本查看 复制代码 INTERFACE c integer(c_int) subroutine bisrch BIND(C, Name="bisrch" ) c import c integer compar(type incrmnt *,type incrmnt *); c TYPE(C_PTR), VALUE :: p c integer(c_int),value :: flag,i c END subroutine bisrch END INTERFACE C的部分: [Fortran] 纯文本查看 复制代码 SUBROUTINE ISAT 1 (ELWRK, LRW, IELWRK, LIW, ANDTOL, EPSTOL, RNDTOL, STRIDE, YALL) USE ISO_C_Binding INCLUDE 'CHEM.TXT' C+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ TYPE, BIND(C) :: incrmnt C DOUBLE PRECISION(C_DOUBLE) :: y[lenth] C DOUBLE PRECISION(C_DOUBLE) :: ddy[lenth] C DOUBLE PRECISION(C_DOUBLE) :: above[lenth] C DOUBLE PRECISION(C_DOUBLE) :: below[lenth] INTEGER(C_int) :: bf,js,gross C Type(C_PTR), value :: incrmnt *lchild C Type(C_PTR), value :: incrmnt *rchild C Type(C_PTR), value :: incrmnt *father END TYPE incrmnt C TYPE, BIND(C) :: strctflag INTEGER(C_INT) :: IFLAG,NONEAR,GSN,GSO END TYPE strctflag C TYPE, BIND(C) :: ssflag INTEGER(C_INT) :: nstep,ifind,iinteg,ienlge,irecrd END TYPE ssflag C INTERFACE subroutine bisrch() BIND(C, Name="bisrch" ) C function bisrch(pst) BIND(C, Name="bisrch" ) C import C Type(C_PTR) , value :: pst C integer compar(type incrmnt *,type incrmnt *) C TYPE(C_PTR), VALUE :: p C integer(c_int),value :: flag,i C END function bisrch END subroutine bisrch END INTERFACE C type (incrmnt) :: fst type (strctflag) :: fst C type (ssflag) :: fst C--------------------------------------------------------------- EXTERNAL BALNCE [C], INSRTD [C], ENLRGE [C], & FRMEM[C], STATIS[C], FUN, JAC DIMENSION YALL(KMAX), YTMP(KMAX), YQ(KMAX) DIMENSION ELWRK(LRW),IELWRK(LIW) INTEGER(4) nstep, ifind, iinteg, ienlge, irecrd INTEGER(4) IFLAG, NONEAR, BF, GS, JS, GSN, GSO, GROSS DOUBLE PRECISION ABOVE, BELOW, Y, DDY DIMENSION Y(KMAX),DDY(KMAX),RTOL(KMAX),ATOL(KMAX) DIMENSION ABOVE(KMAX+1),BELOW(KMAX+1),RPAR(KMAX),IPAR(KMAX) c real*4 contm,difftm,chemtm,dintm,isatm,intgtm,srchtm,deltm, & slargetm,baltm,tmchm,tmchm0 common /stime/ difftm, contm, chemtm, dintm, isatm, intgtm, & srchtm, deltm, slargetm, baltm common /sflag/ nstep, ifind, iinteg, ienlge, irecrd common /ode/ neq, mf, itol, iopt, itask, istate,rtol, atol c COMMON /FIND/ Y, DDY, ABOVE, BELOW, BF, JS, GROSS COMMON /strctflag/ IFLAG, NONEAR, GSN, GSO DO I = 1, KK+1 YTMP(I) = YALL(I) Y(I) = YTMP(I) END DO TMPTM0 = SECNDS(0.0) call bisrch TMPTM = SECNDS(0.0) SRCHTM = SRCHTM + (TMPTM - TMPTM0) 群主大人求帮忙! |
你需要把所需的变量传递过去。把计算结果传递回来。混编并不是彻底的打通 fortran 和 c ,让他们可以自由的访问彼此的变量。 |
fcode 发表于 2015-12-23 10:35 群主,改了之后现在编译通过了,但是接口还是没有接上?请问是为什么? TMPTM0 = SECNDS(0.0) call bisrch TMPTM = SECNDS(0.0) SRCHTM = SRCHTM + (TMPTM - TMPTM0) 是我这样的调用不对吗还是? |
fcode 发表于 2015-12-23 10:35 速度太快了,我都没来的急~ |
捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )
GMT+8, 2024-11-24 02:58