External SIGSEGV

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
DAduNgZ
Beiträge: 15
Registriert: Mo 23. Dez 2013, 13:40

External SIGSEGV

Beitrag von DAduNgZ »

Hallo,

ich habe ein einfaches Entschlüsslungsprogramm für Caesar Verschlüsslung o.ä. nach Buchstabenhäufigkeit programmiert.

Sobald ich allerdings den Button klicke, der den Text entschlüsseln soll, taucht ein ERROR mit External: SIGSEGV auf.

Dabei wird folgende Quellcode-Zeile markiert:

Code: Alles auswählen

BuchstabeANSI:= ORD(Crypttext.Lines.Text[x]);
BuchstabeANSI ist eine Integervariable
Crypttext.Lines.Text greift auf eine Memo-Box zu.
x ist eine Integervariable aus einer for-Schleife

Ich hoffe, ihr könnt mir helfen.

baumina
Beiträge: 152
Registriert: Mo 3. Feb 2014, 14:07
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: External SIGSEGV

Beitrag von baumina »

DAduNgZ hat geschrieben: Crypttext.Lines.Text greift auf eine Memo-Box zu.
Wahrscheinlich ist zu diesem Zeitpunkt Crypttext noch nicht initialisiert oder x ist größer als die Länge des Textes. Da musst noch mehr Code zeigen um den Fehler sehen zu können.
.

DAduNgZ
Beiträge: 15
Registriert: Mo 23. Dez 2013, 13:40

Re: External SIGSEGV

Beitrag von DAduNgZ »

Code: Alles auswählen

 for x:= 1 to length(Text) do
   begin
   BuchstabeANSI:= ORD(Crypttext.Lines.Text[x]);
x ist mit der Länge des Textes begrenzt, kann also nicht zu groß sein.

Code: Alles auswählen

  TForm1 = class(TForm)
    BtEncrypt: TButton;
    Crypttext: TMemo;
    Encrypted: TMemo;
Crypttext ist im Objektinspektor und im Quelltext enthalten.

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: External SIGSEGV

Beitrag von Michl »

Da stellt sich nun die Frage, ob

Code: Alles auswählen

for x:= 1 to length(Text) do
die Länge von diesem String "Text" identisch ist, mit der Länge von Crypttext.Lines.Text

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

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

Re: External SIGSEGV

Beitrag von theo »

DAduNgZ hat geschrieben:

Code: Alles auswählen

 for x:= 1 to length(Text) do
   begin
   BuchstabeANSI:= ORD(Crypttext.Lines.Text[x]);
Abgesehen von den Problemen ist das performancemässig ein Graus.
Properites sind keine Variablen. Du schiebst bei jedem Durchgang eine Maschinerie an, um den Text aus dem Memo zu kopieren.
Lösung: Vor der Schleife in eine String Variable kopieren.

CryptString:=Crypttext.Lines.Text;
....
BuchstabeOrd:=ORD(CryptString[x]);

DAduNgZ
Beiträge: 15
Registriert: Mo 23. Dez 2013, 13:40

Re: External SIGSEGV

Beitrag von DAduNgZ »

ok, vielen Dank,

ja,

Code: Alles auswählen

    for x:= 1 to length(Text) do
hatte ich wohl nach dem kopieren aus dem anderen Programm, wo es herkam nicht geändert.

Und der Programmierstil liegt an meiner nicht allzu großen Erfahrung mit dem Programmieren und dem noch grauenvolleren Stil, den die Lehrer in der Schule verbreiten ;)

Antworten