cfortran 发表于 2017-7-13 15:58 在ivf安装目录下找到ifconsol.lib 并且记下它的路径(复制) 然后在vs的工程属性“库目录”里,粘贴上这个路径。 |
pasuka 发表于 2017-7-13 16:22 嗯嗯 这个能看懂 |
cfortran 发表于 2017-7-13 16:19 ivf帮助文档啃不动,ivf自带的sample 代码总归看得懂吧?! |
pasuka 发表于 2017-7-13 16:02 嗯 也在看modern fortran explained 这本书上的介绍 无奈英语渣的不行 只能一个词一个词的查。。。。。。 |
本帖最后由 pasuka 于 2017-7-13 16:03 编辑 为啥不能先看看ivf帮助文档和范例呢? Intel® Fortran Compiler XE 12.1 User and Reference GuidesMixed Language Programming[size=14.6667px]Parent topic: Compiler Reference [size=14.6667px]
http://scc.ustc.edu.cn/zlsc/sugo ... /main_for/index.htm |
kyra 发表于 2017-7-12 21:03 链接时出现错误error LNK1104:无法打开文件‘ifconsol.lib’ 我在附加依赖项中添加ifconsol.lib后还是不行。请问这个怎么解决 ps:我已经把fortran编译得到的source1.obj文件添加到了C++的项目里了 |
kyra 发表于 2017-7-12 21:03 嗯 多谢了 我再试试 |
module中的函数,和普通的外部函数一样的。直接写 Bind( C , Name ) 就可以了。 你目前的设计,最难的地方在于,你要在 type singleinfo 结构中包含 allocatable 的数组 pointchain ,这是比较困难的。 这一实现,由于fortran和C均没有标准的底层实现。所以标准的混编也就无法实现。 一般的做法是,把allocatable数组单独放在外面当做另外的参数进行传递。fortran不必关心它在C++里是静态的还是动态分配的。 排除这几个数组之外,我写了一个范例给你: [C++] 纯文本查看 复制代码 module hydromodelUtil implicit none double precision, parameter :: pi=3.141593d0 type singleinfo integer :: controlno integer :: unittype integer :: solid double precision :: coearea double precision :: volume double precision, dimension(3) :: center integer :: pointcount, trianglecount double precision, dimension(:,:), allocatable :: pointchain double precision, dimension(:,:,:), allocatable :: trianglechain end type singleinfo contains subroutine cylindermeshing(r, h, cylinderinfo) implicit none double precision :: r, h type(singleinfo) :: cylinderinfo integer :: polyedge=60 double precision, dimension(:,:), allocatable :: point double precision :: dtheta integer :: meshi dtheta=2*pi/real(polyedge) cylinderinfo%volume=(0.5d0*polyedge*sin(dtheta)*r**2)*h cylinderinfo%center=(/ 0.0d0, 0.0d0, 0.5d0*h /) cylinderinfo%pointcount=2*polyedge cylinderinfo%trianglecount=4*polyedge allocate(point(2,polyedge+1) ) do meshi=1, polyedge, 1 point(1,meshi)=r*cos( (real(meshi)-1.0d0)*dtheta) point(2,meshi)=r*sin( (real(meshi)-1.0d0)*dtheta) end do point(:, polyedge+1)=point(:, 1) do meshi=1, polyedge, 1 cylinderinfo%pointchain(1:2,meshi)=point(1:2,meshi) cylinderinfo%pointchain(3,meshi)=0.0d0 cylinderinfo%pointchain(1:2,polyedge+meshi)=point(1:2,meshi) cylinderinfo%pointchain(3,polyedge+meshi)=h end do end subroutine cylindermeshing function thirddet(deta) double precision, dimension(3,3) :: deta double precision :: thirddet thirddet=deta(1,1)*(deta(2,2)*deta(3,3)-deta(3,2)*deta(2,3)) & & -deta(2,1)*(deta(1,2)*deta(3,3)-deta(3,2)*deta(1,3)) & & +deta(3,1)*(deta(1,2)*deta(2,3)-deta(2,2)*deta(1,3)) end function thirddet end module hydromodelUtil [Fortran] 纯文本查看 复制代码 #include <iostream> struct singleinfo{ int controlno; int unittype; int solid; double coearea; double volume; double center[3]; int pointcount , trianglecount; }; extern "C" { void cylindermeshing( double & , double & , struct singleinfo * ); double thirddet( double * ); } using namespace std; int main() { struct singleinfo cylinderinfo; double r = 3.0; double h = 4.0; cylinderinfo.controlno = 1; cylinderinfo.unittype = 2; cylinderinfo.solid = 3; cylinderinfo.coearea = 4; cylinderinfo.volume = 5; cylinderinfo.unittype = 6; cylinderinfo.pointcount = 7; cylinderinfo.trianglecount = 8; cylinderinfo.center[0] = 11; cylinderinfo.center[1] = 11; cylinderinfo.center[2] = 11; cylindermeshing(r, h, &cylinderinfo); double deta[3][3]; for (int i = 0; i < 3; i++){ for (int j = 0; j < 3; j++){ deta[j][i] = j*4 + i; } } cout << thirddet( &deta[0][0] ); } |
捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )
GMT+8, 2024-11-24 00:37