Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Variablen während Laufzeit erzeugen? (https://www.delphipraxis.net/101398-variablen-waehrend-laufzeit-erzeugen.html)

mo_greene 12. Okt 2007 13:26


Variablen während Laufzeit erzeugen?
 
Hallo,

ist es möglich während der Laufzeit des Programmes Variablen zu erzeugen? Wenn ja wie mache ich das?

Es geht darum, dass ich in Abhängigkeit von der Länge eines Textes verschiedene Variablen erstellen möchte.

MFG, Danke :)
mo_greene

Apollonius 12. Okt 2007 13:27

Re: Variablen währen Laufzeit erzeugen?
 
Nicht direkt. Du könntest allerdings mit dynamischen Arrays arbeiten oder die Variablen in den Objects einer TStringlist verwalten.

mo_greene 12. Okt 2007 14:03

Re: Variablen währen Laufzeit erzeugen?
 
Es geht darum, dass ich die Zeichen eines Textest nacheinander in Variablen (oder auch nicht:)) abspeichern möchte.

Beispiel:
Text: Hallo ich wohne in Deutschland

a =HLCOEDTHN
b =AOHHIESLD
c =LIWNNUCA

Die anzahl der vohrnanden Variablen, soll durch die Länge eines Wortes bestimmt werden, welches erst zur Programmlaufzeit bestimmt wird.

Wie mache ich das am Besten?
Hat jemand eine Idee? :)

mkinzler 12. Okt 2007 14:10

Re: Variablen währen Laufzeit erzeugen?
 
Man kann aber keine Variablen zur Laufzeit erzeugen, macht imho auch keinen Sinn.

mo_greene 12. Okt 2007 14:12

Re: Variablen währen Laufzeit erzeugen?
 
ja, das ist ja imho schon bekannt. weiß jemand ob es dafür eine andere Möglichkeit gibt? :)

Luckie 12. Okt 2007 14:15

Re: Variablen währen Laufzeit erzeugen?
 
Wurde doch schon gesagt: In so einem Fall sind dynamische Arrays einsetzbar oder Listen.

OldGrumpy 12. Okt 2007 16:23

Re: Variablen währen Laufzeit erzeugen?
 
Für die gegebene Aufgabenstellung kannst Du ein
Delphi-Quellcode:
array of String
benutzen. Zur Laufzeit bestimmst Du wie viele Strings du brauchst, setzt mit SetLength diese Anzahl Strings für das Array und verteilst die Buchstaben dann der Reihe nach auf diese Strings.
Zur Ausgabe verwendest Du dann wieder eine Schleife, und fertig.

mo_greene 12. Okt 2007 22:53

Re: Variablen währen Laufzeit erzeugen?
 
Ich habe jetzt eine Stringliste benutzt.

Aber noch eine Frage:

Wie kann ich denn ein Zeichen in ein Element einer List hinzufügen?

Also: List := List + Zeichen?

mfg

David

quendolineDD 12. Okt 2007 22:59

Re: Variablen währen Laufzeit erzeugen?
 
Inwiefern?
Ein Stirng anhängen
Delphi-Quellcode:
StringList.Add(STRING);
String in eine bestimmte Zeile einfügen

Delphi-Quellcode:
StringListe.list.Insert(INDEX, STRING);
Ansonsten einen String an einen bestehenden String anhängen

Delphi-Quellcode:
StringListe.Strings[INDEX]:= StringListe.Strings[INDEX] + STRING

mo_greene 12. Okt 2007 23:07

Re: Variablen währen Laufzeit erzeugen?
 
Ich bekomme eine Fehlermeldung, dass das Maximum überschritten wird :gruebel:

Delphi-Quellcode:
    repeat
    for i := 0 to length (Schluessel) do // x = Länge des Schlüssels
    begin                               // x = Anzahl der Elemente in List
      List.Strings[i]:= List.Strings[i] + Klartext[zeichen];
      inc (Zeichen);
      inc (z);
    end;
    i := 0;
    until z = length(Klartext);

Habe ich einen Fehler gemacht? :oops:

quendolineDD 12. Okt 2007 23:09

Re: Variablen währen Laufzeit erzeugen?
 
Nehm die Schleife mal nur bis length(schluessel) -1
Delphi-Quellcode:
repeat
    for i := 0 to length (Schluessel)-1 do // x = Länge des Schlüssels
    begin                               // x = Anzahl der Elemente in List
      List.Strings[i]:= List.Strings[i] + Klartext[zeichen];
      inc (Zeichen);
      inc (z);
    end;
    i := 0;
    until z = length(Klartext);

mo_greene 12. Okt 2007 23:12

Re: Variablen währen Laufzeit erzeugen?
 
macht leider keinen unterschied:(

quendolineDD 12. Okt 2007 23:18

Re: Variablen währen Laufzeit erzeugen?
 
Dann mach evtl. mal die Optimierung aus, wenn du die noch an hast im Compiler Menü und dann gehe mal den Quelltext mit F7 durch und schaue, wo du eine Bereichsverletzung hast. irgendwo müssen deine Zählvariabeln die Bereiche deiner Strings übersteigen

inherited 12. Okt 2007 23:24

Re: Variablen währen Laufzeit erzeugen?
 
Nur weil schluessel so gross ist nehme ich an dass du die Stringlist nicht vergrößert hast.
Du musst neue Zeilen per StringList.Add hinzufügen.

mo_greene 12. Okt 2007 23:28

Re: Variablen währen Laufzeit erzeugen?
 
er bleibt, wenn ich mit F7 durchgehe bei folgender Zeile stehen

Delphi-Quellcode:
      List.Strings[i]:= List.Strings[i] + Klartext[zeichen];
Vorher hatte ich anstelle dieser Zeile folgendes stehen:

Delphi-Quellcode:
List.Insert(i, Klartext[Zeichen]);
Damit hat es geklappt, aber leider wird der String mit dem Index immer überschrieben, was ich ja nicht möchte. Dieser soll beibehalten werden und je um ein Zeichen erweitert werden :gruebel:


Zitat:

Zitat von inherited
Nur weil schluessel so gross ist nehme ich an dass du die Stringlist nicht vergrößert hast.
Du musst neue Zeilen per StringList.Add hinzufügen.

Auch wenn der Schlüssel den Wert 1 hat, funktioniert es nicht!

inherited 12. Okt 2007 23:34

Re: Variablen währen Laufzeit erzeugen?
 
Wenn deine Stringlist kein Element hat, wird es noch nichmal bei Schluessel=0 klappen. Es ist wie ein leerer Eierkarton: wenn du versucht das Ei an Position 3 kaputt zu hauen schlägst du ins leere, weil da einfach nichts ist. Du musst halt erst Eier reinpacken (.Add)

quendolineDD 12. Okt 2007 23:35

Re: Variablen währen Laufzeit erzeugen?
 
Auf über 255 Zeichen pro String kommst du aber nicht?
Vergiss nicht, das eine StringListe mit
Delphi-Quellcode:
List:= TStringList.Create;
erstellt werden muss.

So wie du das machst, muss die StringListe am Index i schon einen Eintrag haben, sobald dort keiner ist, überschreitest du halt das Listenmaximum

inherited 12. Okt 2007 23:36

Re: Variablen währen Laufzeit erzeugen?
 
Was spielt das für eine Rolle?

mo_greene 12. Okt 2007 23:38

Re: Variablen währen Laufzeit erzeugen?
 
Ja klingt logisch :) ...danke

aber leider funktioniert es immernoch nicht...

Delphi-Quellcode:
     
List.Add('');
List.Strings[i]:= List.Strings[i] + Klartext[zeichen];
Kann ich nicht ein leeres Element einfügen?

Ich komme nicht auf über 255 und die Liste wird auch erstellt :)

OldGrumpy 13. Okt 2007 08:23

Re: Variablen während Laufzeit erzeugen?
 
Bitte nochmal den Quelltext am Stück posten, danke :)

mo_greene 13. Okt 2007 10:34

Re: Variablen während Laufzeit erzeugen?
 
Delphi-Quellcode:
procedure TKryptobox.Verschluesseln;
(* -------------------------------------------------------------------- *)
var
  i, //Zählvariable für for-Schleife
  z, //Variable, die bis zum Ende des Klartextes zählt (repeat...until)
  KTWert,
  GTWert,
  Schluessellaenge, Zeichen : integer;
  List : TStringlist;
begin
  List := TStringlist.Create; //Stringlist wird erstellt
  Geheimtext := '' ;
  Vorbehandeln(Klartext);
  Zeichen := 1;
  z := 1;
(*--------------------------------------------------------------------------*)
  try
    repeat
    for i := 0 to length (Schluessel) do // x = Länge des Schlüssels
    begin                               // x = Anzahl der Elemente in List
      List.Add('');                    
      List.Strings[i]:= List.Strings[i] + Klartext[zeichen];
      //List.Insert(i, Klartext[Zeichen]);
      inc (Zeichen);
      inc (z);
    end;
    i := 0;
    until z = length(Klartext);
  except
    ShowMessage('Fehler');
  end;
List.SaveToFile('C:\Krypto.txt'); //Zum Testen des Inhalts in List :)
(*--------------------------------------------------------------------------*)
end;

inherited 13. Okt 2007 10:47

Re: Variablen während Laufzeit erzeugen?
 
kurze frage: Was genau möchtest du erreichen. Willst du das bei jedem Durchlauf an die Zeilen etwas angehängt wird oder das bei jedem Durchlauf die liste geleert wird und neu beschrieben?

mo_greene 13. Okt 2007 10:49

Re: Variablen während Laufzeit erzeugen?
 
Zitat:

Zitat von inherited
kurze frage: Was genau möchtest du erreichen. Willst du das bei jedem Durchlauf an die Zeilen etwas angehängt wird oder das bei jedem Durchlauf die liste geleert wird und neu beschrieben?


das etwas angehängt wird ... :stupid:

List := alter Inhalt + neuer Inhalt

inherited 13. Okt 2007 10:55

Re: Variablen während Laufzeit erzeugen?
 
Und ist Schluessel vorher und nachher gleichgroß, also beim ersten und beim 2. durchlauf, bei dem etwas angehängt werden soll?

OldGrumpy 13. Okt 2007 10:57

Re: Variablen während Laufzeit erzeugen?
 
Der Knackpunkt ist die Abbruchbedingung für die repeat..until-Schleife (und die fehlende Abbruchbedingung für die innere Schleife). So wie Du das implementiert hast, muss die Länge des Klartextes ein Vielfaches der Schlüssellänge sein, sonst rumst es beim letzten Schleifendurchlauf. Denn die innere Schleife läuft immer so oft durch wie der Schlüssel lang ist.

mo_greene 13. Okt 2007 10:58

Re: Variablen während Laufzeit erzeugen?
 
Die Länge des Schlüssels ist immer gleich und es soll jeweils 1 zeichen angefügt werden...


Zitat:

Zitat von OldGrumpy
Der Knackpunkt ist die Abbruchbedingung für die repeat..until-Schleife. So wie Du das implementiert hast, muss die Länge des Klartextes ein Vielfaches der Schlüssellänge sein, sonst rumst es beim letzten Schleifendurchlauf. Denn die innere Schleife läuft immer so oft durch wie der Schlüssel lang ist.

Das heißt ich müsste innerhalb der Schleife noch überprüfen lassen, ob der Klartext zuenede ist und dann soll die Schleife beendet werden?

mo_greene 13. Okt 2007 11:09

Re: Variablen während Laufzeit erzeugen?
 
Es funktioniert :mrgreen: :mrgreen: Vielen Dank!!!

Habe nur noch ein kleines Anliegen:

Es fehlt das letzte Zeichen des Textes...habe ich einen Denkfehler gemacht?

Delphi-Quellcode:
    repeat
    for i := 0 to length (Schluessel) do // x = Länge des Schlüssels
    begin
      List.Add('');                               // x = Anzahl der Elemente in List
      List.Strings[i]:= List.Strings[i] + Klartext[zeichen];
      //List.Insert(i, Klartext[Zeichen]);
      inc (Zeichen);
      inc (z);
      if z = length (Klartext) then
        break;
    end;
    i := 0;
    until z = length(Klartext);

DeddyH 13. Okt 2007 11:33

Re: Variablen während Laufzeit erzeugen?
 
So besser (habe mir das Ganze aber nicht genauer angesehen)?:
Delphi-Quellcode:
repeat
    for i := 0 to length (Schluessel) do // x = Länge des Schlüssels
    begin
      List.Add('');                               // x = Anzahl der Elemente in List
      List.Strings[i]:= List.Strings[i] + Klartext[zeichen];
      //List.Insert(i, Klartext[Zeichen]);
      inc (Zeichen);
      inc (z);
      if z > length (Klartext) then
        break;
    end;
    i := 0;
    until z > length(Klartext);

thkerkmann 13. Okt 2007 12:03

Re: Variablen während Laufzeit erzeugen?
 
Zitat:

Zitat von mo_greene
Es funktioniert :mrgreen: :mrgreen: Vielen Dank!!!

Habe nur noch ein kleines Anliegen:

Es fehlt das letzte Zeichen des Textes...habe ich einen Denkfehler gemacht?

Delphi-Quellcode:
    repeat
    for i := 0 to length (Schluessel) do // x = Länge des Schlüssels
    begin
      List.Add('');                               // x = Anzahl der Elemente in List
      List.Strings[i]:= List.Strings[i] + Klartext[zeichen];
      //List.Insert(i, Klartext[Zeichen]);
      inc (Zeichen);
      inc (z);
      if z = length (Klartext) then
        break;
    end;
    i := 0;
    until z = length(Klartext);

Du hast jetzt aber eine Liste, die viel länger ist als gewollt.
Da du ja nicht nur in der ersten Runde in deine Liste Zeilen einhängst, sondern in jeder, bleiben jede Menge leere Listenzeilen übrig. Ich würde die Liste vor der repeat Schleife mal mit leeren Strings füllen, und dann weitermachen.

also
Delphi-Quellcode:
for i:=0 to length(Schluessel) do
  List.Add('');
repeat
  for i:=0 to length(Schluessel) do
  begin
    List.Strings[i] ...
    ...
  end
  i := 0; // kannste dir schenken ist unnötig
until z > length(Klartext);
Gruss

OldGrumpy 13. Okt 2007 12:08

Re: Variablen während Laufzeit erzeugen?
 
Aber wieso in den Schleifen von null bis Length(Schlüssel)? Das passt doch nicht zusammen :)

mo_greene 15. Okt 2007 20:53

Re: Variablen während Laufzeit erzeugen?
 
Zitat:

Zitat von thkerkmann
Du hast jetzt aber eine Liste, die viel länger ist als gewollt.
Da du ja nicht nur in der ersten Runde in deine Liste Zeilen einhängst, sondern in jeder, bleiben jede Menge leere Listenzeilen übrig. Ich würde die Liste vor der repeat Schleife mal mit leeren Strings füllen, und dann weitermachen.

also
Delphi-Quellcode:
for i:=0 to length(Schluessel) do
  List.Add('');
repeat
  for i:=0 to length(Schluessel) do
  begin
    List.Strings[i] ...
    ...
  end
  i := 0; // kannste dir schenken ist unnötig
until z > length(Klartext);
Gruss

Da tritt aber wieder der Fehler auf, dass das Listenmaximum überschritten wurde! :-D

quendolineDD 15. Okt 2007 21:01

Re: Variablen während Laufzeit erzeugen?
 
Du müsstest doch bis length(Schluessel)-1 die Schleife laufen lassen?!

mo_greene 15. Okt 2007 21:14

Re: Variablen während Laufzeit erzeugen?
 
warum? :gruebel: :)

mkinzler 15. Okt 2007 21:16

Re: Variablen während Laufzeit erzeugen?
 
Weil der Index bei 0 anfängt; also bei 5 Elementen von 0 bis 4(5-1)

jottkaerr 16. Okt 2007 06:28

Re: Variablen während Laufzeit erzeugen?
 
Hallo,

wie ist Schluessel definiert? Ist es ein String, dann muss die for-Schleife
mit 1 beginnen:

Delphi-Quellcode:
for i := 1 to Length(Schluessel) do
Ist es ein dynamisches Array, dann muss die Schleife bei 0 beginnen und mit
Length() - 1 enden:

Delphi-Quellcode:
for i := 0 to Length(Schluessel) - 1 do
Ich bevorzuge allerdings bei for-Schleifen, die über ein komplettes Array
laufen, die Ermittlung der Grenzen mit Low() und High():

Delphi-Quellcode:
for i := Low(Schluessel) to High(Schluessel) do
So ist man unabhängig davon, ob es sich um ein dynamisches Array oder ein
statisches Array mit von 0 verschiedener unterer Grenze handelt.

jkr


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