紧急!如何使用动态二维指针数组做函数参数?(60分)

  • 主题发起人 主题发起人 zyx0404
  • 开始时间 开始时间
Z

zyx0404

Unregistered / Unconfirmed
GUEST, unregistred user!
我定义了一个动态指针数组
TnNumbersArray = array of array of Integer;
PnNumbersArray = ^TnNumbersArray;
定义函数
function GetCount(pnAryNumbers : PnNumbersArray; nBoundLow1, nBoundUpper1, nBoundLow2, nBoundUpper2 : integer) : integer;
var
i, j, nNumber : Integer;
nLength1, nLength2 : integer;
begin
nLength1 := nBoundUpper1 - nBoundLow1 + 1;
nLength2 := nBoundUpper2 - nBoundLow2 + 1;

for i := 0 to nLength1 - 1 do
begin
for j := 0 to nLength2 - 1 do
begin
nNumber := nNumber + pnAryNumbers[i + nBoundLow1, j + nBoundLow2];
end;
end;

Result := nNumber;
end;

在函数中pnAryNumbers[i + nBoundLow1, j + nBoundLow2];这么写编译不通过,错误信息是"Array type required"
如果写成pnAryNumbers^[i + nBoundLow1, j + nBoundLow2];那运行时会出错

我只有很少的分了
 
如果是一维数组,就没有问题
 
楼主兄,你看这样可以吗?
function GetCount(arrayvar: array of array of Integer ) : integer
 
function GetCount(pnAryNumbers : PnNumbersArray; nBoundLow1, nBoundUpper1, nBoundLow2, nBoundUpper2 : integer) : integer;
var
i, j, nNumber : Integer;
nLength1, nLength2 : integer;
begin
nLength1 := nBoundUpper1 - nBoundLow1 + 1;
nLength2 := nBoundUpper2 - nBoundLow2 + 1;
nNumber := 0;
for i := 0 to nLength1 - 1 do
begin
for j := 0 to nLength2 - 1 do
begin
nNumber := nNumber + pnAryNumbers^[i + nBoundLow1][j + nBoundLow2];
end;
end;

Result := nNumber;
end;
 
zbr,我需要的是指针数组做为参数,不是数组
 
轻舞肥羊:
这就是我已经写的,运行时出错

如果写成pnAryNumbers(小尖尖打不出)[i + nBoundLow1, j + nBoundLow2];那运行时会出错
 
楼上的该可以
 
pnAryNumbers^[i + nBoundLow1, j + nBoundLow2];在delphi7 Console Application测试通过
 
function GetCount(pnAryNumbers : PnNumbersArray; nBoundLow1, nBoundUpper1, nBoundLow2, nBoundUpper2 : integer) : integer;
var
i, j, nNumber : Integer;
nLength1, nLength2 : integer;
begin
nLength1 := nBoundUpper1 - nBoundLow1 + 1;
nLength2 := nBoundUpper2 - nBoundLow2 + 1;
nNumber := 0;
for i := 0 to nLength1 - 1 do
begin
for j := 0 to nLength2 - 1 do
begin
nNumber := nNumber + pnAryNumbers^[i + nBoundLow1][j + nBoundLow2];
end;
end;

Result := nNumber;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
i : Integer;
j : Integer;
n : TnNumbersArray;
begin
setlength(n, 3);
setlength(n[0], 3);
setlength(n[1], 3);
setlength(n[2], 3);
for i := 0 to 2 do
for j := 0 to 2 do
n[j] := i*j;
i := GetCount(@n, 0,2,1,2);
Caption := IntToStr(i);
end;


运行出错应该是你初始化数组有问题,像你自己写的GetCount函数,连nNumber都没初始化
 
轻舞肥羊:
区别在这里, 你定义的是
n : TnNumbersArray;
我定义的是
n : array[1..3] of array[1..3] of integer;
m : array[1..5] of array[1..5] of integer;
...
所以我想能传递一个参数指针数组给函数

另外我这些代码只是简单说明一下我的问题,真正的代码会写的很多,nNumber也会初始化
 
轻舞肥羊:
我之所以定义成
n : array[1..3] of array[1..3] of integer;
m : array[1..5] of array[1..5] of integer;
因为我的代码里很多地方都用到了m,n
是已经知道数组的大小,所以我没有用TnNumbersArray去定义
如果改成TnNumbersArray定义也很麻烦,很多地方都需要修改
 
pnAryNumbers : PnNumbersArray //是动态的使用前要分配地址
 
动态数组与静态数组是不同的,你用指针强制转换也没用
function GetCount(pnAryNumbers : Pointer; nArrayLength ,
nBoundLow1, nBoundUpper1, nBoundLow2, nBoundUpper2 : integer) : integer;
var
i, j, nNumber : Integer;
nLength1, nLength2 : integer;
p : PInteger;
begin
nLength1 := nBoundUpper1 - nBoundLow1 + 1;
nLength2 := nBoundUpper2 - nBoundLow2 + 1;
nNumber := 0;
for i := 0 to nLength1 - 1 do
begin
for j := 0 to nLength2 - 1 do
begin
p := pnAryNumbers;
Inc(p, (i + nBoundLow1) * nArrayLength + j + nBoundLow2);
nNumber := nNumber + p^;
end;
end;

Result := nNumber;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
i : Integer;
j : Integer;
//n : TnNumbersArray;
n : array[0..2] of array[0..2] of integer;
begin
{setlength(n, 3);
setlength(n[0], 3);
setlength(n[1], 3);
setlength(n[2], 3);//}
for i := 0 to 2 do
for j := 0 to 2 do
n[j] := i * 3 + j;
i := GetCount(@n, Length(n), 0,2,0,2);
Caption := IntToStr(i);
end;
 
接受答案了.
 
后退
顶部