AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

SIGSEGV Fehler bei Stringzuweisung

Ein Thema von Noobmaster · begonnen am 19. Apr 2012 · letzter Beitrag vom 21. Apr 2012
Antwort Antwort
Noobmaster

Registriert seit: 18. Jul 2010
114 Beiträge
 
FreePascal / Lazarus
 
#1

Missbrauch von Komponenten

  Alt 19. Apr 2012, 16:00
Bin noch nicht so sauber im Programmieren xD. Aber es klingt plausibel .
Ich änder es mal und schreib zurück wie es funktioniert hat.
Danke für die schnelle Antwort.
  Mit Zitat antworten Zitat
Noobmaster

Registriert seit: 18. Jul 2010
114 Beiträge
 
FreePascal / Lazarus
 
#2

AW: SIGSEGV Fehler bei Stringzuweisung

  Alt 19. Apr 2012, 16:13
Verbesserter Code führt zum gleichen Fehler:
Delphi-Quellcode:
      Spieler1.Punkte := Spieler1.Punkte + IntGeschossen;
      LblPunkte1.Caption := IntToStr(Spieler1.Punkte); //Anzeige aktualisieren
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.659 Beiträge
 
Delphi 12 Athens
 
#3

AW: SIGSEGV Fehler bei Stringzuweisung

  Alt 19. Apr 2012, 16:33
Das kann ich hier mit meiner etwas betagten Lazarus-Version(0.9.28.2) auf Win7 32Bit nicht nachvollziehen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Noobmaster

Registriert seit: 18. Jul 2010
114 Beiträge
 
FreePascal / Lazarus
 
#4

AW: SIGSEGV Fehler bei Stringzuweisung

  Alt 19. Apr 2012, 16:39
0.9.30.04 ist meine Versionsnummer. Kann das wirklich an der Version liegen?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.659 Beiträge
 
Delphi 12 Athens
 
#5

AW: SIGSEGV Fehler bei Stringzuweisung

  Alt 19. Apr 2012, 16:43
Ich habe nicht die leisteste Ahnung, da ich kaum etwas mit Lazarus mache, sry. Allerdings kann ich mir das nur schwer vorstellen, es sollte dem Label doch egal sein, was es darstellt, solange das ein String ist.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Noobmaster

Registriert seit: 18. Jul 2010
114 Beiträge
 
FreePascal / Lazarus
 
#6

AW: SIGSEGV Fehler bei Stringzuweisung

  Alt 19. Apr 2012, 16:57
Also ich find es auch extrem merkwürdig, dass ein Label abschmiert, wenn man ihm '-1'als Caption zuweist .

Geändert von Noobmaster (19. Apr 2012 um 17:00 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Assarbad
Assarbad

Registriert seit: 8. Okt 2010
Ort: Frankfurt am Main
1.234 Beiträge
 
#7

AW: SIGSEGV Fehler bei Stringzuweisung

  Alt 19. Apr 2012, 21:34
0.9.30.04 ist meine Versionsnummer. Kann das wirklich an der Version liegen?
Zumindest nicht so wahrscheinlich an der Lazarus-Version wie an der FreePascal-Version die im Hintergrund werkelt.

Einerlei, wann genau rufst du diesen Code auf? Irgendwo im Konstruktor oder Destruktor? Es gibt da nämlich ein paar Spezialfälle wenn bspw. der Container noch nicht komplett erzeugt ist etc ...

Ich würde ganz stark empfehlen ein minimales Beispielprojekt, welches das Problem sichtbar macht, bereitzustellen. Erstens grenzt du es so ein und lernst was dabei und zweitens ist es weniger Rätselraten für die Forenten
Oliver
"... aber vertrauen Sie uns, die Physik stimmt." (Prof. Harald Lesch)
  Mit Zitat antworten Zitat
Noobmaster

Registriert seit: 18. Jul 2010
114 Beiträge
 
FreePascal / Lazarus
 
#8

AW: SIGSEGV Fehler bei Stringzuweisung

  Alt 20. Apr 2012, 09:49
Ich habe den Fehler durch ein kleines Programm simulieren wollen:
Delphi-Quellcode:
   Label1.Caption := '-1';
Label1.Caption := '1';
Damit bekomme ich den Fehler allerdings nicht.

Mein Projektcode führt zu dem Fehler, aber es ist noch etwas bizarrer geworden.
Nur das LblPunkte1 führt zu diesem Fehler, das LblPunkte2 nicht.
Delphi-Quellcode:
//------------------------------------------------
//Wechsel-----------------------------------------
//------------------------------------------------
procedure TFormMain.Wechsel();
var
   IntGeschossen : Integer;
   IntAufnahme: Integer;
begin
   //Jetzige Aufnahme verarbeiten und Anzeigen aktualisieren
   IntGeschossen := IntEsLiegen - SpinEditBaelle.Value;
   //Neue Höchstserie?
   IntAufnahme := StrToInt(LblAufnahme.Caption);
   if bSpieler1IstDran then //Welcher Spieler ist dran? -> Punkte addieren etc.
   begin
      Spieler1.Punkte := Spieler1.Punkte + IntGeschossen;
      LblPunkte1.Caption := IntToStr(Spieler1.Punkte); //Anzeige aktualisieren-> Fehler, wenn
      //die Anzeige vorher '-1' angezeigt hat und soll nun eine positive Zahl anzeigen
      SGridTab1.Cells[0,IntAufnahme] := LblAufnahme.Caption;
      SGridTab1.Cells[1,IntAufnahme] := IntToStr(IntGeschossen);
      SGridTab1.Cells[3,IntAufnahme] := IntToStr(Spieler1.Punkte);
      //Passt die nächste Aufnahme noch auf das Sheet oder muss eine neue Zeile angefügt werden?
      if SGridTab1.RowCount <= IntAufnahme + 1 then
      begin
         SGridTab1.RowCount := SGridTab1.RowCount + 1;
         SGridTab2.RowCount := SGridTab2.RowCount + 1;
         //Die Tabellen bei Überlauf scrollen
         SGridTab1.TopRow := SGridTab1.TopRow + 1;
         SGridTab2.TopRow := SGridTab2.TopRow + 1;
      end;
      //Neue Höchstserie?
      if IntGeschossen > Spieler1.Serie then Spieler1.Serie := IntGeschossen;
   end else
   begin
      Spieler2.Punkte := Spieler2.Punkte + IntGeschossen;
      LblPunkte2.Caption := IntToStr(Spieler2.Punkte); //Anzeige aktualisieren-> kein Fehler
      SGridTab2.Cells[0,IntAufnahme] := LblAufnahme.Caption;
      SGridTab2.Cells[1,IntAufnahme] := IntToStr(IntGeschossen);
      SGridTab2.Cells[3,IntAufnahme] := IntToStr(Spieler2.Punkte);
      LblAufnahme.Caption := IntToStr(IntAufnahme+1);
      //Neue Höchstserie?
      if IntGeschossen > Spieler2.Serie then Spieler2.Serie := IntGeschossen;
   end;

   //Nächste Aufnahme:
   bSpieler1IstDran := not bSpieler1IstDran; //Nächster Spieler ist dran
   IntEsLiegen := SpinEditBaelle.Value;
end;
Das ist die Prozedur, in die der Debugger hineinspringt. Aber ich weiß nicht, was das mit einer Scrollbar zu tun haben soll.
Delphi-Quellcode:
function TControlScrollBar.HandleAllocated: boolean;
begin
  Result := (FControl <> nil) and FControl.HandleAllocated;
end;
  Mit Zitat antworten Zitat
Noobmaster

Registriert seit: 18. Jul 2010
114 Beiträge
 
FreePascal / Lazarus
 
#9

Lösung

  Alt 20. Apr 2012, 12:27
Hallo Leute!

Wie so oft liegt der Fehler zwar an dieser Stelle, hat aber dort nicht seine Ursache. Ich habe längere Zeit gegrübelt, was eine Scrollbar mit dem Problem zu tun haben könnte.
Hier die eigentliche Fehlerquelle:
Delphi-Quellcode:
//------------------------------------------------
//LblPunkte1 Position korrigieren-----------------
//------------------------------------------------
procedure TFormMain.LblPunkte1Resize(Sender: TObject);
var
   A,B: Integer;
begin
   while LblPunkte1.Left + LblPunkte1.Width <> SGridTab1.Left + SGridTab1.Width do
   begin
      LblPunkte1.Left := LblPunkte1.Left - 1;
   end;
end;
Die Prozedur war ursprünglich dafür da, die Position des Labels zu korrigieren, wenn das Label 2-stellige (oder 3-stellige) Zahlen anzeigt, da sich hierbei die Breite verändert. Eine negative Zahl ist dabei ja praktisch eine 2-stellige. Dabei habe ich den Fall vergessen, dass (was zu meiner Verteidigung äußerst selten vorkommt in dem Programm) das Label wieder eine 1-stellige Zahl anzeigen können muss und dass dabei "Left" vergrößert werden muss.

Kurz: Das Label wird soweit nach links verschoben, bis die Scrollbar des Fensters (die man allerdings nie zu sehen bekommt) maximal ist -> Fehler.

Entschuldigung für die "Belästigung" und danke nochmal für die Hilfe .

Verbessert (es funktioniert):
Delphi-Quellcode:
//------------------------------------------------
//LblPunkte1 Position korrigieren-----------------
//------------------------------------------------
procedure TFormMain.LblPunkte1Resize(Sender: TObject);
var
   A,B: Integer;
begin
   while LblPunkte1.Left + LblPunkte1.Width <> SGridTab1.Left + SGridTab1.Width do
   begin
      A := LblPunkte1.Left + LblPunkte1.Width;
      B := SGridTab1.Left + SGridTab1.Width;
      if A > B then LblPunkte1.Left := LblPunkte1.Left - 1 //1-stellig auf mehrstellig
               else LblPunkte1.Left := LblPunkte1.Left + 1; //2-stellig auf 1-stellig
   end;
end;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz