Exception SIGSEGV bei generischer classe

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Uli
Beiträge: 24
Registriert: Mi 2. Sep 2009, 18:49

Exception SIGSEGV bei generischer classe

Beitrag von Uli »

Hallo,
warscheinlich bin ich mal wieder zu bl.., aber ich bekomme es einfach nicht hin.
Beim ausführen dieses Programms mit der Unit dynarray bekomme ich eine SIGSEGV Exception.
Der constructor wird im Debug Mode angesprungen aber im nächsten Schritt sofort wieder verlassen ohne eine Zeile auszuführen.
Lazarus ist Version 1.0 und FPC 2.6.0.

Code: Alles auswählen

program project1;
 
uses Classes, SysUtils, dynarray;
 
type TIntegerList = specialize TDynamic<Integer>;
 
var  X : TIntegerList;
 
begin
  X.create(2);
  X[1] := 1;
end.   
 

Code: Alles auswählen

unit dynarray;
 
interface
 
uses Classes, SysUtils;
 
type generic TDynamic<T> = class
  private
    FArray: Array of T;
    function GetValue(Index: Integer): T;
    procedure SetValue(Index : integer; Value: T);
  public
    constructor Create(Size: Integer);
    property Value[index: integer]: T read GetValue write SetValue; default;
  end;
 
implementation
 
constructor TDynamic.Create(Size: Integer);
begin
  inherited Create;
  System.SetLength(FArray, Size);
end;
 
function TDynamic.GetValue(Index: Integer): T;
begin
  Result := FArray[Index-1];
end;
 
procedure TDynamic.SetValue(Index: integer; Value: T);
begin
  FArray[Index-1] := Value;
end;
 
end.
 

Benutzeravatar
theo
Beiträge: 10865
Registriert: Mo 11. Sep 2006, 19:01

Re: Exception SIGSEGV bei generischer classe

Beitrag von theo »

Woher habt ihr nur immer die Idee mit diesem X.create?

X:=TIntegerList.create(2);

Uli
Beiträge: 24
Registriert: Mi 2. Sep 2009, 18:49

Re: Exception SIGSEGV bei generischer classe

Beitrag von Uli »

Ok, falle ich immer wieder drauf rein.
Jetzt habe ich die Zeile X.create(2) durch X:=TIntegerList.create(2) ersetzt und bekomme folgende Meldung
"project1.lpr(1,1) Fatal: Compilation aborted".

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: Exception SIGSEGV bei generischer classe

Beitrag von Scotty »

Uli hat geschrieben:...bekomme folgende Meldung: "project1.lpr(1,1) Fatal: Compilation aborted".
Dann brich doch einfach nicht ab :mrgreen:

Socke
Lazarusforum e. V.
Beiträge: 3177
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Exception SIGSEGV bei generischer classe

Beitrag von Socke »

Uli hat geschrieben:"project1.lpr(1,1) Fatal: Compilation aborted".
Dann schau im Nachrichten-Fenster mal nach, was du über das Kontextmenü in deine Zwischenablage bekommst.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Uli
Beiträge: 24
Registriert: Mi 2. Sep 2009, 18:49

Re: Exception SIGSEGV bei generischer classe

Beitrag von Uli »

Da bekomme ich folgendes:
Hint: Start of reading config file C:\lazarus\fpc\2.6.0\bin\i386-win32\fpc.cfg
Hint: End of reading config file C:\lazarus\fpc\2.6.0\bin\i386-win32\fpc.cfg
Free Pascal Compiler version 2.6.0 [2012/08/28] for i386
Copyright (c) 1993-2011 by Florian KlaemAn unhandled exception occurred at $00433D0D :
EAccessViolation : Access violation
$00433D0D
$004D9A4D
$004EB714
$004E8F3F
$004EC2C8
$004EC2DC
$004EC2DC
$004EC2DC
$004EC74F
$004DBDE5
$004DC1E6
$004D4C3E
$004D855B
pfl and others
Target OS: Win32 for i386
Compiling project1.lpr
project1.lpr(1,1) Fatal: Compilation aborted

Uli
Beiträge: 24
Registriert: Mi 2. Sep 2009, 18:49

Re: Exception SIGSEGV bei generischer classe

Beitrag von Uli »

Kann mir denn hierbei keiner helfen?

Benutzeravatar
theo
Beiträge: 10865
Registriert: Mo 11. Sep 2006, 19:01

Re: Exception SIGSEGV bei generischer classe

Beitrag von theo »

Bei mir funktioniert das. Ich habe allerdings den FPC 2.7.1 x86_64

Socke
Lazarusforum e. V.
Beiträge: 3177
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Exception SIGSEGV bei generischer classe

Beitrag von Socke »

Die Access Violation tritt nicht während der Ausführung deines Programms auf, sondern während der Compilierung. Da ich den Fehler bei mir (FPC 2.6.0 i386 unter Win7) nicht reproduzieren kann, solltest du ein Minimalbeispiel erstellen (in dem der Fehler auftritt) und den Compiler-Entwicklern per Bugtrager zukommen lassen. Vielleicht hilft es auch, wenn du in Lazarus ein neues Projekt erstellst und den Quelltext kopierst.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Uli
Beiträge: 24
Registriert: Mi 2. Sep 2009, 18:49

Re: Exception SIGSEGV bei generischer classe

Beitrag von Uli »

Erst einmal danke für die Antworten.
Ich habe mir gerade Lazarus 1.0.2 heruntergeladen.
Das Compilieren war damit sofort erfolgreich.
Nachdem ich aber ein writeln und ein readln eingefügt habe, bekomme ich den Fehler wieder.

Code: Alles auswählen

begin
  X:=TIntegerList.create(2);
  X[1] := 1;
  writeln(X[1]);
  readln;
end.
Und wenn ich die beiden Zeilen wieder entferne, bleibt der Fehler.
Damit ist das Problem jetzt zumindest reproduzierbar.
Kann das bitte einmal jemand versuchen.

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Exception SIGSEGV bei generischer classe

Beitrag von MAC »

Eine frage, wie bekommst du das mit der Abfrage von X[1] hin ? Ich dachte normalerweise müsste man X.Value[1] heißen.
Kann es sein, das das dein Fehler ist? Wenn nicht, wie hast du das hinbekommen die Abfrage so zu gestallten, das würde mich interessieren...

Code: Alles auswählen

    begin
      X:=TIntegerList.create(2);
      X.Value[1] := 1;
      writeln(X.Value[1]);
      readln;
    end.
Mal ganz nebenbei würd ich mir das mit dem -1 rechnen beim Zugriff sparen und es mir gleich angewöhnen das ein Array bei 0 anfängt (Ich weis es ist schwer, da ich selber parrallel in 2 Sprachen programmiere bei denen das unterschiedlich ist, Pascal und Lua...)

Code: Alles auswählen

Signatur := nil;

Benutzeravatar
theo
Beiträge: 10865
Registriert: Mo 11. Sep 2006, 19:01

Re: Exception SIGSEGV bei generischer classe

Beitrag von theo »

MAC hat geschrieben:Eine frage, wie bekommst du das mit der Abfrage von X[1] hin ? Ich dachte normalerweise müsste man X.Value[1] heißen.
Kann es sein, das das dein Fehler ist? Wenn nicht, wie hast du das hinbekommen die Abfrage so zu gestallten, das würde mich interessieren...
http://www.freepascal.org/docs-html/ref/refsu33.html

Antworten