引用参数(出错在哪里?)新手问题
时间:2011-10-13
来源:互联网
Pascal 例程的传递参数可以是值参也可以是引用参数。值参传递是缺省的参数传递方式:即将值参的拷贝压入栈中,例程使用、操纵的是栈中的拷贝值,不是原始值。
当通过引用传递参数时,没有按正常方式把参数值的拷贝压栈(避免拷贝值压栈一般能加快程序执行速度),而是直接引用参数原始值,例程中的代码也同样访问原始值,这样就能在过程或函数中改变参数的值。引用参数用关键字var 标示。
参数引用技术在大多数编程语言中都有,C语言中虽没有,但C++中引入了该技术。在C++中,用符号 &表示引用;在VB中,没有ByVal 标示的参数都为引用。
下面是利用引用传递参数的例子,引用参数用var关键字标示:
procedure DoubleTheValue (var Value: Integer);
begin
Value := Value * 2;
end;
在这种情况下,参数既把一个值传递给过程,又把新值返回给调用过程的代码。当你执行完以下代码时:
var
X: Integer;
begin
X := 10;
DoubleTheValue (X);
x变量的值变成了20,因为过程通过引用访问了X的原始存储单元,由此改变了X的初始值。
通过引用传递参数对有序类型、传统字符串类型及大型记录类型才有意义。实际上Delphi总是通过值来传递对象,因为Delphi对象本身就是引用。因此通过引用传递对象就没什么意义(除了极特殊的情况),因为这样相当于传递一个引用到另一个引用。
Delphi 长字符串的情况略有不同,长字符串看起来象引用,但是如果你改变了该字符串的串变量,那么这个串在更新前将被拷贝下来。作为值参被传递的长字符串只在内存使用和操作速度方面才象引用,但是如果你改变了字符串的值,初始值将不受影响。相反,如果通过引用传递长字符串,那么串的初始值就可以改变。
//这段没问题
function Double(Value : Integer) : Integer;
begin
Double := Value*2;
end;
function vDouble(var Value : Integer) : Integer;
begin
vDouble := Value*2;
end;
//这段没问题
procedure TForm1.Button1Click(Sender: TObject);
var
x : Integer;
begin
x := Double(StrToInt(Edit1.Text));
Label1.Caption := IntToStr(x);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
x : Integer;
begin
x := vDouble(StrToInt(Edit1.Text));
Label1.Caption := IntToStr(x);
end;
[DCC Error] Unit1.pas(53): E2197 Constant object cannot be passed as var parameter
[DCC Fatal Error] Project1.dpr(5): F2063 Could not compile used unit 'Unit1.pas'
请问怎么解决?? 问题在哪里??
什么是“引用参数?”
Button1 和 Button2 之间有什么分别(有变量和没变量有什么分别??)??
作者: L3nnon 发布时间: 2011-10-13
procedure TForm1.Button2Click(Sender: TObject); var x : Integer; begin x := vDouble(StrToInt(Edit1.Text));//这里vDouble的参数不是一个变量,而是一个值(由edit1.text转换成整数的得数),跟函数定义的参数类型不符 Label1.Caption := IntToStr(x); end;解决办法:
Delphi(Pascal) code
procedure TForm1.Button1Click(Sender: TObject); var x : Integer; begin x:=StrToInt(Edit2.Text); x := vDouble(x);//参数类型跟vDouble函数所定义的内容一致 Label1.Caption := IntToStr(x); end;
作者: gzzai 发布时间: 2011-10-13
解决办法:
procedure TForm1.Button1Click(Sender: TObject);
更正为:
procedure TForm1.Button2Click(Sender: TObject);
作者: gzzai 发布时间: 2011-10-13
Button1 和 Button2 之间有什么分别(有变量和没变量有什么分别??)??
Button1 和 Button2 之间的区别不是参数的问题:
procedure TForm1.Button1Click(Sender: TObject);
var x:Integer;
begin
x := Double(StrToInt(Edit1.Text));//注意!这里是将括号内的integer类型强制转换为Double类型,而不是使用vDouble函数。
Label1.Caption := IntToStr(x);
end;
至于“(有变量和没变量有什么分别??)??”这是因为函数所定义的:
function vDouble(var Value : Integer) : Integer;//参数是个Integer类型的变量!
begin
vDouble := Value*2;
end;
作者: gzzai 发布时间: 2011-10-13
作者: foxyy8888 发布时间: 2011-10-13
引用楼主 l3nnon 的:......
Button1 和 Button2 之间有什么分别(有变量和没变量有什么分别??)??
Button1 和 Button2 之间的区别不是参数的问题:
procedure TForm1.Button1Click(Sender: TObject);
var x:Integer;
begin
x := Double(StrToInt(Ed……
很乱,脑袋涨涨~~
作者: L3nnon 发布时间: 2011-10-13
解决办法:
procedure TForm1.Button1Click(Sender: TObject);
更正为:
procedure TForm1.Button2Click(Sender: TObject);
那如果我用var(变量),而且要从edit1.text转值可以吗/有可能吗??
StrToInt(Edit1.Text)其实是个常量,你传递给vDouble肯定错了
哦哦, 原来如此~
那如果我用var(变量),而且要从edit1.text转值可以吗/有可能吗??
作者: L3nnon 发布时间: 2011-10-13
......要从edit1.text转值可以吗......
这是什么意思?
作者: gzzai 发布时间: 2011-10-13
StrToInt(Edit1.Text)其实是个常量,你传递给vDouble肯定错了
+1
所谓“StrToInt(Edit1.Text)其实是个常量”,是因为函数StrToInt已经把Edit1.Text转为一个具体的integer型的值了。
作者: gzzai 发布时间: 2011-10-13
var
x ,j: Integer;
begin
j :=StrToInt(Edit1.Text);
x := vDouble(j);这里的j是个变量
//而 x :=vDouble(StrToInt(Edit1.Text));这里StrToInt(Edit1.Text)在内存中相当于常量。
Label1.Caption := IntToStr(x);
end;
作者: foxyy8888 发布时间: 2011-10-13
procedure TForm1.Button2Click(Sender: TObject);
var
x ,j: Integer;
begin
j :=StrToInt(Edit1.Text);
x := vDouble(j);这里的j是个变量
//而 x :=vDouble(StrToInt(Edit1.Text));这里StrToInt(Edit1.Text)在内存中相当于常量……
谢谢。。 我试试先。。
作者: L3nnon 发布时间: 2011-10-13
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28