Initialisierung von Strukturen / Klassenmembern

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
TheInvisible1966
Beiträge: 2
Registriert: Fr 14. Aug 2015, 23:10

Initialisierung von Strukturen / Klassenmembern

Beitrag von TheInvisible1966 »

hallo, vorneweg bitte ich um Verständnis, falls meine Frage zu newbe-mäßig sein sollte, aber ich bin gerade ein wenig am verzweifeln. Es geht um folgendes (vereinfachtes Beispiel meines Problems): Ich habe zwei Klassen A und B die jeweils 2 Membervariablen haben. Außerdem habe ich eine Klasse C die einen Pointer auf A und einen Pointer auf B hat. Was ich eigentlich nur tun möchte ist, diese Pointer sauber zu initialisieren. Also versuche ich sie im Konstruktor auf nil zu setzen mit dem hässlichen Effekt einer SIGSEGV exception. Wenn ich die Pointer mit new() initialisiere, dann läuft es zwar, allerdings zeigen die pointer dann ja irgendwo in den Wald. Letzendliche Zielsetzung ist es abzufragen ob der Pointer auf A oder B gesetzt ist um dann mit A oder B etwas zu machen. Hier mal mein Beispielcode:

Code: Alles auswählen

unit unitA;
{$mode objfpc}{$H+}
interface
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, unitb;
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
var
  Form1: TForm1;
implementation
{$R *.lfm}
procedure TForm1.FormCreate(Sender: TObject);
var
  vTC:TC;
begin
[size=150]  vTC:=TC.Create;[/size]
end;
end.
///////////////////////////////////////////

Code: Alles auswählen

unit unitb;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils;
 
type
  TA = class
    private
      F1: String;
      F2: Integer;
    public
      constructor Create;
  end;
 
  TB = class
    private
      F3: String;
      F4: Integer;
    public
      constructor Create;
  end;
 
  TC = class
    private
      FA: ^TA;
      FB: ^TB;
    public
      constructor Create;
  end;
 
implementation
 
constructor TA.Create;
begin
  F1 := 'F1';
  F2 := 2;
end;
constructor TB.Create;
begin
  F3 := 'F3';
  F4 := 4;
end;
constructor TC.Create;
begin
[size=150]  FA^ := nil;
  FB^ := nil;[/size]
end;
end.
Bei der Zuweisung von nil auf FA^zerreisst es ihn dann. Ich wäre für jede Hilfe dankbar. mfg Christian
Zuletzt geändert von Lori am Mi 26. Aug 2015, 16:55, insgesamt 2-mal geändert.
Grund: Highlighter

turbo
Lazarusforum e. V.
Beiträge: 99
Registriert: Mo 6. Feb 2012, 17:20
OS, Lazarus, FPC: ubuntu 10.10, L 0.9.28.2, FPC 2.4.0
CPU-Target: x86_64
Wohnort: Oldenburg (Oldb)

Re: Initialisierung von Strukturen / Klassenmembern

Beitrag von turbo »

Moin,

kanst Du mal bitte den Code in den Highlighter werfen:
Das geht so:
davor:

Code: Alles auswählen

 
 
danach:
 [ /code] ohne Leerzeichen

Vielen Dank.
Liebe Grüße
turbo

Martin V
Beiträge: 142
Registriert: Sa 30. Jan 2010, 19:35
OS, Lazarus, FPC: Linux64, Wiindows32, MacOS, Lazarus 1.8.2
CPU-Target: xxBit

Re: Initialisierung von Strukturen / Klassenmembern

Beitrag von Martin V »

Klassenvariablen sind ja schon Pointer an sich. D.h. Du machst Pointer von Pointer. Lass alle ^ weg, dann sollte es gehen. Wenn Du statt "class" "object" schreiben würdest, müßtest Du dich um die Pointer selbst kümmern, bei Class macht das der Compiler. Es ist mir nicht klar, wann man überhaupt object verwenden soll, möglicherweise ist das nur zur Abwärtskompatibilität.
Ich habe dazu nur eine englische Doku gefunden:
http://wiki.freepascal.org/Programming_Using_Objects

TheInvisible1966
Beiträge: 2
Registriert: Fr 14. Aug 2015, 23:10

Re: Initialisierung von Strukturen / Klassenmembern

Beitrag von TheInvisible1966 »

danke für die Antworten. Mitlerweil habe ich es gefunden.
a) das Beispiel war natürlich Quatsch. Natürlich muss die Zuweisung ohne Dereferenzierung (^) passieren. Allerdings war das bei meinem eigentlichen Programm nicht das Problem.
Ich habe (abweichend von dem eingestellten Beispiel) in meinem Code geschrieben
var
vC:TC;
begin
vC := vC.Create; // statt richtiger Weise vC := TC.Create;
deswegen natürlich die Exception.
Thread kann damit geschlossen werden.

Antworten