![]() |
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 |
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.
|
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? :) |
Re: Variablen währen Laufzeit erzeugen?
Man kann aber keine Variablen zur Laufzeit erzeugen, macht imho auch keinen Sinn.
|
Re: Variablen währen Laufzeit erzeugen?
ja, das ist ja imho schon bekannt. weiß jemand ob es dafür eine andere Möglichkeit gibt? :)
|
Re: Variablen währen Laufzeit erzeugen?
Wurde doch schon gesagt: In so einem Fall sind dynamische Arrays einsetzbar oder Listen.
|
Re: Variablen währen Laufzeit erzeugen?
Für die gegebene Aufgabenstellung kannst Du ein
Delphi-Quellcode:
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.
array of String
Zur Ausgabe verwendest Du dann wieder eine Schleife, und fertig. |
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 |
Re: Variablen währen Laufzeit erzeugen?
Inwiefern?
Ein Stirng anhängen
Delphi-Quellcode:
String in eine bestimmte Zeile einfügen
StringList.Add(STRING);
Delphi-Quellcode:
Ansonsten einen String an einen bestehenden String anhängen
StringListe.list.Insert(INDEX, STRING);
Delphi-Quellcode:
StringListe.Strings[INDEX]:= StringListe.Strings[INDEX] + STRING
|
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: |
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); |
Re: Variablen währen Laufzeit erzeugen?
macht leider keinen unterschied:(
|
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
|
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. |
Re: Variablen währen Laufzeit erzeugen?
er bleibt, wenn ich mit F7 durchgehe bei folgender Zeile stehen
Delphi-Quellcode:
Vorher hatte ich anstelle dieser Zeile folgendes stehen:
List.Strings[i]:= List.Strings[i] + Klartext[zeichen];
Delphi-Quellcode:
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:
List.Insert(i, Klartext[Zeichen]);
Zitat:
|
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)
|
Re: Variablen währen Laufzeit erzeugen?
Auf über 255 Zeichen pro String kommst du aber nicht?
Vergiss nicht, das eine StringListe mit
Delphi-Quellcode:
erstellt werden muss.
List:= TStringList.Create;
So wie du das machst, muss die StringListe am Index i schon einen Eintrag haben, sobald dort keiner ist, überschreitest du halt das Listenmaximum |
Re: Variablen währen Laufzeit erzeugen?
Was spielt das für eine Rolle?
|
Re: Variablen währen Laufzeit erzeugen?
Ja klingt logisch :) ...danke
aber leider funktioniert es immernoch nicht...
Delphi-Quellcode:
Kann ich nicht ein leeres Element einfügen?List.Add(''); List.Strings[i]:= List.Strings[i] + Klartext[zeichen]; Ich komme nicht auf über 255 und die Liste wird auch erstellt :) |
Re: Variablen während Laufzeit erzeugen?
Bitte nochmal den Quelltext am Stück posten, danke :)
|
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; |
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?
|
Re: Variablen während Laufzeit erzeugen?
Zitat:
das etwas angehängt wird ... :stupid: List := alter Inhalt + neuer Inhalt |
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?
|
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.
|
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:
|
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); |
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); |
Re: Variablen während Laufzeit erzeugen?
Zitat:
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:
Gruss
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); |
Re: Variablen während Laufzeit erzeugen?
Aber wieso in den Schleifen von null bis Length(Schlüssel)? Das passt doch nicht zusammen :)
|
Re: Variablen während Laufzeit erzeugen?
Zitat:
|
Re: Variablen während Laufzeit erzeugen?
Du müsstest doch bis length(Schluessel)-1 die Schleife laufen lassen?!
|
Re: Variablen während Laufzeit erzeugen?
warum? :gruebel: :)
|
Re: Variablen während Laufzeit erzeugen?
Weil der Index bei 0 anfängt; also bei 5 Elementen von 0 bis 4(5-1)
|
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:
Ist es ein dynamisches Array, dann muss die Schleife bei 0 beginnen und mit
for i := 1 to Length(Schluessel) do
Length() - 1 enden:
Delphi-Quellcode:
Ich bevorzuge allerdings bei for-Schleifen, die über ein komplettes Array
for i := 0 to Length(Schluessel) - 1 do
laufen, die Ermittlung der Grenzen mit Low() und High():
Delphi-Quellcode:
So ist man unabhängig davon, ob es sich um ein dynamisches Array oder ein
for i := Low(Schluessel) to High(Schluessel) do
statisches Array mit von 0 verschiedener unterer Grenze handelt. jkr |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:14 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