![]() |
Indexproblem - Hilfe
Guten Tag DP,
ich bin gerade dabei, ein Ver- und Entschlüsselungsprogramm für das Vigenère-Chiffre zu programmieren. Dabei habe ich folgendes Problem: obwohl ich meiner Meinung nach alles richtig gemacht habe, zeigt mir das Programm beim Verusch den Klartext zu entschlüsseln, an, dass ich "out of range bin". Tatsächlich suche ich wohl nach einem Index von 1,9 Milliarden, obwohl mein Array ein 1..26,1..26 Array ist (das Vigenère Quadrat). Ich zeige euch mal meinen Quelltext, vielleicht kann mir ja jemand helfen! Ich hoffe mit den Variablennamen kann man sich zurechtfinden. Ich habe 3 Arrays: eins für das Quadrat (viq: array[1..26,1..26] of Char), eins zum Füllen des Quadrats (hilfe: array[1..26] of Char) und eins zum Verschlüsseln(hilfe2: array['a'..'z'] of Integer). Das Füllen klappt soweit.
Code:
procedure TForm1.Button1Click(Sender: TObject);
var schluessel, schluessel2, t1, chiffrat: String; lschluessel, lt, zaehler, zaehler1, a, b: Integer; begin t1 := lowercase(Edit1.text); //Klartext schluessel := lowercase(Edit2.text); //Schlüssel lt := length(t1); lschluessel := length(schluessel); chiffrat := ''; schluessel2 := ''; a := 0; b := 0; for zaehler := 1 to lt do begin //hier verlängere ich den Schlüssel so oft mit sich selbst, bis er gleich lang wie der Klartext ist if zaehler mod lschluessel = 0 then schluessel2 := schluessel2 + schluessel[1] else schluessel2 := schluessel2 + schluessel[zaehler mod lschluessel]; end; Label1.caption := schluessel2; for zaehler1 := 1 to lt do begin if t1[zaehler1] = ' ' then chiffrat := chiffrat + ' '; a := hilfe2[schluessel2[zaehler1]]; b := hilfe2[t1[zaehler1]]; chiffrat := chiffrat + StringGrid1.Cells[a,b]; //HIER IST DAS PROBLEM: angeblich liegt die Variable b im Milliardenbereich. Ersetze ich b mit z.B. 5, zeigt mir das Programm an, dass a im negativen Zehntausenderbereich liegt... ich verstehe die Welt (Delphi) nicht mehr... ich hoffe mir kann jemand helfen... end; Edit3.text := chiffrat; end; Sollte irgendetwas fehlen bzw unklar sein, bitte nachfragen! Liebe Grüße Maurooon |
AW: Indexproblem - Hilfe
Meine erste Frage:
Welche Delphiversion? Zumindest in älteren Delphiversionen "übersetzt" lowercase nur A bis Z in Kleinbuchstaben, nicht aber z. B. ÄÖÜ. Sollten zwar bei 'nem Array von 'a'..'z: bzw. 1..26 nicht vorkommen, wenn aber doch, dann geht's irgendwo in den Speicher, aber nicht zwingend ins Array. Ist Das Stringgrid ausreichend groß, so dass auf Cells[a,b] für alle möglichen Werte von a und b zugegriffen werden kann? a und b enthalten Werte aus hilfe2. Hilfe2 wird im vorliegenden Quelltext nicht befüllt, von daher ist es nicht möglich festzustellen, ob dort ausschließlich die erwarteten Werte enthalten sind. Bitte mal am Anfang mit sowas in der Art hilfe2 ausgeben:
Delphi-Quellcode:
Stimmt die Ausgabe mit dem erwarteten Inhalt überein?
var
ch : Char sl : TStringList; begin sl := TStringList.Create; for ch = 'a' to 'z' do sl.Add(Format('Index %s = %d',[ch,hilfe2[ch]])); sl.SaveToFile('hilfe2.inhalt'); // oder ShowMessage(sl.Text); sl.Free; ... |
AW: Indexproblem - Hilfe
Also eigentlich programmiere ich sogar mit Lazarus v1.6.2 .
Das Stringgrid ist ausreichend groß. Es beinhaltet das Vigenère Quadrat, also das Array viq. hilfe2 wird wie folgt gefüllt:
Code:
Was bringt der Quelltext den du da geschrieben hast? Wenn ich im debugger-Modus über hilfe2 fahre, beinhaltet es das was es beinhalten soll. Das ist auch das was mich verwirrt: kein buchstabe liefert im Array hilfe2 eine derart hohe Zahl, und trotzdem wird b bzw a zu solch einer...
x := 0;
for zaehler2 := 'a' to 'z' do begin //zweites Hilfsarray befüllen von 0 bis 25 hilfe2[zaehler2] := x; inc(x); end; LG |
AW: Indexproblem - Hilfe
Bei meinem Quelltext ging es mir nur darum zu sehen, ob in hilfe2 das drin ist, was erwartet wurde. Wenn Du das auf andere Weise geprüft hast, ist das auch in Ordnung.
Wollte nur sichergestellt haben, dass hilfe2 korrekt befüllt ist. Nächste Frage: Als ich mit TurboPascal programmieren lernte, konnte man auf Strings mit 'nem Index zugreifen. Sowas hier war (sinngemäß) gang und gäbe:
Delphi-Quellcode:
Ein String konnte maximal 255 Zeichen enthalten, im 0. Zeichen stand die Länge. Da b an der Adresse von s liegt, enthält es immer die Länge des String.
var
s : String; b : Byte Absolut s; i : Integer; begin s := '1234567890'; for i := 1 to b do begin WriteLn(s[i]); end; s := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; for i := 1 to b do begin WriteLn(s[i]); end; end; Heute kann ein "handelsüblicher" String auch mehr als 255 Zeichen enthalten. In Delphi 7 wird zwischen String und ShortString unterschieden. Zitat:
Wenn ja, wäre das mal einen Versuch wert. Geht das heute mit den Mehrbytezeichensätzen auch noch? Ausgehend von der Programmlogik scheint mir dashier korrekt zu sein:
Delphi-Quellcode:
Wenn hier aber a und b Werte enthalten, die nicht im Array vorkommen, so kann das beinahe nur durch den Zugriff auf Speicherinhalte außerhalb des Arrays resultieren (da das ja offensichtlich korrekt befüllt ist).
a := hilfe2[schluessel2[zaehler1]];
b := hilfe2[t1[zaehler1]]; Gibt es in FreePascal eine Bereichsprüfung für Arraygrenzen und wenn ja, ist die eingeschaltet? In Delphi 7 heißt es in der Hilfe: Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 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