External SIGSEGV beim Beenden [gelöst]

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
stefanE
Beiträge: 2
Registriert: Mi 2. Feb 2022, 08:20

External SIGSEGV beim Beenden [gelöst]

Beitrag von stefanE »

Hallo Zusammen,
habe ein Programm zur 3DDarstellung einer Punktewolke geschrieben. Das funktioniert auch ganz gut- aber.
Mit Lazarus 2.2.2 bekomme ich GLScene gar nicht installiert. :-(
Mit Lazarus 2.0.12 ist GLScene installierbar.
Ich habe GLScene in der Version: im onlinePaketManager steht 1.0.0.0 (ich glaube aber eher dass es sich um V2.1 handelt)

wenn ich das Programm Starte und gleich wieder schließe ist alles ok.
Wenn ich die Daten dazu lade kommt beim Beenden ein "External SIGSEGV".
Eigentlich denke ich dass ich alles was erstellt wurde auch wieder frei gegeben wird, aber irgendwas mache ich falsch oder es liegt an GlScene oder an sonstwas.

Hier mal das Hauptprogramm, wäre super wenn da mal jemand drüber schauen könnte.
Im Anhang ist das ganze Programm mit daten File

Im Voraus mal vielen Dank

Stefan

Code: Alles auswählen

unit uTkpGLScene;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, Menus, ExtCtrls,
  ComCtrls, GLScene, GLLCLViewer, GLVectorGeometry, GLObjects, Types,
  utkpmessungen;

type

  { TForm1 }

  TForm1 = class(TForm)
    GLCam: TGLCamera;
    GLCube1: TGLCube;
    GLLightSource1: TGLLightSource;
    GLLightSource2: TGLLightSource;
    GLPoints: TGLPoints;
    GLReference: TGLDummyCube;
    GLScene1: TGLScene;
    GLSceneViewer1: TGLSceneViewer;
    MainMenu1: TMainMenu;
    mnuEnd: TMenuItem;
    mnuOpen: TMenuItem;
    mnuDatei: TMenuItem;
    openFile: TOpenDialog;
    StatusBar1: TStatusBar;
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
    procedure FormCreate(Sender: TObject);
    procedure GLSceneViewer1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure GLSceneViewer1MouseWheel(Sender: TObject; Shift: TShiftState;
      WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
    procedure mnuEndClick(Sender: TObject);
    procedure mnuOpenClick(Sender: TObject);
  private

  public

  end;

var
  Form1: TForm1;
  messungen : Array of TTkpMessung;
  aPoint : TGLPoints;
  startX, startY : integer;
implementation

{$R *.lfm}

{ TForm1 }



procedure TForm1.GLSceneViewer1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  startX := X;
  startY := Y;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
    myCol : TVector;
begin
  aPoint := TGLPoints(GLReference.AddNewChild(TGLPoints));
      myCol.X:=0;
      myCol.Y:=0;
      myCol.Z:=0;
      myCol.W:=1;
      aPoint.Colors.Add(myCol);
end;


procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  aPoint.Positions.Free;
  aPoint.Free;
  setLength(messungen,0);
end;

procedure TForm1.GLSceneViewer1MouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
begin
  if (ssLeft in Shift) then
      if startX > X then GLReference.PitchAngle:= GLReference.PitchAngle-1
      else GLReference.PitchAngle:= GLReference.PitchAngle+1;
  if (ssMiddle in Shift) then
      if startX >X then GLReference.TurnAngle:= GLReference.TurnAngle-1
      else GLReference.TurnAngle:= GLReference.TurnAngle+1;

  if (ssRight in Shift) then
      if startX >X then GLReference.RollAngle:= GLReference.RollAngle-1
      else GLReference.RollAngle:= GLReference.RollAngle+1;

  startX := X;
end;

procedure TForm1.GLSceneViewer1MouseWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
  if wheelDelta > 1 then GLCam.SceneScale:= GLCam.SceneScale*1.1
  else GLCam.SceneScale:= GLCam.SceneScale*0.9;
end;

procedure TForm1.mnuEndClick(Sender: TObject);
begin
  Form1.Close;
end;

procedure TForm1.mnuOpenClick(Sender: TObject);
var
  sFile, aLine : string;
  i,j , pointAnz: integer;
  sList : TStringList;
begin
   pointAnz :=0;

  // get file
  if openFile.Execute then
  begin

    sList := TStringList.Create;
    sFile := openFile.FileName;
    sList.LoadFromFile(sFile);
    // jede Zeile enspricht einer Messung
    setLength(messungen, sList.Count);

    for i:= 0 to sList.Count-1 do
    begin
        aLine := sList.Strings[i];
        messungen[i].extract(aLine);
        messungen[i].setObereLage;
        messungen[i].xSort;
    end;
    for i:=0 to sList.Count-1 do
    begin
        for j:= 0 to messungen[i].anzahl-1 do
        begin
            aPoint.Positions.Add(messungen[i].messung[j].x,messungen[i].messung[j].y,messungen[i].messung[j].z);
            pointAnz := pointAnz+1;
        end;
    end;
    sList.Free;

    statusBar1.Panels[0].Text:= 'Dargestellte Punkte :'+intToStr(pointAnz);
  end;
end;

end.
Dateianhänge
220609_123751.txt
(569.01 KiB) 17-mal heruntergeladen
pTkpGLScene.zip
(130.52 KiB) 20-mal heruntergeladen
Zuletzt geändert von stefanE am Mi 15. Jun 2022, 08:08, insgesamt 1-mal geändert.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1118
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.11 FPC 3.2)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: External SIGSEGV beim Beenden

Beitrag von fliegermichl »

Bei mir kommt die Exception auch ohne Daten zu laden.
Im Formclose wird aPoint.Positions.Free und dann aPoint.Free aufgerufen.
Wenn ich mir den Destructor von TGLPoints anschaue, dann wird dort ebenfalls fPositions.Free aufgerufen.

also einfach nur aPoint.Free aufrufen.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1118
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.11 FPC 3.2)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: External SIGSEGV beim Beenden

Beitrag von fliegermichl »

Wenn ich die Daten lade, dann erscheint dennoch die Exception. Das gleiche aber auch, wenn ich die Datei ein weiteres mal zu öffnen versuche.
Ohne das jetzt genau nachvollzogen zu haben, vermute ich, dass hier etwas doppelt freigegeben wird.

stefanE
Beiträge: 2
Registriert: Mi 2. Feb 2022, 08:20

Re: External SIGSEGV beim Beenden

Beitrag von stefanE »

Hey, :-D
danke für die Antwort!
Das mit der doppelt gemoppelten Freigabe war nur ein Verzweiflungs Versuch.
Ohne das

Code: Alles auswählen

aPoint.Positions.Free;
geht es besser und wenn ich in TForm1.mnuOpenClick

Code: Alles auswählen

aPoint.DeleteChildren;
eingebe stürzt bei mir auch bei nochmaligem Datei öffnen nix mehr ab.

Danke für die Hilfe!

Jetzt frage ich mich nur noch wie ich den task als gelöst markieren kann :roll:

Socke
Lazarusforum e. V.
Beiträge: 3063
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: External SIGSEGV beim Beenden

Beitrag von Socke »

stefanE hat geschrieben:
Di 14. Jun 2022, 13:50
Jetzt frage ich mich nur noch wie ich den task als gelöst markieren kann :roll:
Du bearbeitest deinen ersten Post und änderst den Betreff in "[gelöst] ..."
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten