function函数返回值问题,好奇怪,求解答?

ddp0007 2017-01-11 04:30:29
今天碰到一个奇怪的问题如下:
我有一个文本文件,格式如下:
2.txt内容:
1111;2222
3333;4444
5555;6666
7777;8888
好了,我想把以上内容分割开来,如1111 2222
先自定义了一个函数
function Tform1.showdata(a:string):string;
var
s1:Tstringlist;
i:Integer;
begin
Result:=''; //不加这句,会重复生成字符串
s1:=TStringList.Create;
s1.Delimiter:=';';
s1.DelimitedText:=a;
for i:=0 to s1.Count-1 do
begin
result:=Result+s1.Strings[i]+' ';
end;
FreeAndNil(s1);
end;
然后调用,把memo1载入的内容,处理后显示到memo2中
procedure TForm1.btn3Click(Sender: TObject);
var
i:Integer;
begin
mmo2.Clear;
mmo1.Lines.Clear;
mmo1.Lines.LoadFromFile('2.txt');
for i:=0 to mmo1.Lines.Count-1 do
begin
mmo2.Lines.Add(showdata(mmo1.Lines.Strings[i]));
end;
end;
执行结果,好了问题来了.
showdata函数中如果没有result:='';这句,会变成memo2中的内容会重复生成,如下:
1111 2222
1111 2222 3333 4444
1111 2222 3333 4444 5555 6666
1111 2222 3333 4444 5555 6666 7777 8888
加上result:='';结果是正常的,如下:
1111 2222
3333 4444
5555 6666
7777 8888
开始怎么都找不到原因,想了半天后来加上就可以了,请问原因是什么?
是不是function的返回值在程序中是全局的?每次外部调用不会清除上次的值?
...全文
226 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
santiaodahan 2017-01-15
  • 打赏
  • 举报
回复
引用 2 楼 lyhoo163 的回复:
1、函数function showdata(a:string):string; 在单元中定义为函数,实际下它就是一个全局变量,执行一次后,它在内存中保留返回的值。 2、你再次执行时,由于代码是 result:=Result+s1.Strings[i]+' '; 这样,该值在单元内是全局变量值,也被带入了。 3、当函数的首行加入 result:='';后 该函数就正常了,不再带入,上一次执行时的值了。 所以,通常所以函数的首行,都是让result值为空(零)。
这跟是不是全局变量没有关系,声明一个局部的函数一样有效。而且这个函数放到类里,成为一个方法,Delphi也不这么认定全局不全局。字符串能被追加是因为result出现在赋值语句右边。最关键的是迭代,上次的值能被代入完全是因为被调用函数出现在一个循环中。但是只有返回值是字符串且循环时才会有效,如果是整数,则可能出现随机数或循环数,并且会警告返回值可能未定义,这可能跟编译器优化有关。应该是不规范的用法。
ddp0007 2017-01-12
  • 打赏
  • 举报
回复
原来是这样啊,谢谢楼上老师解答.
lyhoo163 2017-01-11
  • 打赏
  • 举报
回复
1、函数function showdata(a:string):string; 在单元中定义为函数,实际下它就是一个全局变量,执行一次后,它在内存中保留返回的值。 2、你再次执行时,由于代码是 result:=Result+s1.Strings[i]+' '; 这样,该值在单元内是全局变量值,也被带入了。 3、当函数的首行加入 result:='';后 该函数就正常了,不再带入,上一次执行时的值了。 所以,通常所以函数的首行,都是让result值为空(零)。
santiaodahan 2017-01-11
  • 打赏
  • 举报
回复
有必要这么复杂吗?一个字符串替换函数不就解决了。函数中的result:=Result+s1.Strings[i]+' ';这句是追加字符串。循环调用时新行都会加在上一行字符串后面。加上Result:='';这句被追加的字符串每次循环都会被清除,自然也就不会连成行了。

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧