![]() |
SIGSEGV Fehler bei Stringzuweisung
Hallo Leute!
Folgender Code erzeugt eine SIGSEGV-Fehlermeldung. Der Debugger springt dann in eine Funkion namens TWinControlHandleAllocated, was mir überhaupt nichts sagt.
Delphi-Quellcode:
Das Problem taucht nur auf, wenn die Caption vorher eine negative Zahl angezeigt hat und jetzt eine positive anzeigen soll.
IntAltePunkte := StrToInt(LblPunkte1.Caption);
IntNeuePunkte := IntAltePunkte + IntGeschossen; NeueAnzeige := IntToStr(IntNeuePunkte); LblPunkte1.Caption := NeueAnzeige; Zeigte die Caption vorher eine negative Zahl an, so erfolgt jede neue Zuweisung einen Fehler:
Delphi-Quellcode:
Eine erneute Zuweisung einer negativen Zahlen erzeugt jedoch keinen Fehler:
IntAltePunkte := StrToInt(LblPunkte1.Caption);
IntNeuePunkte := IntAltePunkte + IntGeschossen; NeueAnzeige := IntToStr(IntNeuePunkte); LblPunkte1.Caption := '1';
Delphi-Quellcode:
Danke schonmal für die Hilfe :-).
IntAltePunkte := StrToInt(LblPunkte1.Caption);
IntNeuePunkte := IntAltePunkte + IntGeschossen; NeueAnzeige := IntToStr(IntNeuePunkte); LblPunkte1.Caption := '-1'; |
AW: SIGSEGV Fehler bei Stringzuweisung
Hat es einen Grund, dass Du VCL-Controls als Datenspeicher missbrauchst? Wenn Du Dir die Werte in entsprechenden Variablen merkst, damit rechnest und das Label lediglich zur Ausgabe benutzt, kommt der Fehler dann immer noch?
|
Missbrauch von Komponenten
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. |
AW: SIGSEGV Fehler bei Stringzuweisung
Verbesserter Code führt zum gleichen Fehler:
Delphi-Quellcode:
Spieler1.Punkte := Spieler1.Punkte + IntGeschossen;
LblPunkte1.Caption := IntToStr(Spieler1.Punkte); //Anzeige aktualisieren |
AW: SIGSEGV Fehler bei Stringzuweisung
Das kann ich hier mit meiner etwas betagten Lazarus-Version(0.9.28.2) auf Win7 32Bit nicht nachvollziehen.
|
AW: SIGSEGV Fehler bei Stringzuweisung
0.9.30.04 ist meine Versionsnummer. Kann das wirklich an der Version liegen?
|
AW: SIGSEGV Fehler bei Stringzuweisung
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.
|
AW: SIGSEGV Fehler bei Stringzuweisung
Also ich find es auch extrem merkwürdig, dass ein Label abschmiert, wenn man ihm '-1'als Caption zuweist :-D.
|
AW: SIGSEGV Fehler bei Stringzuweisung
Zitat:
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 :glaskugel: |
AW: SIGSEGV Fehler bei Stringzuweisung
Ich habe den Fehler durch ein kleines Programm simulieren wollen:
Delphi-Quellcode:
Damit bekomme ich den Fehler allerdings nicht.
Label1.Caption := '-1';
Label1.Caption := '1'; 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:
Das ist die Prozedur, in die der Debugger hineinspringt. Aber ich weiß nicht, was das mit einer Scrollbar zu tun haben soll.
//------------------------------------------------
//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;
Delphi-Quellcode:
function TControlScrollBar.HandleAllocated: boolean;
begin Result := (FControl <> nil) and FControl.HandleAllocated; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:59 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 by Thomas Breitkreuz