引用参数(出错在哪里?)新手问题
引用“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 之间有什么分别(有变量和没变量有什么分别??)??
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 之间有什么分别(有变量和没变量有什么分别??)??
...全文
相关推荐
举例剖析C++中引用的本质及引用作函数参数的使用
主要介绍了C++中引用的本质及引用作函数参数的使用,讲解了函数返回值是引用的情况等一些难点,需要的朋友可以参考下
VS2019添加引用出错:对COM组件的调用返回了错误HRESULT E_FAIL(未能完成操作未指定的错误)
如图: 错误1: 错误2: 原因分析: 此系统是我在虚拟机里面跑的,全新系统,就安装了一个vs2019. 之前遇到COM组件无法被调用的情况。我猜可能是由于VS是用了.net框架开发的。调用Com组件也是刚好用的.net的sdk。所以现在网上说只安装使用c++开发环境的话是根本不行的。必须装一个.net SDK 随便那个版本都可以 如图: 装完之后需要更新一下缓存,不然也无法使用。如果是全新安装的时候就装了。就不用执行此步骤。 1.以管理员身份打开 Developer Command Prompt for VS 2019(vs2019开发人员命令提示符) cd "c:\Prog
关于EEPROM数据出错问题的探讨
关于EEPROM数据出错问题的探讨、电子技术,开发板制作交流
引用jquery框架后出错的解决方法
下面小编就为大家带来一篇引用jquery框架后出错的解决方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
oracle11g 内部参数出错问题
ORA-00600: 内部错误代码, 参数: [kcratr_nab_less_than_odr], [1], [13], [1990],这是我自己整理的,已经试验过了


