引用参数(出错在哪里?)新手问题

L3nnon 2011-10-13 06:46:46
引用“Delphi精要” 引用参数
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 之间有什么分别(有变量和没变量有什么分别??)??
...全文
311 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
L3nnon 2011-10-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 foxyy8888 的回复:]

StrToInt(Edit1.Text)其实是个常量,你传递给vDouble肯定错了
[/Quote]
明白了。。。 谢谢您们的用心~~
L3nnon 2011-10-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 foxyy8888 的回复:]

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)在内存中相当于常量……
[/Quote]
谢谢。。 我试试先。。
OO_is_just_P 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)在内存中相当于常量。
Label1.Caption := IntToStr(x);
end;
广州佬 2011-10-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 foxyy8888 的回复:]
StrToInt(Edit1.Text)其实是个常量,你传递给vDouble肯定错了
[/Quote]

+1

所谓“StrToInt(Edit1.Text)其实是个常量”,是因为函数StrToInt已经把Edit1.Text转为一个具体的integer型的值了。
广州佬 2011-10-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 l3nnon 的回复:]
......要从edit1.text转值可以吗......[/Quote]
这是什么意思?
L3nnon 2011-10-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 gzzai 的回复:]
解决办法:
procedure TForm1.Button1Click(Sender: TObject);
更正为:
procedure TForm1.Button2Click(Sender: TObject);
[/Quote]
那如果我用var(变量),而且要从edit1.text转值可以吗/有可能吗??

[Quote=引用 4 楼 foxyy8888 的回复:]

StrToInt(Edit1.Text)其实是个常量,你传递给vDouble肯定错了
[/Quote]
哦哦, 原来如此~
那如果我用var(变量),而且要从edit1.text转值可以吗/有可能吗??
L3nnon 2011-10-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 gzzai 的回复:]

引用楼主 l3nnon 的:......
Button1 和 Button2 之间有什么分别(有变量和没变量有什么分别??)??

Button1 和 Button2 之间的区别不是参数的问题:
procedure TForm1.Button1Click(Sender: TObject);
var x:Integer;
begin
x := Double(StrToInt(Ed……
[/Quote]
很乱,脑袋涨涨~~
OO_is_just_P 2011-10-13
  • 打赏
  • 举报
回复
StrToInt(Edit1.Text)其实是个常量,你传递给vDouble肯定错了
广州佬 2011-10-13
  • 打赏
  • 举报
回复
[Quote=引用楼主 l3nnon 的:]......
Button1 和 Button2 之间有什么分别(有变量和没变量有什么分别??)??
[/Quote]
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;
广州佬 2011-10-13
  • 打赏
  • 举报
回复

解决办法:
procedure TForm1.Button1Click(Sender: TObject);
更正为:
procedure TForm1.Button2Click(Sender: TObject);
广州佬 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;
解决办法:
procedure TForm1.Button1Click(Sender: TObject);
var x : Integer;
begin
x:=StrToInt(Edit2.Text);
x := vDouble(x);//参数类型跟vDouble函数所定义的内容一致
Label1.Caption := IntToStr(x);
end;

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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