关于函数的VAR参数设置(30分)

  • 主题发起人 主题发起人 terry_zhou82
  • 开始时间 开始时间
T

terry_zhou82

Unregistered / Unconfirmed
GUEST, unregistred user!
unit Unit1


interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls


type
TForm1 = class(TForm)
Edit1: TEdit

Button1: TButton

procedure Button1Click(Sender: TObject)

private
function caculate(n:integer):integer

{ Private declarations }
public
{ Public declarations }
end


var
Form1: TForm1


implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject)

begin
edit1.Text :=inttostr(caculate(10))

end


function TForm1.caculate n: integer): integer

begin
n:=n*10

end

end.
照规矩,按照参数原则,我是不是应该在函数参数前添加VAR ? 但是实际使用却出现以下错误。不加VAR倒是可以运行正常,什么原因啊?
[Error] Unit1.pas(30): Types of actual and formal var parameters must be identical
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
是什么原因啊,不过不加VAR,编译可以通过,但是计算出来的结果不对,应该是100,而他却是142768?有哪位大大知道吗?急,小弟在线等。
 
var表示允许让被调用函数改变的参数。你加上var后。调用时就要传个变量进去了,结果你传个文字常量10进去,当然参数形式就冲突了。楼主真tmd找抽。
 
楼上的,这么说话有点让人受不了啊,呵呵。但是怪了,如果不加VAR,我在D2009里面结果是正确的。100,但是在D6里面,结果却是142678,这个又何解释呢?
 
function TForm1.caculate n: integer): integer

begin
n:=n*10
//传值参数,n返回后不会变的,另外函数的返回值又不赋值
//Result := n * 10
---ok
//var的用法,楼上已经说了
end;
 
-_-就像楼上说的,你调用的过程明显是取result 可是你那个caculate根本就没给result赋值,所以自然结果不对了142678是随机给的一个integer的数
integer类型在没赋值以前是个随机数

至于你写了var出错 是因为var类型传进来的必须是个变量,你调用的时候却是直接用inttostr(caculate(10))
这自然会提示你不允许了

你的程序应该这样
procedure TForm1.Button1Click(Sender: TObject)

var
x:integer;
begin
x:=10;
caculate(x);
edit1.Text :=inttostr(x)

end


procedure TForm1.caculate (var n: integer)

begin
n:=n*10

end


或者
procedure TForm1.Button1Click(Sender: TObject)

begin
edit1.Text :=inttostr(caculate(10))

end


function TForm1.caculate (n: integer): integer

begin
result:=n*10

end;
 
那么就上面的程序,我加VAR,和不加VAR,结果有什么不同呢?或者说什么情况下要用加到VAR的提示呢?是不是值可以带出来的话,就用VAR ?
 
是的,如果你要把值带出来就可以这样用
 
把值带出来,具体是什么概念呢?是否可以举例说明下,最好是结合IDE的,可以让我更好的了解下,谢谢了。另外就像上面那个不加VAR的实例,我做在BUTTON的ONCLICK事件中,不也是带出来的吗?
 
把分给hs-kill,说得很清楚了!
 
有谁可以帮我吗?在仔细的问问看。
 
我就是想知道为是么我上面的例子加不加VAR,结果都是一样的,不是说不加VAR的话,值是不带进去计算的吗?但是答案为什么会一样的啊?急啊,就是搞不清。
 
是不是过程和函数的关系?是不是用过称就有区别,而函数却没有?加不加无所谓啊?
 
汗啊...还不明白

过程和函数 在程序来看就是一个没返回值一个有返回值的区别
从意义上来看,过程表示执行了一个程序段做了一些处理,而函数是执行了一系列的计算返回计算结果

从使用上来看,用result和用var返回结果没有区别
在你需要返回多个结果的时候可以考虑用多个var参数,result只能返回一个结果

在一般使用里,function的result一般返回调用的成功与失败
你可以参考函数的定义:一般意义上函数是指给于输入值一个唯一输出值的法则

所以,至于是用函数还是用过程,看你自己的需求和喜好了


另外 ,D2009里你的调用没出错,应该是编译器给你自动优化了...你应该在编译信息里找到一条警告的
D6里那句i:=i*10应该根本就没有被编译,你可以试着在那句上设个断点,会发现他根本没被执行
同时会有个编译警告提示你"i" never used
 
我函数和过程的意义我了解的,HS-KILL兄,可否对于我上面的例子重新用VAR改下下,因为我用FUNCTION写,也是通不过。再次谢谢了。
 
? 我上面不是改过了?

procedure TForm1.Button1Click(Sender: TObject)

var
x:integer;
begin
x:=10;
caculate(x);
edit1.Text :=inttostr(x)

end


procedure TForm1.caculate (var n: integer)

begin
n:=n*10

end;
 
知道,但是你用FUNCTION函数写呢?
 
....看我上面写的啊↑↑↑↑↑↑↑↑↑

来自:hs-kill, 时间:2008-10-22 1:03:40, ID:3926129 | 编辑
-_-就像楼上说的,你调用的过程明显是取result 可是你那个caculate根本就没给result赋值,所以自然结果不对了142678是随机给的一个integer的数
integer类型在没赋值以前是个随机数

至于你写了var出错 是因为var类型传进来的必须是个变量,你调用的时候却是直接用inttostr(caculate(10))
这自然会提示你不允许了

你的程序应该这样
procedure TForm1.Button1Click(Sender: TObject)

var
x:integer;
begin
x:=10;
caculate(x);
edit1.Text :=inttostr(x)

end


procedure TForm1.caculate (var n: integer)
{var的}
begin
n:=n*10

end


或者
procedure TForm1.Button1Click(Sender: TObject)

begin
edit1.Text :=inttostr(caculate(10))

end


function TForm1.caculate (n: integer): integer
{function的}
begin
result:=n*10

end;
 
可能是我表达的不清,但是我就是想要知道。如果上面的函数程式,我如果在定义N参数前面加上VAR,为什么就出错?
 
理解了。特别感谢HS-KILL
 
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
686
import
I
后退
顶部