开启辅助访问 切换到窄版
搜索

Fortran Coder

 找回密码
 极速注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

[复制链接]

Delphi 调用 Fortran 编译的 DLL

[混编]
cbwang 发表于 2016-12-19 19:49:57 查看127 回复2 阅读模式

搞了很久才搞清楚如何二者混编,先上代码

Delphi中的:
[Delphi] 纯文本查看 复制代码
type
  Tvar=function(a:integer;b:array of real):real;stdcall;

procedure TForm1.Button1Click(Sender: TObject);
var shuzu:TFarProc;
    onehandle:THandle;
    myf:Tvar;
    sz:array of Real;
    i:Integer;
begin
   SetLength(sz,StrToInt(Edit2.Text));
   for I := Low(sz) to High(sz) do
     begin
       sz[i]:=Random(100);
       Memo1.Lines.Add(FloatToStr(sz[i]));
     end;

   onehandle:=LoadLibrary('D:\TestDll.dll');
   try
     if onehandle <> 0 then
     begin
       shuzu:=GetProcAddress(onehandle,'Sortandfindmax');
     end;

     if shuzu <> nil then
     begin
       myf:=tvar(shuzu);
       Edit1.Text:=FloatToStr(myf(Length(sz),sz));
       for I := Low(sz) to High(sz) do
         Memo2.Lines.Add(FloatToStr(sz[i]));
     end;
   finally
     FreeLibrary(onehandle);
   end;
end;

Fortran中的
[Fortran] 纯文本查看 复制代码
FUNCTION SORTANDFINDMAX(LENGTH,ARRAY)
!------------------------------如果将变量的顺序调换为 ARRAY,LENGTH,那么就出现传输数组时数组长度少一位
!DEC$ ATTRIBUTES DLLEXPORT::SORTANDFINDMAX
!DEC$ ATTRIBUTES STDCALL,ALIAS:'Sortandfindmax'::SORTANDFINDMAX
DOUBLE PRECISION ::ARRAY(LENGTH)
INTEGER::I,J
DOUBLE PRECISION::SORTANDFINDMAX,TEMP
SORTANDFINDMAX=ARRAY(1)
DO I=1,LENGTH-1
    DO J=I+1,LENGTH
        IF(ARRAY(I).GT.ARRAY(J)) THEN
            TEMP=ARRAY(I)
            ARRAY(I)=ARRAY(J)
            ARRAY(J)=TEMP                                      不讨论算法效率
            SORTANDFINDMAX=ARRAY(J)
            END IF
    END DO
    END DO
END

哪位给指点一下,为什么需要将数组放在最后呢
无标题.png
回复

使用道具 举报

fcode 发表于 2016-12-20 08:35:46
我手上没有 Delphi,你能不能把 数组在前,数组在后,分别编译成2个exe,然后压缩以后传上来?
pasuka 发表于 2016-12-20 14:48:04
[Fortran] 纯文本查看 复制代码
implicit none


[Fortran] 纯文本查看 复制代码
implicit a-h,o-z

都没有,编译器凭啥认定length就是整数?!
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则 长代码粘贴

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表