Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Sehr komischer Fehler beim Beenden der Schleife... (https://www.delphipraxis.net/102043-sehr-komischer-fehler-beim-beenden-der-schleife.html)

simlei 22. Okt 2007 17:16


Sehr komischer Fehler beim Beenden der Schleife...
 
im untenstehenden Code gibt es einen komischen fehler: beim Beenden der Schleife (im Debug modus genau dann, wenn es so aussieht:)
Delphi-Quellcode:
 ==> for k:=0 to keylength-1 do
    begin
        for i:=0 to 25 do
        begin
          stringgrid_mono.Cells[k+1,i+1]:=IntToStr(letter[k,i]);
       end;
    end;
dabei ist "==>" dieser grüne debugpfeil, k = keylength (also eigentlich der Schritt, nachdem er aus der Schleife springen sollte) und i = natürlich 25.

Dann, wenn ich in der abgebildeten Situation auf "Next Step" gehe (F8 ), dann gibts ne invalidPointerException...
Ich hoffe, die anderen verwendeten Komponenten sind durch die Benennung deutlich :)

hoffentlich weiß einer Rat, bin hier schon am Verzweifeln...

Delphi-Quellcode:
//Prozedur zum Durchführen der Häufigkeitsanalyse
procedure Tkrypt_form.Hufigkeitsanalyse1Click(Sender: TObject);
  var i,j,k                : integer;
      keylength            : integer;
      modul                : integer;
      chiffre, teilchiffre : string;
      letter               : TLetterFreq;
  begin
  //Schlüssellänge einlesen
  keylength := StrToInt(edit_keylength.Text);
  //entsprechend viele Spalten für die Ausgabe schaffen
  stringgrid_mono.ColCount := keylength+1;
  //entsprechend Array initialisieren
  SetLength(letter,keylength);
  //verschlüsselten Text einlesen
  chiffre:='';
  for i:=0 to richedit_input.lines.Count-1 do
    chiffre:=chiffre+richedit_input.Lines[i];

  //Sollte kein Text da sein, so füge ein Leerzeichen ein
  if chiffre='' then
    chiffre:=' ';

  //Mache das Stringgrid sichtbar
  stringgrid_mono.Visible:=true;
  //passe die 1. Spaltenbreite an
  stringgrid_mono.ColWidths[0]:=15;

  //Formatierung des Stringgrids bearbeiten
  for k:=0 to keylength-1 do
    begin
    //Füge in den Kopf den Rest mod Schlüssellänge ein
    stringgrid_mono.cells[k+1,0]:=IntToStr(k);
    //Füge in die Spalte ganz links die Buchstabenbezeichnungen ein
    stringgrid_mono.Cells[0,k+1]:=char(65+k);
    end;

  //Häufigkeiten durch Funktion letter_frequency ermitteln
  letter:=letter_frequency(chiffre,keylength);

   for k:=0 to keylength-1 do
    begin
      for i:=0 to 25 do
      begin
        stringgrid_mono.Cells[k+1,i+1]:=IntToStr(letter[k,i]);
      end;
    end;
end;

DeddyH 22. Okt 2007 17:19

Re: Sehr komischer Fehler beim Beenden der Schleife...
 
Wieviele Zeilen hat das Grid?

simlei 22. Okt 2007 17:51

Re: Sehr komischer Fehler beim Beenden der Schleife...
 
27

DeddyH 22. Okt 2007 17:57

Re: Sehr komischer Fehler beim Beenden der Schleife...
 
Ah, Moment. Versuch es mal mit
Delphi-Quellcode:
for k:=0 to keylength-2 do
Du greifst ja auch in der Schleife auf k+1 zu.

simlei 22. Okt 2007 18:13

Re: Sehr komischer Fehler beim Beenden der Schleife...
 
das wars leider nicht; keylength regelt sie Länge von letter und dort wird ja auch nur auf k und nicht auf k+1 zugegriffen.
weiterhin setzt keylength die Spalten auf keylength+1; und deswegen entseht da auch kein konflikt...

würde es was nützen, wennich das Projekt mal poste? ist zwar etwas groß und noch nicht aufgeräumt, aber vielleicht..

DeddyH 22. Okt 2007 18:16

Re: Sehr komischer Fehler beim Beenden der Schleife...
 
Naja, schaden kann es nicht. Aber bitte nicht im Quellcode, sondern als Anhang;)

simlei 22. Okt 2007 18:30

Re: Sehr komischer Fehler beim Beenden der Schleife...
 
Liste der Anhänge anzeigen (Anzahl: 1)
Also als erstes mal großes Danke wer sich das mal anschaut... sitze mal wieder hier an nem Fehlerchen ne halbe Stunde lang...
Die betreffende Prozedur ist die erste im Menü-Menü :) "Methoden" (->"Häufigkeitsanalyse)

Wie gesagt noch nicht sehr strukturiert, woltle das noch erledigen, aber es funktioniert ja nichtmal...

DeddyH 22. Okt 2007 18:48

Re: Sehr komischer Fehler beim Beenden der Schleife...
 
Ich habe einen Fehler in der Funktion letter_frequency gefunden.
Delphi-Quellcode:
//Funktion für die (periodische) Häufigkeitsanalyse
function letter_frequency (chiffre:string;keylength:integer):TLetterFreq;
  var i,j,k      : integer;
      teilchiffre : string;
  begin
  SetLength(Result,keylength);
  for i:=0 to keylength - 1 do //<-- hier, es muss - 1 heißen oder besser gleich mit Low und High arbeiten
    for j:=0 to 25 do
      Result[i,j]:=0;

  for k:=0 to keylength-1 do
    begin
    //für den 1. Schlüssel, 2. Schlüssel, etc. Teilstrings erstellen
    teilchiffre:=getCharsAt(k,keylength,chiffre);
    for i:=1 to length(teilchiffre) do
      Result[k,ord(teilchiffre[i])-65]:=Result[k,ord(teilchiffre[i])-65]+1;
    end;
  end;
BTW: Du solltest das dynamische Array nach Gebrauch mit SetLength wieder freigeben.

simlei 22. Okt 2007 19:02

Re: Sehr komischer Fehler beim Beenden der Schleife...
 
Aalso ich bedanke mich recht herzlich! das hat geklappt!
Da sieht man wieder wie groß der Wert eines übersichtlichen Quelltextes ist (kleiner Wink an meinen Partner der den Code nämlich eig. geschrieben hat und nur nicht in das Forum konnte ;) )

RavenIV 23. Okt 2007 08:22

Re: Sehr komischer Fehler beim Beenden der Schleife...
 
Zitat:

Zitat von simlei
Aalso ich bedanke mich recht herzlich! das hat geklappt!
Da sieht man wieder wie groß der Wert eines übersichtlichen Quelltextes ist (kleiner Wink an meinen Partner der den Code nämlich eig. geschrieben hat und nur nicht in das Forum konnte ;) )

Da wink ich doch gleich mal mit.
Und werfe noch den Hinweis auf Styleguides hinterher. :???:


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:39 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