>>>>>动态数组作为过程的参数调用,出现问题。来看一下。(20分)

  • 主题发起人 主题发起人 nzfsoft
  • 开始时间 开始时间
N

nzfsoft

Unregistered / Unconfirmed
GUEST, unregistred user!
Procedure AAA(SiteID: array of smallint);
begin
.......
end;

Procedure BBB;
var A:array of Smallint;
begin
setlength(a,1);
a[0]:=1;
AAA(A);<<<<<<好像是类型不匹配。如何解决?
end;
 
A 直接用是指针类型
试试AAA(A);
 
我的意思是要把A数组的东西全部都放到AAA过程中使用呀。
如用A则我只可以一次传一个。
 
可以这样:
type
TMyArr= array of smallint;
Procedure AAA(SiteID:TMyArr);
begin
.......
end;

Procedure BBB;
var A:TMyArr;
begin
setlength(a,1);
a[0]:=1;
AAA(A);
end;

应该可以吧.
 
不好意思,应该用
AAA[A];
并且AAA的长度要注意匹配
 

是这个意思啊
DEN回答的应该可以了吧
 
我试了一下,你的可以啊!
这是我在一个Form上加了一个按钮的代码:(运行正常)
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure AAA( SiteID:Array of smallint);
procedure BBB;
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
BBB;
end;

procedure TForm1.AAA(SiteID:array of smallint);
begin
ShowMessage('hehe');
end;

procedure TForm1.BBB;
var
A:array of smallint;
begin
setlength(A,1);
A[0]:=1;
AAA(A);
end;

end.
 
大哥,还是报类型不符呀。。。。
麻烦你们亲自试一下好不好。
 
不过,我不知为什么贴主的程序编译通不过,而且不知大家有没有发现,
aryA,aryB: Array of SmallInt ;
与 aryA: Array of SmallInt;
aryB: Array of SmallInt;
会不一样.
我是前段时间才发现这个问题的.


会这样,我曾经
 
但我如果这样调用就可以AAA([0,1,2]);
 
我的我刚才试了可以啊!
你试试看,只要在一个Form上加按钮,复制我的代码到Unit下,调用按钮
的点击事件就可以运行了!
 
procedure TForm1.AdjustGoodsOver(ISPackage:boolean;MinUserDateDiff: string;
UserDateDiff:MyIntArr;SiteID: MySmlIntArr);
var I, J: Integer;
RtnRecCount:integer;
RTabName,OTabname,RtabItemName,OtabItemName,TimeField:string;
RFeeItem,RDistance,RPayMethod:string;
OFeeItem,ODistance,OPayMethod:string;
MySql:string;
begin
//=================对SITE字段的修改================================
Try
SybaseCon.StartTransaction ;
for I := High(SiteID)do
wnto Low(SiteID)do
begin
Qry_AdjustGoods.SQL.Clear ;
MySql:=' Update '+OTabName+' Set Site='+ inttostr(SiteID);
MySql:=MySql+' where DateDiff(day, TrainTime, getdate()) >= ' + intToStr(UserDateDiff) ;
if I<high(SiteID) then
MySql:=MySql+' and DateDiff(day, TrainTime, getdate()) <' + intToStr(UserDateDiff[i+1]);
WriteToTxt(Mysql);
Qry_AdjustGoods.SQL.Add(MySql);
Qry_AdjustGoods.ExecSQL ;
ShowMessage(inttostr( Qry_AdjustGoods.RowsAffected ));//返还影响的记录数目
end;
sybasecon.Commit ;
except
on E:Exceptiondo
begin
sybasecon.Rollback ;
showmessage ('修改超期库位代码提交出错,回滚!:'+#13+#10+inttostr(e.HelpContext)+':'+e.Message);
end;
end;
end;
--------------------------------------------------------------
procedure TForm1.N1Click(Sender: TObject);
var A:MySmlIntArr;//array of smallint;//用户的时间间隔
B:MyIntArr;//array of integer;
//用户的超期间隔的Site库中的ID
Qry_Site:TSDQuery;
I,J,N:integer;
TmpStr:string;
begin
Qry_Site:=TSDQuery.Create (nil);
Qry_Site.DatabaseName:='lpmis';
Qry_Site.SQL.clear;
Qry_Site.Sql.add('select Id,Name from Site_O where Pr_id >0 order by Id');
Qry_Site.Open;
if Qry_Site.RecordCount >0 then
begin
Qry_Site.Last ;
Qry_Site.First ;
end;
J:= Qry_Site.RecordCount-1;
Setlength(A,0);
SetLength(B,0);
for I :=0 to Jdo
begin
setLength(A,I+1);
setLength(B,I+1);
TmpStr:=Qry_Site.FieldByName('Name').AsString;
N:=Qry_Site.FieldByName('Id').AsInteger ;
//加入Tmpstr筛选出数字的过程
A:=strtoint(TmpStr);
B:=N;
Qry_Site.Next ;
end;
AdjustGoodsOver(True,'90',A,B);
AdjustGoodsOver(False,'90',A,B);
A:=nil;B:=nil;
Qry_Site:=nil;
end;
 
我在win2k+delphi5下调试没有发现错误啊
 
我这儿也没问题
 
NNd.真他妈的邪门。还是不行。
它报错的是Array 与Dyna.. Array类型不符。
 
好像是系统认为静态数组与动态数组在匹配了。
 
错误信息如下:
[Error] Unit1.pas(1035): Incompatible types: 'Array' and 'dynamic array'
 
procedure TForm1.aaaa(aa: array of integer);
var ss:string;
I,J:integer;
begin
J:=0;
for I:=low(aa) to High(AA)do
begin
ss:=ss+inttostr(aa);
end;
showmessage(ss);
end;

procedure TForm1.Button1Click(Sender: TObject);
var bb:array of integer ;
begin
setlength(bb,3);
bb[0]:=11;
bb[1]:=22;
bb[2]:=33;
bb[3]:=44;
aaaa(bb);
bb:=nil;
end;

连续运行两次都没有问题。但是第三次就不行了。好像是出现内存溢出了。
 
不要这个:bb[3]:=44;
 
后一问题是如楼上讲的。解决了。但前面的就不行,不知道为什么?
有其他变通的办法吗?
 
后退
顶部