Delphi如何与Fortran传递数组参数?(100分)

K

koala

Unregistered / Unconfirmed
GUEST, unregistred user!
在Fortran中定义如下:
subroutine test(a, b, c)
!MS$ATTRIBUTES ALIAS : 'MyTest' :: test
!MS$ATTRIBUTES DLLEXPORT :: test
!MS$ATTRIBUTES REFERENCE :: a,b,c
Integer a,b,c
dimension a(3), b(3), c(3)
integer i
do
i=1, 3
c(i)=a(i)+b(i)
enddo

end subroutine
Delphi如下定义:
procedure Test(var a, b, c :array of Integer);
Stdcall;external 'testdll.dll' name 'MyTest';
procedure TForm1.Button1Click(Sender: TObject);
var
a, b, c :array[1..3] of Integer;
i :integer;
begin
for i :=1 to 3do
begin
a :=i*30;
b :=i*5+50;
end;

Test(a, b, c);
for i:=1 to 3do
ListBox1.Items.add(InttoSTr(c));
end;
总是出错,
哪位大侠在Delphi中调用过Fortran的DLL, 请帮忙。
另外,Fortran中的COMMON数据如何与Delphi共用?
 
这样在fortran中声明:
!MS$ATTRIBUTES DLLEXPORT, C :: test
 
怎么样,你可看一下<a href="http://www.gislab.ecnu.edu.cn/delphibbs/dispq.asp?LID=151550">关于:为什么关掉我的程序,没道理呀?</a>
 
to Kzl:
对数组,用C约定与声明为REFERENCE 是一样的。
对于普通变量,我的调用是成功的,但数组却不成。
……
 
对不起,没仔细看。delphi种好象是这样调用:Test(a[1], b[1], c[1]);我原来做过,现在一时机不清楚了。你先试验一下,明天我查查我的代码。
另外,delphi中声明为开放数组好像不对,我记得必须声明为静态数组。非要这样的话,可使用指针或将数组的长度传递进去
 
to Kzl:
thanks.
的确要用静态数组,调用Test(a, b, c)就可以了。

 
delphi中可以声明为开放数组,下面的程序请运行一下。
var
Form1: TForm1;
a: array[1..3] of integer=(1,2,3);
b: array[1..3] of integer=(1,2,3);
c: array[1..3] of integer;
...
...
procedure MAdd(const a, b: array of integer;
var c: array of integer);
external 'D1.dll';
procedure TForm1.Button1Click(Sender: TObject);
begin
MAdd(a, b, c);
Label1.Caption := inttostr(c[1])+inttostr(c[2])+inttostr(c[3]);
end;
下面为dll
procedure MAdd(const a, b: array of integer;
var c: array of integer);
var i: integer;
begin
for i := 0 to High(a)do
c := a+b;
end;
exports
MAdd;
注意MAdd中动态叔祖的下标一定从0开始。
 
to kokusan :
Delphi Call Delphi'Dll is Ok. using dynamic array.

Now another Problem:
How to share COMMON block with Fortran?
大侠们请帮忙!
 
最好将COMMON快都用Module代替,在Module中声明函数来读写这些变量,
并将这些函数外显,这应该是最标准的方法了
 
关于Common data的部分已经解决了,
只要将Common Data 写成函数形式,变量作为参数传入既可。
分数大家有份。
 
顶部