AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Indexproblem - Hilfe

Ein Thema von Maurooon · begonnen am 24. Feb 2017 · letzter Beitrag vom 24. Feb 2017
Antwort Antwort
Maurooon

Registriert seit: 7. Dez 2016
70 Beiträge
 
#1

Indexproblem - Hilfe

  Alt 24. Feb 2017, 16:56
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
"One of the basic rules of the universe is that nothing is perfect. Perfection simply doesn't exist... Without imperfection, neither you nor I would exist." - Stephen Hawking
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#2

AW: Indexproblem - Hilfe

  Alt 24. Feb 2017, 17:46
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:
var
  ch : Char
  sl : TStringList;
begin
  sl := TStringList.Create;
  for ch = 'ato 'zdo sl.Add(Format('Index %s = %d',[ch,hilfe2[ch]]));
  sl.SaveToFile('hilfe2.inhalt');
  // oder
  ShowMessage(sl.Text);
  sl.Free;
  ...
Stimmt die Ausgabe mit dem erwarteten Inhalt überein?
  Mit Zitat antworten Zitat
Maurooon

Registriert seit: 7. Dez 2016
70 Beiträge
 
#3

AW: Indexproblem - Hilfe

  Alt 24. Feb 2017, 18:00
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:
x := 0;
  for zaehler2 := 'a' to 'z' do begin    //zweites Hilfsarray befüllen von 0 bis 25
    hilfe2[zaehler2] := x;
    inc(x);
  end;
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...

LG
"One of the basic rules of the universe is that nothing is perfect. Perfection simply doesn't exist... Without imperfection, neither you nor I would exist." - Stephen Hawking
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#4

AW: Indexproblem - Hilfe

  Alt 24. Feb 2017, 18:37
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:
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;
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.
Heute kann ein "handelsüblicher" String auch mehr als 255 Zeichen enthalten.

In Delphi 7 wird zwischen String und ShortString unterschieden.
Zitat von Delphi 7-Hilfe:
ShortString 255 Zeichen 2 bis 256 Byte Abwärtskompatibilität
Damit kann man noch solche turbopascaltypischen "Spielereien" machen. Geht das unter FreePascal auch noch mit normalen Strings oder kennt das auch den ShortString?
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:
a := hilfe2[schluessel2[zaehler1]];
b := hilfe2[t1[zaehler1]];
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).

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:
Bereichsprüfung

Typ Schalter
Syntax {$R+} oder {$R-}
{$RANGECHECKS ON} oder {$RANGECHECKS OFF}
Vorgabe (Kontrollfeld) {$R-}
{$RANGECHECKS OFF}
Bereich Lokal
Anmerkungen

Mit der Direktive $R kann die Generierung von Bereichsprüfungscode aktiviert und deaktiviert werden. Im Status {$R+} werden alle Ausdrücke, die Arrays und Strings indizieren, dahingehend überprüft, ob sie sich innerhalb der festgelegten Grenzen befinden. Der gleichen Prüfung werden alle Zuweisungen an skalare Variablen und Teilbereichsvariablen unterzogen. Das Fehlschlagen der Bereichsprüfung führt zu einer ERangeError-Exception (bzw. zum Programmabbruch, wenn die Exception-Behandlung nicht aktiviert ist).

Die Aktivierung der Bereichsprüfung vergrößert und verlangsamt Ihr Programm.
Kennt FreePascal das auch, dann füge bitte diesen Kompilerschalter in Deinen Quelltext ein und schaue dann, ob er für ein verändertes Programverhalten sorgt.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 21:43 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz