函数问题(50分)

  • 主题发起人 主题发起人 jingandhe
  • 开始时间 开始时间
J

jingandhe

Unregistered / Unconfirmed
GUEST, unregistred user!
function TForm1.copyInt(arrint:array of integer): TList;
想编写一个函数,可将数组中的内容传递到Tlist中,不知道该如何实现数组和TList的转换。这样的函数具体该如何写呢?
 
procedure TBubbleSort.Sort(var A: array of Integer);
var
I, J, T: Integer;
begin
for I := High(A) downto Low(A) do
for J := Low(A) to High(A) - 1 do
if A[J] > A[J + 1] then
begin
VisualSwap(A[J], A[J + 1], J, J + 1);
T := A[J];
A[J] := A[J + 1];
A[J + 1] := T;
if Terminated then Exit;
end;
end;
这个是DELPHI的例子,不过你可以参考的。。
 
我这个函数主要是要把数组中的内容传递到类型为Tlist的函数里,我现在主要想知道怎么把数组里的内容传递到这个Tlist里。不知道我说清楚了没有,这个函数应该怎样写呢?
 
function TForm1.CopyInt(ArrInt: array of Integer): TList;
var
I: Integer;
begin
Result:= TList.Create;
for I:= Low(ArrInt) to High(ArrInt) do
begin
Result.Add(@ArrInt);
end;
end;
 
1,一般如果只是单个的元素,用TStringList就可以了:
A:TStringList;
A:=TStringList.Create;
A.Add('a');
A.Add('B');
第二个元素:=A[1];
位置:=A.IndexOf(元素值);
2,如果要用TList,最好先声明结构:
PFileCollection =^TFileCollection; //文件结构
TFileCollection =record
FileName: String; //文件名
DirPath: String; //路径
end;
A:TList;
A:=TList.Create;
P:PFileCollection;
元素1:
new(P);
P.FileName=S1;
P.DirPath:=S2;
A.Add(P);
释放:
if A<>nil then begin
for i:=0 to A.Count.Count-1 do begin
P:=PFileCollection(A);
Dispose(P);
end;
FreeAndNil(A);
end;
调用:
for i:=0 to A.Count.Count-1 do begin
P:=PFileCollection(A);
文件名:=P.FileName;
文件路径:=P.DirPath;
end;
 
要看清楚楼主的意思,发一大堆和问题无关的代码没有用的!
 
to 京酱肉丝
谢谢你,用你的代码通过了,想再问几个问题,因为刚接触delphi,有些不明白,在这个函数里Result不用在最后写result.free吗?不是Tlist都要用完了释放的吗?
还有Result.add(@ArrInt)其中的@是不是将数组转换成了指针类型。
 
不能在函数里面Free,那样不可能返回结果的,要在调用的地方释放:

procedure TForm1.Button1Click(Sender: TObject);
var
A: array of Integer;
T: TList;
I: Integer;
begin
SetLength(A, 10);
for I:= Low(A) to High(A) do
begin
A:= I; //初始化动态数组,填入一些值
end;

T:= CopyInt(A); //直接调用,不用初始化T,因为在函数里面生成 T的实例
....//处理代码,如果访问TList中的第一个数据用Integer(T.Items[0]^)
T.Free; //在这里Free
end;

因为TList中只能存储指针,所以Result.Add(@ArrInt);
 
to 京酱肉丝
那是不是向这种用完了要释放的函数,结果都不用释放,只是在调用的时候释放就可以了?还有@是不是可以将数组转换成指针,想在其他程序里用。问题多了点,但是有很多这样的问题想问,在书上找很麻烦。多谢你了。
 
一般这种动作都在调用者处申请,由调用者来释放
 
@操作是取一个变量的指针
var
I: Integer;
P: ^Integer;
begin
I:= 100;
P:= @I;
Caption:= IntToStr(P^); // 结果Caption等于'100';
end;
 
因为是 CopyInt函数返回的是一个TList,所以不能在函数里面释放,否则返回值会是一个空指针,再去访问就会出错了。要不然就要写一个过程:
procedure CopyInt(A: array of Integer; var T: TList); 也可以
调用时
A为动态数组;
MyList:= TList.Create;
try
CopyInt(A, MyList);
// 处理代码
finally
MyList.Free;
end;
 
to 京酱肉丝
谢谢你这么耐心的回答。给你分了。要是有问题还可以问你吗?
 
多人接受答案了。
 
可以的。
 
to 京酱肉丝
不知道在论坛里能不能找一个人回答问题?
 
无所谓找谁,只要你提出问题,大家一起来讨论,问题总会解决的,所谓人多力量大,欢迎随时提出问题,要不然开论坛干什么。
 
大富翁真好.
 
盒子论坛也不错,那里的控件多多啊,你可以去看一看。
 
后退
顶部