关于函数的传值。(50分)

  • 主题发起人 主题发起人 whaoye
  • 开始时间 开始时间
W

whaoye

Unregistered / Unconfirmed
GUEST, unregistred user!
比如我有一个函数,这个函数是这个样子的。
procedure Myfun(s:tmemortstream);
begin
//some code here
end;

然后可能我调得时候这个样子:

procedure tform1.button1click(sender:tobject);
var
s:tmemorystream;
begin
s:=tmemorystream.create;
try
s.loadfromfile('c:/myfile.txt');
myfun(s);
finally
s.free;
end;

请问把s传递过去得时候,是传递的什么?
并且在myfun里面要不要s:=tmemorystream.create?

我不想使用全局得变量,也不想改为myfun(var s:tmemorystream);
因为可能多线程同时来访问。
 
是传递的什么,有关系吗?
要s:=tmemorystream.create。因为要tmemorystream是个类,必须用Create生成一个实例。

这是Delphi帮助里的例子:
procedure TForm1.Button1Click(Sender: TObject);

var
TempStream : TMemoryStream;
begin
TempStream := TMemoryStream.Create;

ListBox1.Items.SaveToStream(TempStream)
// write list box contents to the
// stream
TempStream.Position := 0
// reset to the beginning of the stream
RichEdit1.Lines.LoadFromStream( TempStream)
// load stream contents into rich
// edit control

TempStream.Free;
end;
 
不要s:=tmemorystream.create

关于参数传递,你可以看看delphi的语法书
 
to taozhiyu:
请教一下,为什么不要s:=tmemorystream.create呢?
 
传的是对象吧!!!
这个对象你已经创建了,在myfun里面要不要s:=tmemorystream.create....
 
哦,没看清,他是说在myfun里,当然不要了。
 
你这里传递进来的实际上是s的引用。
在传递前你必须Create,在函数中不需要。
 
传的是个指针吧!
 
参数的传递:
1。值参数。 如:PROCEDURE FKK(S:STRING);
FKK过程中对S的改变不会影响到原来的变量。。。
2。引用参数。如:PROCEDURE FKK(VAR S:STRING);
FKK过程中对S的改变会影响到原来的变量。。。
3。常量参数。
PROCEDURE FKK(CONST S:STRING);
FKK过程中S不能修改!!!!

 
关于参数传递的问题可以参考 http://www.delphibbs.com/delphibbs/dispq.asp?lid=799892
 
在MYFUN中的S可不可以是指针类型,把指针传递进MYFUN中。因为虽然MYFUN和FORM1中的
变量名都是S,但由于定义的域不同,是不同的变量,如果把他们都定义为类的话,把函数
外部已创建的类的实例传递给函数内部未创建的类,就会出现赋值错误。如果把他们定义
为类指针,函数调用的时候对重定位指针,就可以修改类实例了。
 
to mirik joyce:你先看看我给出的那个链接吧!!
 
我还是没有弄明白,
你说在myfun 里面是引用,能说具体一些吗,是怎么分配的呢?
是从新在堆栈里面把这个传递得stream做一个拷贝?
 
在我的映象中,没有哪本Delphi书上明确讲述引用这个概念,只是偶尔有些书中提到而已,
引用实际上是C++中的说法,你可以理解为“别名”,也就是说你传递进函数的只是一个对象
的别名,实际上所有的操作都还是针对你传进去的S,这就象是对基本类型的引用传递(var)。
用这种方式传递类的好处就在于不用重新建立一个对象的拷贝。
 
后退
顶部