有关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
...全文
134 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
  • 打赏
  • 举报
回复
我不会,我来学习的.
源码链接: https://pan.quark.cn/s/8ddf8a1c92f9 **libcurl用于获取大型文件**libcurl作为一个开源的C语言库,提供了一系列的API来处理与URL相关的任务,涵盖了HTTP、FTP、SMTP等多种网络协议的应用。在执行大型文件的下载操作时,libcurl展现出卓越的性能表现和高度的灵活性,能够高效地管理大文件传输过程,有效预防内存溢出及其他潜在问题。**libcurl的基础操作**libcurl的基础应用包括以下几个环节:1. **初始化**:需要借助`curl_global_init()`函数来启动libcurl的工作环境。2. **建立会话句柄**:通过`curl_easy_init()`函数创建一个会话句柄,该句柄将用于后续所有的操作流程。3. **配置选项**:运用`curl_easy_setopt()`函数来设定多种参数,例如目标URL、超时时间、重试次数以及数据写入的回调函数等。4. **执行请求**:调用`curl_easy_perform()`函数来实施下载操作。5. **释放资源**:使用`curl_easy_cleanup()`函数来释放已经占用的资源。**获取大型文件时的重要设置**1. **数据写入回调函数**:在处理大型文件下载时,通常不希望一次性将整个文件载入内存。可以配置`CURLOPT_WRITEFUNCTION`选项,指定一个回调函数来处理接收到的数据片段,这样libcurl在接收到数据时会调用该函数,使得我们可以按需将数据写入文件或缓冲区。2. **缓冲策略**:可以设定缓冲区的大小(比如,通过`CURLOPT_BUFFERSIZE`),来控制每次接收数据的数量,从而优化内存...
内容概要:本文档整合了《鬼谷子·决篇》与《三略·审权变第三》《差德行第四》三大古代智慧典籍,构建了一套“决策+形势+用人”三位一体的领导力提升体系。通过28天三合实战路径、三维诊断工具、9个实用模板及独特的“身体锚点”仪式,系统解决管理者在决策犹豫、形势误判、人岗错配等方面的痛点。全文涵盖理论溯源、方法论拆解(如三步决策法、审权变四步法、差德行四步法)、历史案例对照(范蠡 vs 项羽)以及跨资源联动建议,形成从认知到实践的完整闭环。; 适合人群:中基层管理者、创业者、职场进阶者,尤其是面临决策困境、环境适应困难或团队用人问题的人群;具备一定管理经验或自我提升意识的个体亦可受益。; 使用场景及目标:① 提升重大事项的决策质量,避免反复纠结与事后后悔;② 增强对外部环境变化的敏感度与应对能力,实现灵活调整;③ 科学评估人才德才素质,实现人岗精准匹配,减少用人失误;④ 构建个人化的决策-应变-用人标准化流程(SOP)。; 阅读建议:建议按照28天路径逐步实践,结合自测表定位短板,优先突破薄弱模块;配套工具模板需实际填写使用,配合身体锚点仪式强化行为记忆;可与“诸葛亮决策术”“立将威信术”等单品联动,全面提升领导力体系。

13,874

社区成员

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

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