Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 为什么是;结果:=char变量";让我违反访问权限?_Function_Variables_Delphi_Get_Char - Fatal编程技术网

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
指针(如果它是全局变量或类成员)或“随机垃圾”指针(如果是局部变量)。)此处不接受在非现场位置链接到代码的链接。所有相关内容都需要在此处,在问题本身中,在