求教:如何定义参数类型?(50分)

  • 主题发起人 主题发起人 Unicorn
  • 开始时间 开始时间
U

Unicorn

Unregistered / Unconfirmed
GUEST, unregistred user!
我想调用C语言编译的一个DLL中的函数:
brmul(a,b,m,n,k,c)
其中:a:双精度实型m*n二维数组
b:双精度实型n*k二维数组
m:整型变量,a的行数
n:整型变量,a的列数
k:整型变量,b的列数
c:双精度实型m*k二维数组,返回a*b的乘积
我应当怎样在Delphi定义a,b,c的参数类型,才能灵活使用这个函数?
不要告诉我定义一个足够大的数组
 
Delphi可以定义动态数组的呀
 
可是我用VarArrayCreate创建的动态数组作为参数往brmul传的时候引发异常,
 
Type
TBigDoubleArr = array[0..MaxInt div 8] ofdo
uble;
procedure brmul(a,b: TBigDoubleArr;
m,n,k: integer;
c: TBigDoubleArr);
external 'YourDllName' name 'brmul';
说明:
 1.TBigDoubleArr只是一个类型,并不会为真正分配这么多空间.
 2.因为你二维数组的第二维没有确定,不可能讲数组说明成二维数组类型,记得C语言中关于数组的约定吗?在C语言的函数说明时,多维数组变量只有最高维的具体维数可以省略.
 3.Delphi的动态数组类型不是C语言的标准类型,传递给他肯定会出错的.
示例:
var
a: array[0..4, 0..5];
b: array[0..5, 0..6];
c: array[0..4, 0..6];
begin
...
brmul(TBigDoubleArr(a), TBigDoubleArr(b), 4, 5, 6, TBigDoubleArr(c));
 
不好意思,写错了!
procedure brmul(var a,b: TBigDoubleArr;
m,n,k: integer;
var c: TBigDoubleArr);
external 'YourDllName' name 'brmul';
只有说明成变量参数, Delphi才会讲数组的地址传递给函数,否则按值传递方式只
传递数组参数的拷贝的地址.
 

var
a: array[0..4, 0..5] ofdo
uble;
b: array[0..5, 0..6] ofdo
uble;
c: array[0..4, 0..6] ofdo
uble;
 
Delphi4以上版本都支持动态数组。
 
amo翻得好深呀:-)
 
如果数组用VarArrayCreate创建,则
brmul(a,b:Variant;
m,n,k:integer;
c:Variant)
 
在C语言中的二维数组a[m][n],a表示一个指针,指向一个长度为m的指针数组。
a[m]是一个指针数组由a所指,它每个指针又指向一个长度为n 的Double数。
所以你可以试试:
type
PDoubleArray=^TDoubleArray;//a[m]
TDoubleArray=array[1..MaxInt div Sizeof(Double)] ofdo
uble;//a[m][n]
PPointArray=^TPointArray;//a
TPointArray=array [1.. Maxint div Sizeof(Pointer)] of PDoubleArray;
构造m*n的数组
var
a:PPointArray;
i,j:Integer;
begin
GetMem(A, Sizeof(Pointer)*m);
for i:=1 to mdo
GetMem(a^,n*Sizeof(Double));
for i:=1 to mdo
for j:=1 to ndo
a^^[j]:=....//赋值;
...
for i:=1 to mdo
FreeMem(a^,n*Sizeof(Double));
FreeMem(A, Sizeof(Pointer)*m);
end;


procedure brmul(a,b: PPointArray;
m,n,k: integer;
c: PPointArray);
 
C 中的brmul是否自己分配内存.
是: procedure(a,b : Pointer ;
m,n,k : integer;
c:Pointer);
不是 也可这样写,只是要在Delphi中自己管理内存.
 
试试无类型参数:
function Brmul(var a;var b;
n, m, k:integer;var c):integer;stdcall;


var h1, h2, h3:variant;n, m, k:integer;
begin
n:=10;
m:=5;
k:=6;
h1:=vararraycreate([n, m], vardouble);
h2:=vararraycreate([k, n], vardouble);
h3:=vararraycreate([k, m], vardouble);
Brmul(h1, h2, m, n, k, h3);
end;
 
多人接受答案了。
 
后退
顶部