动态数组问题(100分)

  • 主题发起人 主题发起人 Afflatus
  • 开始时间 开始时间
A

Afflatus

Unregistered / Unconfirmed
GUEST, unregistred user!
我要引用C语言编译的Matrix.DLL中的一个函数:
brmul(a,b,m,n,k,c) //表示两个矩阵的乘积
其中:a,b:双精度矩阵,分别为m*n,n*k维
c:用来存放a*b的结果,为m*k维矩阵

我在程序里用定义了三个变量:
M1,M2,M3:VARIANT;
用VarArrayCreate创建动态数组M1,M2,M3
,分别为m*n,n*k,m*k维
然后把他们作为参数往函数里传
引用Matrix.dll是这样引用的:
Unit Matrix;
...
interface
procedure brmul(a,b:Variant;m,n,k:integer;c:Variant);cdecl;
...
implemention
procedure brmul;external 'Matrix.dll';
...
end.

可是程序运行时一用到brmul就出现异常,请问是上面那个
地方不对,应该怎么解决?
 
是不是因为使用cdecl的缘故,试试改成stdcall。
这里有个函数参数传递时的压栈顺序问题。Pascal与C有不同的压栈顺序。
 
hehe, Blade, 我猜您老又错了
他的问题应该在参数类型上
procedure brmul(a,b:Variant;m,n,k:integer;c:Variant);cdecl;
↑ ↑
└─────┬──────┘
是 Variant 参数导致错误
估计Matrix.DLL中的函数 brmul 是接受传址的 a,b,c 参数,大概函数原型是
void brmul(const double *a,const double *b,int m,int n,int k,double *c);

如果是这样,在 Delphi 4 中书写的引入函数定义应为:
procedure brmul(const a,b:array of double;
m,n,k:smallint;
var c:array of double)
cdecl;
(如果C函数中m,n,k原型为 long, 那Delphi中对应处改为 longint)
这样就不能用VarArrayCreate创建Variant动态数组了
如果你要在 Delphi 4 中使用动态数组,可以如下定义数组变量
var
aa, bb, cc: array of double;
mm, nn, kk: smallint;
...
begin
mm := 3
nn := 4
kk := 2;
SetLength(aa, mm * nn)
// 动态改变数组长度
aa[0] := 1;
...
SetLength(bb, nn * kk);
bb := Copy(bb, (nn-1)*(kk-1))
// 动态减少数组长度
....
end;

Good luck
 
我有的是DELPHI3,并且由于用到了LMD3,所以我在用DELPHI4编译我的程序时,
给出的出错信息是:
Unit lmdclass was compiled with a
different version of windows.TTokenPrivileges.

不知道在delphi3中,有没有什么好的办法吗?
 
TO Z_CD:
我按你老的方法创建的动态数组Matrix1
另外我自己定义了过程:
procedure MatrixTrans(matrix:Array of Double;m,n:integer;var Res:Array of Double);//求矩阵转置
begin
...
Res[i,j]:=Matrix[j,i]
//出错,出错信息为:Array type required
...
end;

请问该如何改?
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
772
import
I
后退
顶部