Function 为什么是;结果:=char变量";让我违反访问权限?
我创建了一个函数,它有一个由名为Function 为什么是;结果:=char变量";让我违反访问权限?,function,variables,delphi,get,char,Function,Variables,Delphi,Get,Char,我创建了一个函数,它有一个由名为fsinal的变量表示的Char: 类型 TCalculo=类(TObject) 私有的 fnumero1:整数; fnumero2:整数; fsinal:字符; 公众的 然后我创建了一个方法来获取这个Char: 函数getSinal:char; 函数TCalculo.getSinal:char; 开始 结果:=fsinal; 结束; 每当我启动程序并按下任何按钮时,我都会收到一个错误 地址005FD704处的访问冲突,读取地址0000000 C: 我做错了
fsinal
的变量表示的Char
:
类型
TCalculo=类(TObject)
私有的
fnumero1:整数;
fnumero2:整数;
fsinal:字符;
公众的
然后我创建了一个方法来获取这个Char
:
函数getSinal:char;
函数TCalculo.getSinal:char;
开始
结果:=fsinal;
结束;
每当我启动程序并按下任何按钮时,我都会收到一个错误
地址005FD704处的访问冲突,读取地址0000000 C:
我做错了什么
全部代码:
地址附近的访问冲突错误
$00000000
通常表示您通过nil
指针访问内存
在这种情况下,地址$0000000 c
是地址$00000000
的12个字节。TCalculo.getSinal()(偏移量0是指向TCalculo
的vtable的隐藏指针,偏移量4是fnumero1
成员,偏移量8是fnumero2
成员,最后偏移量12是fsinal
成员)
result:=fsinal;
与result:=Self.fsinal;
相同,其中编译器将fsinal
(12)的偏移量添加到Self
指向的地址,然后取消对结果地址的引用以访问fsinal
的值。在您的情况下,您正在调用TCalculo.getSinal()
通过指向TCalculo
对象的nil
指针,因此方法的Self
指针为nil
(0),因此取消引用fsinal
(0+12)的地址会导致AV错误
在TForm
代码中,所有TButton.OnClick
处理程序都在调用getSinal()
在全局calculo
变量上,该变量从未初始化为指向有效的TCalculo
对象。由于calculo
变量是在全局内存中声明的,因此在程序启动时默认初始化为nil
type
TCalculo = class(TObject)
...
end;
var
Form1 : TForm1;
calculo: TCalculo; // <-- initialized to nil here!
...
procedure TForm1.Button0Click(Sender: TObject);
begin
if calculo.getSinal = 'a' then // <-- calculo is still nil here!
...
end;
... and so on...
或者,改用装置的初始化
部分(反之,使用完成
部分),例如:
地址$00000000附近的访问冲突错误通常意味着您通过nil
指针访问内存
在这种情况下,address$0000000 c
距离address$00000000
有12个字节。TCalculo.getSinal()
方法正在访问fsinal
成员,该成员距离TCalculo
类的开头有12个字节的偏移量(偏移量0是指向TCalculo
的vtable的隐藏指针,偏移量4是fnumero1
成员,偏移量8是fnumero2
成员,最后偏移量12是fsinal
成员)
result:=fsinal;
与result:=Self.fsinal;
相同,其中编译器将fsinal
(12)的偏移量添加到Self
指向的地址,然后取消对结果地址的引用以访问fsinal
的值。在您的情况下,您正在调用TCalculo.getSinal()
通过指向TCalculo
对象的nil
指针,因此方法的Self
指针为nil
(0),因此取消引用fsinal
(0+12)的地址会导致AV错误
在TForm
代码中,所有TButton.OnClick
处理程序都在调用getSinal()
在全局calculo
变量上,该变量从未初始化为指向有效的TCalculo
对象。由于calculo
变量是在全局内存中声明的,因此在程序启动时默认初始化为nil
type
TCalculo = class(TObject)
...
end;
var
Form1 : TForm1;
calculo: TCalculo; // <-- initialized to nil here!
...
procedure TForm1.Button0Click(Sender: TObject);
begin
if calculo.getSinal = 'a' then // <-- calculo is still nil here!
...
end;
... and so on...
或者,改用装置的初始化
部分(反之,使用完成
部分),例如:
TCalculo
是一个类,为了使用它(除了class
变量、方法和属性),您首先需要创建它的一个实例(=对象)。我打赌您忘记了这一点。(calculo:=TCalculo.Create
创建此类的对象,并将指向该对象的指针分配给calculo
变量,然后可以在此行之后使用该变量。在此行之前,calculo
是nil
指针(如果它是全局变量或类成员)或“随机垃圾”指针(如果是局部变量)。)此处不接受在非现场位置链接到代码。所有相关内容都需要以问题本身的形式存在于此处。如果您在开始发布之前花一些时间阅读和阅读页面以了解网站的工作方式,您会发现您在此处的体验会更好。我应该在哪里添加“calculo:=TCalculo.create”尽管如此?我尝试添加的任何地方似乎都会返回错误。您需要在使用对象之前创建它。然后在使用完它之后需要释放它。这是一个普遍的事实。Remy在他的回答中给出了两个非常明确的示例。TCalculo
是一个类,为了使用它(除了class
变量、方法和属性)您首先需要创建它的一个实例(=对象)。我打赌您忘记了这一点。(calculo:=TCalculo.Create
创建此类的对象,并将指向该对象的指针分配给calculo
变量,然后可以在此行之后使用该变量。在此行之前,calculo
是nil
指针(如果它是全局变量或类成员)或“随机垃圾”指针(如果是局部变量)。)此处不接受在非现场位置链接到代码的链接。所有相关内容都需要在此处,在问题本身中,在