SIGSEGV bei Zugriff auf Feld in einer anderen Klasse

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
JeyJey
Beiträge: 9
Registriert: Do 22. Sep 2016, 09:55

SIGSEGV bei Zugriff auf Feld in einer anderen Klasse

Beitrag von JeyJey »

Hallo liebe Community,

ich bin noch etwas neu in der Lazarus und Pascal-Welt.

Ich teste grade ein wenig mit Klassen, Feldern und Eigenschaften herum.

Folgendes Problem, ich habe mir eine Test-Klasse angelegt, und in dieser ein Feld angelegt. Jetzt erstelle ich in einer Klasse B ein Objekt der Klasse A und möchte dann in Klasse B auf das Feld zugreifen. Hier kommt dann der SIGSEGV

Klasse A

Code: Alles auswählen

unit test;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils;
 
type
  TTest = class
  public
    Value: integer;
    constructor Create();
  end;
 
implementation
 
constructor TTest.Create;
begin
  inherited;
  Value := 0;
end;
 
end.       


Klasse B

Code: Alles auswählen

unit gui;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
  test;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
    t:TTest;
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.FormCreate(Sender: TObject);
begin
  t.Create();
  ShowMessage(IntToStr(t.Value));
end;
 
end.           


Ich weiß, das der SIGSEGV immer etwas damit zu tun hat, das ich auf etwas zugreifen möchte was nicht da ist. Aber das Feld Value ist ja "nur" ein integer, das heißt hier muss ich diesen ja nicht erst erstellen, bzw. ich initialisiere ihn anfangs auch mit einem Wert.

Was übersehe ich hier?

Vielen dank für eure HIlfe


Gruß

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: SIGSEGV bei Zugriff auf Feld in einer anderen Klasse

Beitrag von Michl »

JeyJey hat geschrieben:

Code: Alles auswählen

  t.Create()

Du musst mit dem Class Construktor eine Instanz erstellen und zuweisen:

Code: Alles auswählen

  t := TTest.Create;

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Antworten