funktion ord() External:SIGSEV

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
hendy
Beiträge: 80
Registriert: Sa 11. Apr 2009, 17:01
OS, Lazarus, FPC: Windoof (L 0.9.26 FPC 2.2.2)
CPU-Target: 32Bit

funktion ord() External:SIGSEV

Beitrag von hendy »

Ich muss für die Schule ein simples Verschlüsselungsprogramm schreiben

Code: Alles auswählen

procedure TCrypter.CryptbtnClick(Sender: TObject);
var Cryptkey,rest,mit:integer; buch:array of string; anfang:string;
begin
randomize;
if Cryptedit.Text='' then
Cryptkey:=random(120) else
Cryptkey:=strtoint(Cryptedit.Text);
lenge:=length(memo1.Text);
anfang:=memo1.Text;
for i:=lenge downto 1 do
  begin
  ende[i]:=(ord(anfang[i])+Cryptkey);
  mit:=ende[i] DIV 60;
  rest:=ende[i] MOD 60;
  buch[i]:=chr(mit)+chr(rest);
  memo2.Text:=buch[i]+memo2.Text;
  end;
end;
Im moment gehts mir auch nur ums Codieren, ums decodieren kümmer ich mich später.
Im Anhang die Form und der Fehler
Ich weiß, das da viel umständliches drin ist, aber ich dachte vielleicht geht der Fehler weg.
Also Compilen geht, die anderen hängenden Forms funktionieren auch, nur beim Ausführen des Codes, also beim Ausführen dieses Prozesses (klick auf Crypt) gibt er den Fehler im Anhang aus und nur durch schließen von Lazarus kann das Programm beendet werden.
Ich dachte, das hängt mit zahlen und der funktion ord zusammen, aber auch wenn ich die 1 lösche bekomme ich den Fehler.
Bittte helft mir. :cry: Danke :wink:
Dateianhänge
form.jpg
ExternalSIGSEV.jpg
ExternalSIGSEV.jpg (7.77 KiB) 2053 mal betrachtet

hendy
Beiträge: 80
Registriert: Sa 11. Apr 2009, 17:01
OS, Lazarus, FPC: Windoof (L 0.9.26 FPC 2.2.2)
CPU-Target: 32Bit

Re: funktion ord() External:SIGSEV

Beitrag von hendy »

Ach ich hab vergessen zu sagen, dass Ide zeile

Code: Alles auswählen

ende[i]:=(ord(anfang[i])+Cryptkey);
dann von irgendwas grau markiert wird, zeigt aber sonst nix.
Dankt monta !!

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: funktion ord() External:SIGSEV

Beitrag von mse »

hendy hat geschrieben:

Code: Alles auswählen

procedure TCrypter.CryptbtnClick(Sender: TObject);
var Cryptkey,rest,mit:integer; buch:array of string; anfang:string;
begin
randomize;
if Cryptedit.Text='' then
Cryptkey:=random(120) else
Cryptkey:=strtoint(Cryptedit.Text);
lenge:=length(memo1.Text);
anfang:=memo1.Text;
for i:=lenge downto 1 do
  begin
  ende[i]:=(ord(anfang[i])+Cryptkey); <<<<<<<<----------
  mit:=ende[i] DIV 60;
  rest:=ende[i] MOD 60;
  buch[i]:=chr(mit)+chr(rest);
  memo2.Text:=buch[i]+memo2.Text;
  end;
end;
Hast du "ende" mit setlength() auf die richtige Länge (= Anzahl Zeichen) eingestellt? Falls nicht, führt der Versuch in eine leere Stringvariable Zeichen zu schreiben zur Speicherzugriffsverletzung. Dasselbe gilt auch für die dynamische Array Variable "buch".

Martin

hendy
Beiträge: 80
Registriert: Sa 11. Apr 2009, 17:01
OS, Lazarus, FPC: Windoof (L 0.9.26 FPC 2.2.2)
CPU-Target: 32Bit

Re: funktion ord() External:SIGSEV

Beitrag von hendy »

das heißt ich muss die array-größe festlegen...geht das irgendwie dynamisch?
Dankt monta !!

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: funktion ord() External:SIGSEV

Beitrag von mse »

hendy hat geschrieben:das heißt ich muss die array-größe festlegen...geht das irgendwie dynamisch?
Mit der Prozedur setlength(DasArray,DieLaenge). Also setlength(buch,laenge) und setlength(ende,laenge). Zu beachten ist noch, dass dynamische Array Indizes im Gegensatz zu strings null basiert sind. Daher muss zur Adressierung der "buch" items [i-1] verwendet werden.

Edit: Für "ende" ebenfalls, dies dürfte ja ein array of integer oder so und kein ansistring sein.

http://www.freepascal.org/docs-html/ref ... 350003.2.4
http://www.freepascal.org/docs-html/ref ... 410003.3.1

Martin
Zuletzt geändert von mse am Do 20. Aug 2009, 11:26, insgesamt 1-mal geändert.

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

Re: funktion ord() External:SIGSEV

Beitrag von theo »

.. oder einfach TStringList statt array of string verwenden.
Aber komplizierter ist irgendwie besser, nicht wahr? :roll:

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: funktion ord() External:SIGSEV

Beitrag von mse »

theo hat geschrieben:.. oder einfach TStringList statt array of string verwenden.
TStringList itemindex ist ebenfalls null basiert AFAIK. ;-)
"buch" wurde wohl zu Testzwecken eingeführt und die strings etwas zweckentfremdet. Ein array eines entsprechenden record Typen wäre besser geeignet, falls ich die Angelegenheit richtig verstanden habe. :-)

Martin

creed steiger
Beiträge: 958
Registriert: Mo 11. Sep 2006, 22:56

Re: funktion ord() External:SIGSEV

Beitrag von creed steiger »

Ist lenge überhaupt irgendwo definiert?

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

Re: funktion ord() External:SIGSEV

Beitrag von theo »

creed steiger hat geschrieben:Ist lenge überhaupt irgendwo definiert?
Nicht ersichtlich. "ende" auch nicht, muss wohl ein integer array sein.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: funktion ord() External:SIGSEV

Beitrag von pluto »

Nicht ersichtlich. "ende" auch nicht, muss wohl ein integer array sein.
Mich wundert das, die Forschleife überhaupt ausgeführt wird. Wenn der Array keine Länge hat. Also Praktisch -1.
und warum "for i:=lenge downto 1 do", wird hier bis 1 runter gezählt ? wäre folgendes nicht besser "for i:=lenge-1 downto 0 do" ?
Weil length gibt immer +1 zurück. Da es ein Array ist, müsste er auch bei 0 Anfangen.
MFG
Michael Springwald

hendy
Beiträge: 80
Registriert: Sa 11. Apr 2009, 17:01
OS, Lazarus, FPC: Windoof (L 0.9.26 FPC 2.2.2)
CPU-Target: 32Bit

Re: funktion ord() External:SIGSEV

Beitrag von hendy »

@alle: erstmal hab ich gedacht, ich könnte memo1.text nicht in chars unterteilen und habe notgedrungen diese arrays eingebaut.
@creed & theo: Die Variablen lenge,i und ende sind im Globalen Var-bereich definiert.
@pluto: Wieso? Die probleme fangen doch erst in der for-schleife an.
Und ich benutze die array[0] stelle immer für spezielle Sachen, sollte also frei sein.
Dankt monta !!

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: funktion ord() External:SIGSEV

Beitrag von pluto »

erstmal hab ich gedacht, ich könnte memo1.text nicht in chars unterteilen und habe notgedrungen diese arrays eingebaut
warum nicht ? memo1.text ist ein String, also geht auch folgendes:memo1.text[1] das erste Zeichnen.
Wieso? Die probleme fangen doch erst in der for-schleife an.
Wie gesagt, eigentlich dürfte sie gar nicht ausgeführt werden.

Wir meinen auch "buch:array of string". Dieses Array kann nun mal nur in der Methode fest gelegt werden. Aber es gibt keinen Hinweis drauf das es Fest gelegt wird.
memo2.Text:=buch+memo2.Text;

Ich nehme an hier gibt es eine Fehler Meldung. Weil buch nicht die gleiche ende hat, wie ende und Anfang. Alle drei Listen müssen die gleiche Länge haben. Sonst geht es nicht.
MFG
Michael Springwald

hendy
Beiträge: 80
Registriert: Sa 11. Apr 2009, 17:01
OS, Lazarus, FPC: Windoof (L 0.9.26 FPC 2.2.2)
CPU-Target: 32Bit

Re: funktion ord() External:SIGSEV

Beitrag von hendy »

aber jetzt sind alle probleme weg, danke euch allen
Dankt monta !!

Antworten