有关DLL的问题,能不能解决的都来看看,见者有分了

lifei 2001-05-21 01:34:00
我把fortran作成dll,用C调用
fortran格式如下用的是visual fortan5.0A
输入数组为 pnt is the inupt point x,y;ndata is the point amount
! ncont is the contour amount ;cont store the contour number
下 为输出
! output :: xx1,yy1 is the first group and xx2,yy2 is the second
! group ;xyid is the point amount ; last the lines must be
dll程序:
SUBROUTINE ACORD(pnt,ndata,ncont,cont,xx1,yy1,xx2,yy2,xyid)
!DEC$ ATTRIBUTES DLLEXPORT :: ACORD
!DEC$ ATTRIBUTES VALUE :: ndata,ncont,xyid
!DEC$ ATTRIBUTES REFERENCE :: pnt,cont,xx1,yy1,xx2,yy2
INTEGER(4) iseed
REAL(4) rnum,xx1(2401),yy1(2401),xx2(2401),yy2(2401)
REAL(4) PNT(1203,3), TETR(2401,3), XPNT(3,3), CONT(50), DET(2,3)
INTEGER(4) ITETR(2401,3), ISTACK(2401), KTETR(50,2), ITEMP(3,2)
integer(4) ndata
CHARACTER*32 FORM
.......

END SUBROUTINE
但是传值总是不对,后来在vb里也试了,单个的变量可以,可是数组总是不对,fortra缺省的是按照地址传,就是reference,应该没问题,就连数组在内存里的排列也考虑了,还是不行,后来我干脆倒退一步,作成一个伪dll,其实只是把fortran的主程序改为subroutine,输入输出不变,由dll去读写文件,并输出到文件里,不传入任何参数也不传回任何参数,只是调一个ACORD(VOID)结果调试的时候还是死了,不知道是什么毛病,那位大虾作过类似的指点一下
参数进栈应该没问题,我开始用c调,后来我哥们说vb的数组是和fortran相同的,传了几次还是数组出毛病,没办法,只好作成在dll里读写文件,调用的函数是 void function(void)其实就跟可执行文件差不多,我和我哥们都觉得这样和可执行文件没什么分别,而且影响速度,我们这个是离散点分析等值线的模块,测试用的是51个点,分析11条等值线,没有平滑,看不出速度,如果点数增加,估计大量的i/o肯定影响速度
反正我的分多的很下面两个有400分准备给了,见者有分了
http://www.csdn.net/expert/topic/95/95805.shtm
http://www.csdn.net/expert/topic/97/97513.shtm
...全文
92 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jmylf 2001-05-21
  • 打赏
  • 举报
回复
holyfire说的只是皮毛,的确在内存中数组的存放顺序fortran和C一个是先行后列,一个是先列后行.传递的时候,照上面写的是没错的,我调过类似的,一维都没问题,2维开始出毛病,我定义的干脆是integer(4) 和real(8) 之类的以便和VB或者C中的数据类型相对应,但是还有毛病,单个变量不会出现
jmylf 2001-05-21
  • 打赏
  • 举报
回复
你的问题我作过,有两种解决方法,作成DLL,在里面进行读写文件操作,或者干脆作成可执行,在BCB里用调waitobject 和single线程可以实现.其中我试过,可能是数组的排列方式不对,主要是传递方式不太好解决,fortran是按地址或者按值都可以,要在DLl里指定,C和VB其中向VB传数组,帮助说只要传递第一个值就可以,我试过,一维的可以,多维的就不行了,这方面我们可以一起研究一下. 31803353
wjzhuang 2001-05-21
  • 打赏
  • 举报
回复
关注!
yuyulily 2001-05-21
  • 打赏
  • 举报
回复
我也不会
holyfire 2001-05-21
  • 打赏
  • 举报
回复
FORTRN与C调用过程时的参数入栈次序正好相反,C 通过传值方式传递参数,FORTRAN 则通过传址方式传递参数。
在Fortrn中可以指定到用方式与C兼容,或者声明函数调用为PASCAL来使得C使用Forton的调用方式。Fornton中参数传递是按地址传递的,所以声明时函数的参数都为引用或指针。
luhongjun 2001-05-21
  • 打赏
  • 举报
回复
sorry ,fortran的不会。
jingtian 2001-05-21
  • 打赏
  • 举报
回复
我不会,我来学习的.

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧