Pointer auf dynamisches Array initialisieren = SIGSEGV???

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Pointer auf dynamisches Array initialisieren = SIGSEGV???

Beitrag von RSE »

Hallo!

Da man in Klassen ja kein dynamisches Array benutzen darf (weil die Größe ja nicht fest ist), benutze ich jetzt einen Pointer auf ein dynamisches Array. Dabei gibt es allerdings einen komischen Effekt:

Code: Alles auswählen

type
  TBuffer = array of array of Word;
  TMyClass = class
    Buffer = ^TBuffer;
  ...
procedure TMyClass.MachWas;
  var
    buf: TBuffer;
  begin
    SetLength(buf,20,20); // kein Fehler
    SetLength(Buffer^,20,20); // SIGSEGV Fehler
  ...
Woran liegt das? Eigentlich müsste doch bei beiden Aufrufen genau das gleiche passieren?

P.S.: Ich progge momentan in der DOS-IDE GO32V2 im Compiler Modus ObjFPC.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Pointer auf dynamisches Array initialisieren = SIGSEGV???

Beitrag von Christian »

Hast du dir auch mal durchgelesen was du da gebastet hast ?
wenn ich das richtig sehe versuchst du die grösse eines typen zu ändern ?!
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

KOBOLD Messring GmbH
Beiträge: 155
Registriert: Mi 22. Aug 2007, 14:52
OS, Lazarus, FPC: Mandriva Linux 2008 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 65719 Hofheim am Taunus
Kontaktdaten:

Re: Pointer auf dynamisches Array initialisieren = SIGSEGV???

Beitrag von KOBOLD Messring GmbH »

Genau, Christian hat Recht: Du musst doch erst eine Variable von Deinem BufferPointer-Typ deklarieren:

Code: Alles auswählen

TBuffer = array of array of Word;
  TMyClass = class
    Buffer = ^TBuffer;
  ...
procedure TMyClass.MachWas;
  var
    buf: TBuffer;
    BufferPointer : Buffer; // VARIABLE VOM TYP ANLEGEN
  begin
    SetLength(buf,20,20); // kein Fehler
    SetLength(Buffer^,20,20); // SIGSEGV Fehler
    SetLength (BufferPointer^, 20, 20); // Wahrscheinlich kein Fehler mehr
Ich hab's nicht ausprobiert, aber sooo müsste das gehen

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Pointer auf dynamisches Array initialisieren = SIGSEGV???

Beitrag von mse »

RSE hat geschrieben:Da man in Klassen ja kein dynamisches Array benutzen darf (weil die Größe ja nicht fest ist),
Dies ist möglicherweise ein Irrtum, was meinst du damit genau?

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: Pointer auf dynamisches Array initialisieren = SIGSEGV???

Beitrag von mschnell »

RSE hat geschrieben:Da man in Klassen ja kein dynamisches Array benutzen darf (weil die Größe ja nicht fest ist),
Stimmt nicht. Das dynamische Array wird automatisch so verwaltet (die Variable (in der Klasse oder auf dem Stack) ist ein Pointer, die Daten stehen auf dem Heap).

-Michael

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Pointer auf dynamisches Array initialisieren = SIGSEGV???

Beitrag von RSE »

Mist, da war natürlich wieder ein Schreibfehler drin... ich hab natürlich diesen Code:

Code: Alles auswählen

type
  TBuffer = array of array of Word;
  TMyClass = class
    Buffer: ^TBuffer;
  ...
procedure TMyClass.MachWas;
  var
    buf: TBuffer;
  begin
    SetLength(buf,20,20); // kein Fehler
    SetLength(Buffer^,20,20); // SIGSEGV Fehler
  ...
Und heute gibt´s selbst bei

Code: Alles auswählen

type
  TMyClass = class
    Buffer: array of array of Word;
  ...
keinen Fehler mehr. Also muss der Fehler gestern entweder bei FPC gelegen haben, oder ich hab vorher woanders im Speicher rumgeschrieben und damit was zerhauen oder ich hatte noch´n anderen Fehler drin. Jedenfalls hatte er gestern irgendwas von "Kann sowas nicht in einer Klasse verwenden, weil der Typ initialization und finalization benötigt", und zwar kam der Fehler auf der Deklaration der Klasse. Vielleicht ist um 4:00 Uhr morgens auch nicht ganz die optimale Zeit zum programmieren ;-)

Wie auch immer, vielen Dank für die Mühen! Beim nächsten unerklärlichen Fehler werd ich zuerst mal neu Starten, geht ja fix im Dos ;-)
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Antworten