AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Einfacher Verschlüsselungs-Algorythmus // Fehler
Thema durchsuchen
Ansicht
Themen-Optionen

Einfacher Verschlüsselungs-Algorythmus // Fehler

Ein Thema von jawo3 · begonnen am 15. Sep 2009 · letzter Beitrag vom 16. Sep 2009
Antwort Antwort
jawo3

Registriert seit: 15. Sep 2009
Ort: Niedersachsen
41 Beiträge
 
#1

Einfacher Verschlüsselungs-Algorythmus // Fehler

  Alt 15. Sep 2009, 20:13
Hi,
ich habe mich hier neu angemeldet, also erstmal ein bisschen was zur Vorgeschichte. Ich bin jetzt in Klasse 12 der gymnasialen Oberstufe und wir beschäftigen uns mit Delphi. Da ich vergangenes Jahr im Ausland war, habe ich quasi das erste Jahr Informatik verpasst und damit auch den Einstieg in die Programmiersprache Delphi. Also habe ich mich innerhalb der letzen Tage einigermaßen ausführlich mit Delphi beschäftigt und mir wie ich finde einige Grundlagen angeeignet. Man muss dazu sagen, dass ich vorher schon wenig Programmiererfahrung mit C++ hatte.

Das Derzeitige Unterrichtsthema ist die Delphi-Programmierung eines einfachen Verschlüsselungsalgorythmus. Wie das von statten gehen soll habe ich als Kommentar am Anfang des Quelltexts aufgeführt. Ich bin theoretisch mit dem Programm fertig, allerdings wird noch eine mir unerklärliche Fehlermeldung ausgegeben.

Es wäre wirklich super, wenn sich jemand mal bitte mein Programm angucken könnte, um mir ein bisschen mit der Problemlösung zu helfen. Ursprünglich sollte das Programm den Inhalt des ersten von zwei Eingabefeldern in ein zweidimensionales Array schreiben, welches dann gespiegelt in ein neues Array geschrieben werden sollte. Das sollte dann als String im zweiten Edit-Feld ausgegeben werden. Das habe ich allerdings nicht hinbekommen, weil ich nicht wusste wie man einen String zeichenweise in ein zweidimensionales Array reinbekommt (vielleicht kann mir ja sogar jemand sagen, wie das geht?), also habe ich das etwas umgeschrieben und quasi den Ursprungs-Charakter-Positionen nach gleichem Schema neue Positionen zugeordnet. Hier wird aber glaube ich der Fehler generiert, bei der Zuordnung der Werte aus StringEingabe zu StringAusgabe. Hier habe ich ein bisschen mit Zeigern rumgespielt und strcopy benutzt, weil ich das irgendwo mal gelesen habe, aber wie gesagt, es funktioniert einfach nicht.

Hier also der Quelltext:

Delphi-Quellcode:
(*
ZUWEISUNG DER EINGABE ELEMENTE ZU DEN AUSGABE ELEMENTEN / VERSCHLÜSSELUNGSALGORYTHMUS:
->Die Ihalte von EditEingabe und EditAusgabe werden in der Theorie als zwei Zweidimensionale-Arrays
  angesehen. EditAusgabe entsteht aus EditEingabe durch Spiegelung des Arrays.

EditEingabe                      EditAusgabe
1  2  3  4  5        >        5 10 15 20 25
6  7  8  9 10          >      4  9 14 19 24
11 12 13 14 15  ---------->    3  8 13 18 23
16 17 18 19 20          >      2  7 12 17 22
21 22 23 24 25        >        1  6 11 16 21

*)


unit Chaos;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    EditEingabe: TEdit;
    EditAusgabe: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    ButtonStart: TButton;
    ButtonEnd: TButton;
    Label3: TLabel;
    EditVerwZeichen: TEdit;
    procedure ButtonEndClick(Sender: TObject);
    procedure ButtonStartClick(Sender: TObject);
    procedure EditEingabeChange(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  StringEingabe: string; // Zum speichern des Eingabe Satzes.
  StringAusgabe: string; // Zum speichern des Ausgabe Satzes.
  ZeigEin: Pchar; // Zeiger auf Eingabe-Chars
  ZeigAus: Pchar; // Zeiger auf Ausgabe-Chars
  ArrayAusgabe: array [1..25] of integer = (5,10,15,20,25,4,9,14,19,24,3,8,13,18,23,2,7,12,17,22,1,6,11,16,21);
                          //ArrayAusgabe speichert die definierte Zuordnung der neuen Charakterpositionen gemäß des gewählten Verschlüsselungsstandards

implementation
{$R *.dfm}

procedure TForm1.EditEingabeChange(Sender: TObject);
begin
  Form1.EditVerwZeichen.Text:=IntToStr(Length(Form1.EditEingabe.Text)); //Anzeige der verwendeten Zeichen
end;

procedure TForm1.ButtonStartClick(Sender: TObject); //Button zum Starten der Verschlüsselung

var i: integer; // für for-Schleife

begin

if length(EditEingabe.Text)=0 then showmessage('Bitte Text eingeben'); //Keine Zeichen eingegeben?
if length(EditEingabe.Text)>25 then showmessage('Bitte maximal 25 Zeichen eingeben'); // Zu viele Zeichen eingegeben?

StringEingabe := EditEingabe.Text; //Inhalt aus Eingabe Textfeld wird als String gespeichert

for i:=1 to 25 do //einzelne Zeichen des Strings werden nacheinander mit neuen Positionen als neuer String gespeichert
  begin
    ZeigEin:=Addr(StringEingabe[i]); //Zeiger auf Eingabe-Char zum Kopieren des Werts
    ZeigAus:=Addr(StringAusgabe[ArrayAusgabe[i]]); //Zeiger auf Ausgabe-Char zum Kopieren des Werts
    strcopy(ZeigAus,ZeigEin); //Zuweisung
  end;
EditAusgabe.Text:=StringAusgabe; //Anzeige im Ausgabe Textfeld
end;

procedure TForm1.ButtonEndClick(Sender: TObject); // Button zum Beenden des Programms
begin
  close;
end;

end.
Ich habe mich bemüht den Quelltext ausreichend zu kommentieren. Falls noch Fragen auftauchen, werde ich sofort weiterhelfen.
Von der grafischen Aufmachung sieht das Programm so aus:
http://img156.imageshack.us/img156/7818/progl.png


Vielen Dank im Voraus
Jan
Jan
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.149 Beiträge
 
Delphi 12 Athens
 
#2

Re: Einfacher Verschlüsselungs-Algorythmus // Fehler

  Alt 15. Sep 2009, 20:32
Erstmal willkommen.

Bilder und andere Dateien bitte möglichst als Anhänge direkt in den Beitrag,
damit auch andere Suchende, mit ähnlichen Problemen, noch in Jahren diese Anhänge vorfinden.


Zitat:
allerdings wird noch eine mir unerklärliche Fehlermeldung ausgegeben.
Ja und mich würde mal interessieren, welche es denn nun ist.

Strg+C (Kopieren) geht bei den Delphifehlermeldungen
und dann den Text einfach hier einfügen, wenn du diese lange Meldung nicht abtippen möchtest ^^
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
jawo3

Registriert seit: 15. Sep 2009
Ort: Niedersachsen
41 Beiträge
 
#3

Re: Einfacher Verschlüsselungs-Algorythmus // Fehler

  Alt 15. Sep 2009, 20:41
Sorry, hab ich wohl das wichtigste vergessen


Also, das ganze ist eine "Debugger Exception Notification" die in einem neuen Fenster aufgeht.

Hier der Inhalt:
Project Verschluesselung.exe raised exception class EAccessViolation with message 'Access violation at address 00408835 in module Verschluesselung.exe. Read of address 00000000'. Process stopped. Use Step or Run to continue.


Eine Idee woran das liegt?
Jan
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Einfacher Verschlüsselungs-Algorythmus // Fehler

  Alt 15. Sep 2009, 20:50
Guten Abend,

ich habe nirgendwo gelesen, dass
die Länge des strings StringAusgabe gesetzt wurde.

So kann es leicht sein das auf einen nicht existenten String zugegriffen wird.
ZeigAus:=Addr(StringAusgabe[ArrayAusgabe[i]]); Da die Ausgabe nicht länger als die Eingabe sein sollte
würde hier ein
setlength(StringAusgabe,length(StringEingabe)); reichen.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.149 Beiträge
 
Delphi 12 Athens
 
#5

Re: Einfacher Verschlüsselungs-Algorythmus // Fehler

  Alt 15. Sep 2009, 20:52
Adresse 000000xx deutet meißt darauf hin, daß irgendwo kein speicher reserviert wurde (NIL-Pointer) ... z.B. leerer String oder fehlendes Objekt/Array

in diesem Fall gibt es 2 Fehlerstellen

1.] was glaubst du passiert, wenn EingabeString nicht mindestens 25 Zeichen hat?
= genau, man versucht irgendwann außerhalb des Strings etwas zu lesen

Du solltest also entweder nur maximal soviele Zeichen verarbeiten, wie im String sind
oder den String vorher auf die passende Länge bringen

2.] du hast keinen Speicher für Ausgabestring reserviert
= SetLength(StringAusgabe, 25); sollte reichen (also vor der Schleife )

und es macht sich nicht so gut, wenn du globale Variablen nutzt, obwohl nur Prozedur-lokale nötig sind

PS: ArrayAusgabe macht sich als Konstante auch nicht schlecht

Und wozu strcopy, wo du doch vermutlich nur je ein Zeichen kopieren willst?
Dieses sord dann auch nochmal, daß du dir a) schon übertragene Zeichen überschreibst und leicht mal den Speicherbereich von StringAusgabe überscheitest, so daß im Extremfall besser für StringAusgabe mindestens Length(StringEingabe)+24 Zeichen reservert werden müßten und nicht nur 25
MSDN sagt zu StrCopy
StrCopy führt keine Überprüfung der Länge durch. Der Zielpuffer muss daher mindestens Platz für StrLen(Source)+1 Zeichen bieten.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
jawo3

Registriert seit: 15. Sep 2009
Ort: Niedersachsen
41 Beiträge
 
#6

Re: Einfacher Verschlüsselungs-Algorythmus // Fehler

  Alt 15. Sep 2009, 20:58
Öhm, ja.
Danke erstmal. Ich muss jetzt erstmal verstehen, was du gerade geschrieben hast.

Was wäre denn der einfachste Weg um Zeichen von StringEingabe in StringAusgabe zu schreiben?

Anscheinend ist die strcopy Lösung mit den Zeigern nicht so das gelbe vom Ei.
Jan
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.149 Beiträge
 
Delphi 12 Athens
 
#7

Re: Einfacher Verschlüsselungs-Algorythmus // Fehler

  Alt 15. Sep 2009, 21:22
du greifst ja schon auf die einzelnen Zeichen zu, also du kannst sie genauso rüberkopieren

StringAusgabe[ArrayAusgabe[i]] := StringEingabe[i]; jetzt nur noch die Variablen StringEingabe und StringAusgabe in die Prozedur ButtonStartClick zum i,
ZeigEin und ZeigAus können weg,
vor ArrayAusgabe ein CONST
und dann noch das Problem mit dem Speicher von StringEingabe und StringAusgabe, welchen du auf deine 25 Zeichen hochsetzen solltest.
- StringAusgabe hab ich ja schon erwähnt
- und bei StringEingabe würde ich z.B. gengend Leerzeichen anhängen
(entweder einzelne ' ' in einer Schleife oder z.B. via StringOfChar)

man kann auch StringAusgabe entsprechend erstmal mit 25 Leerzeichen füllen
und dann in der Schleife nur soviele Zeichen verarbeiten, wie in StringEingabe drinnen sind
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#8

Re: Einfacher Verschlüsselungs-Algorythmus // Fehler

  Alt 15. Sep 2009, 23:28
Du hast hier einen hinterhältigen Fehler im Code:
Delphi-Quellcode:
procedure TForm1.EditEingabeChange(Sender: TObject);
begin
  Form1.EditVerwZeichen.Text:=IntToStr(Length(Form1.EditEingabe.Text)); //Anzeige der verwendeten Zeichen
end;
Du greifst auf die globale Variable Form1 zu, obwohl überhaupt nicht gesagt ist, dass "self" und "Form1" identisch sind.
Abhilfe: einfach nicht Form1 hinschreiben
Delphi-Quellcode:
procedure TForm1.EditEingabeChange(Sender: TObject);
begin
  EditVerwZeichen.Text:=IntToStr(Length(EditEingabe.Text)); //Anzeige der verwendeten Zeichen
end;
fork me on Github
  Mit Zitat antworten Zitat
jawo3

Registriert seit: 15. Sep 2009
Ort: Niedersachsen
41 Beiträge
 
#9

Re: Einfacher Verschlüsselungs-Algorythmus // Fehler

  Alt 16. Sep 2009, 14:02
Vielen Dank für eure Hilfe, ich hab's jetzt hinbekommen und es funktioniert, wie ich es wollte.

Hier der fertige Quelltext:
Delphi-Quellcode:
(*
ZUWEISUNG DER EINGABE ELEMENTE ZU DEN AUSGABE ELEMENTEN / VERSCHLÜSSELUNGSALGORYTHMUS:
->Die Ihalte von EditEingabe und EditAusgabe werden in der Theorie als zwei Zweidimensionale-Arrays
  angesehen. EditAusgabe entsteht aus EditEingabe durch Spiegelung des Arrays über die Diagonale.
  Somit hat jede Ausgangsstelle einen eindeutigen Partner, was das Rückgängigmachen der Verschlüsselung
  ermöglicht.

EditEingabe                      EditAusgabe
1  2  3  4  5        >        25 20 15 10 5
6  7  8  9 10          >      24 19 14  9 4
11 12 13 14 15  ---------->    23 18 13  8 3
16 17 18 19 20          >      22 17 12  7 2
21 22 23 24 25        >        21 16 11  6 1

*)


unit Chaos;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    EditEingabe: TEdit;
    EditAusgabe: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    ButtonStart: TButton;
    ButtonEnd: TButton;
    Label3: TLabel;
    EditVerwZeichen: TEdit;
    procedure ButtonEndClick(Sender: TObject);
    procedure ButtonStartClick(Sender: TObject);
    procedure EditEingabeChange(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var Form1: TForm1;
const ArrayAusgabe: array [1..25] of integer = (25,20,15,10,5,24,19,14,9,4,23,18,13,8,3,22,17,12,7,2,21,16,11,6,1);
                          //ArrayAusgabe speichert die definierte Zuordnung der neuen Charakterpositionen gemäß des gewählten Verschlüsselungsstandards

implementation
{$R *.dfm}

procedure TForm1.EditEingabeChange(Sender: TObject);
begin
  EditVerwZeichen.Text:=IntToStr(Length(Form1.EditEingabe.Text)); //Anzeige der verwendeten Zeichen
end;

procedure TForm1.ButtonStartClick(Sender: TObject); //Button zum Starten der Verschlüsselung

var h,i: integer; // für for-Schleifen
    StringEingabe: string; // Zum speichern des Eingabe Satzes.
    StringAusgabe: string; // Zum speichern des Ausgabe Satzes.
    leer: char;

begin

if length(EditEingabe.Text)=0 then showmessage('Bitte Text eingeben'); //Keine Zeichen eingegeben?
if length(EditEingabe.Text)>25 then showmessage('Bitte maximal 25 Zeichen eingeben'); // Zu viele Zeichen eingegeben?

StringEingabe := EditEingabe.Text; //Inhalt aus Eingabe Textfeld wird als String gespeichert
leer:=' ';

if length(EditEingabe.Text)<25 then
  begin
    for h:=1 to 25-length(EditEingabe.Text) do
      begin
        StringEingabe:=StringEingabe + leer;
      end; //Eingabe mit Leerzeichen auffüllen, falls Anzahl Zeichen < 25
  end;

setlength(StringAusgabe,25); //Maximale Länge des Ausgabestrings wird auf 25 festgesetzt

for i:=1 to 25 do //einzelne Zeichen des Strings werden nacheinander mit neuen Positionen als neuer String gespeichert
  begin
    StringAusgabe[ArrayAusgabe[i]]:=StringEingabe[i]; //Zuweisung
  end;
EditAusgabe.Text:=StringAusgabe; //Anzeige im Ausgabe Textfeld
end;

procedure TForm1.ButtonEndClick(Sender: TObject); // Button zum Beenden des Programms
begin
  close;
end;

end.
Grüße
Jan
Jan
  Mit Zitat antworten Zitat
Antwort Antwort


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 03:03 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