Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi String mit Hilfe einer Schleife zerteilen und auslesen (https://www.delphipraxis.net/96765-string-mit-hilfe-einer-schleife-zerteilen-und-auslesen.html)

cRayZo 30. Jul 2007 17:12


String mit Hilfe einer Schleife zerteilen und auslesen
 
Hi ich hab ein Problem beim auslesen eines String. Ich hab hier schon gesuch, aber nichts gefunden.

Das Problem ist folgendes:
ich möchte einen string auslesen, der in etwa so aussieht:

Zahl;Zahl:Zahl|Zahl;Zahl:Zahl| und so weiter

*Zahl* steht für eine beliebig große integer.
jede Zahl ist unterschiedlich



Hier ist der betreffende Teil des Quellcodes:

Zitat:

procedure TGeheimcodeForm.BitButtonEntschluesselnClick(Sende r: TObject);
Var
i,i2,i3,i4, Buffer, buchstabencount, Zahl1, Zahl2, Zahl3 : integer;
Buffer2, ZahlZufall1, ZahlZufall2, Speicher, x1, x2, x3:string;
begin
SPeicher:=Geheimcodetext.Text;
Zahlzufall1:=''; Zahlzufall2:=''; FOrm2.OriginalText.Text:=''; i2:=0; buchstabencount:=0;

for i:=0 to length(Geheimcodetext.text)do
if Geheimcodetext.Text[i]='|' then buchstabencount:=buchstabencount + 1 ;


for i2:=1 to buchstabencount do begin

i:=0;
x1:=(GetWordOfAnsiString1(SPeicher,1));
for i:=0 to length(x1)+1 do begin
delete(SPeicher,1,1); end;
i3:=0;
x2:=(GetWordOfAnsiString2(Speicher,1));
for i3:=0 to length(x3)+1 do begin
delete(SPeicher,1,1); end;
i4:=0;
x3:=(GetWordOfAnsiString3(SPeicher,1));
for i4:=0 to length(x3)+1 do begin
delete(SPeicher,1,1); end;

i:=0; SPeicher:='';

Zahl1:= strtoint(x1); Zahl2:= strtoint(x2); Zahl3:= strtoint(x3);
buffer:= (Zahl2-Zahl1);
buffer:= trunc(buffer/Zahl3);
x1:=''; x2:=''; x3:='';
showmessage(showmessage);
end;
end;

für das auslesen der Wörter hab ich als Funktion folgende benutzt:

Zitat:

Function GetWordOfAnsiString3(Text : string; WordPos : Word): string;
var
p : PChar;
begin
p := PChar(Text);
repeat
Dec(WordPos);
while p^ <> '|' do
begin
if WordPos = 0 then
Result := Result + p^;
Inc(p);
end;
if WordPos = 0 then Exit;
Inc(p);
until p^ = '|';
end;
Ich habe drei dieser Funktionen, jeh eine, die auf ein anderes Zeichen (also ; : | )als Wortende reagiert.
In dem Quelltext oben wird (wenn es klappen würde) erst Zahl1 ausgelesen und in die Variable x1 eingespeichert, dann wird Zahl1 und Trennzeichen gelöscht.
Das gleiche wird dann mit der zweiten und dritten gemacht.
Die drei Zahlen werden dann verrechnet, und diese Zahl ausgegeben. Das wiederholt sich für die nächsten drei zahlen und so weiter.

nur irgendwie klappt das nicht.
entweder hat Delphi ein Problem mit den Trennzeichen und löscht es nicht (fehlermeldung: ;Zahl ist keine integer) oder es kommt eine Fehlermeldung in der nicht mehr als
"
steht


könnt ihr mir helfen? Bittebitte
:hello:

shmia 30. Jul 2007 17:22

Re: String mit Hilfe einer Schleife zerteilen und auslesen
 
Keine Ahnung, weshalb du 3 verschiedene Trennzeichen benutzen möchtest - das ist nicht üblich.
Aber sei's drum, die Strategie sieht so aus:
Der String wird mit dem Trenner "|" in Einzelteile zerlegt und das Ergebnis in einer TStringList gespeichert.
Dafür gibt es fertige Funktionen in der Code-Library SplitstringSplitstring !
Man sollte wirklich die erprobten Funktionen verwenden - Funktionen Marke Eigenbau haben meisten einige Fehler.
Damit ist das Problem reduziert auf das Zerlegen von einfachen Strings dieser Bauart
Code:
Zahl;Zahl:Zahl

cRayZo 30. Jul 2007 17:50

Re: String mit Hilfe einer Schleife zerteilen und auslesen
 
ja, okay, danke schonmal ;)
darauf bin ich gar nicht gekommen. Mit stringlist eig super idee

aber das Hauptproblem ist ja eigentlich trotzdem geblieben.
wie kann ich die drei Zahlen

Zahl1;Zahl2:Zahl3

aus dem string jeweils in drei getrennte Variablen speichern?

SirThornberry 30. Jul 2007 18:23

Re: String mit Hilfe einer Schleife zerteilen und auslesen
 
Delphi-Quellcode:
var
  lCount: Integer;
  lMystr: String;
  lDsts : TStringList;
  lInt1,
  lInt2,
  lInt3 : Integer;
begin
  lMystr := '5;7:9';
  for lCount := 1 to Length(lMyStr) do
    if lMyStr[lCount] in [':', '|'] then
      lMyStr[lCount] := ';';

  lDsts := TStringList.Create();
  splitString(lMyStr, ';', lDsts);
  lInt1 := StrToInt(lDsts.Strings[0]);
  lInt2 := StrToInt(lDsts.Strings[1]);
  lInt3 := StrToInt(lDsts.Strings[2]);
  lDsts.Free;

cRayZo 3. Aug 2007 01:39

Re: String mit Hilfe einer Schleife zerteilen und auslesen
 
Ja erscheint mir alles total logisch!! aber wenn ich das genauso mache behauptet der was von Zugriffsverletzung u so! :wiejetzt:

Könntet ihr bitte mal alles in einen Quellcode schreiben, ich glaube darin liegt das Problem.

also wie man einen String mit (von mir aus vereinfacht)

Zahl1;Zahl2;Zahl3|

in Variablen ausliest
also je Zahl(1,2,3) eine Variable.

Wär riesig nett von euch vielen Dank!! :hello:

alleinherrscher 3. Aug 2007 01:56

Re: String mit Hilfe einer Schleife zerteilen und auslesen
 
Delphi-Quellcode:
var
  lCount: Integer;
  lMystr: String;
  lDsts : TStringList;
  lInt1,
  lInt2,
  lInt3 : Integer;
begin
  lMystr := '5;7:9';
  for lCount := 0 to Length(lMyStr)-1 do
    if lMyStr[lCount] in [':', '|'] then
      lMyStr[lCount] := ';';

  lDsts := TStringList.Create();
  splitString(lMyStr, ';', lDsts);
  lInt1 := StrToInt(lDsts.Strings[0]);
  lInt2 := StrToInt(lDsts.Strings[1]);
  lInt3 := StrToInt(lDsts.Strings[2]);
  lDsts.Free;

SirThornberry 3. Aug 2007 06:10

Re: String mit Hilfe einer Schleife zerteilen und auslesen
 
:shock: Strings beginnen beim Index 1 und nicht bei 0!
Die Zugriffsverletzung muss an etwas anderem liegen. Ich hab es bei mir selbst probiert und es kam keine Zugriffsverletzung. Ich vermute es wurde die hälfte vergessen beim abschreiben.

marabu 3. Aug 2007 07:04

Re: String mit Hilfe einer Schleife zerteilen und auslesen
 
Herzlich willkommen in der Delphi-PRAXiS, cRayZo.

Du könntest die unterschiedlichen Trennzeichen auch dadurch behandeln, dass du deinen String als Liste natürlicher Zahlen betrachtest, die durch nicht-numerische Zeichen voneinander getrennt sind. Die Funktion ExtractNumbers() liefert dir die Zahlen in einem dynamischen Array zurück. Ein Umspeichern in andere Variablen ist eigentlich nicht unbedingt notwendig, da du auf die erste Zahl mit numbers[0] zugreifen kannst:

Delphi-Quellcode:
uses
  Types; // TIntegerDynArray

procedure ExtractNumbers(const s: string; var ida: TIntegerDynArray);
var
  i, n: Integer;
  isNum: Boolean;
begin
  SetLength(ida, 0);
  n := 0;
  isNum := False;
  for i := 1 to Succ(Length(s)) do
  begin
    if (i > Length(s)) and not isNum
      then Break
      else isNum := s[i] in ['0'..'9'];
    if isNum then
      n := n * 10 + Ord(s[i]) - Ord('0')
    else
    begin
      SetLength(ida, Succ(Length(ida)));
      ida[High(ida)] := n;
      n := 0;
    end;
  end;
end;

procedure TDemoForm.ButtonClick(Sender: TObject);
var
  numbers: TIntegerDynArray;
  i: Integer;
  s: TStrings;
begin
  ExtractNumbers(Edit1.Text, numbers);
  s := TStringList.Create;
  for i := Low(numbers) to High(numbers) do
    s.Add(IntToStr(numbers[i]));
  ShowMessage(s.Text);
  s.Free;
end;
Freundliche Grüße vom marabu

alleinherrscher 3. Aug 2007 09:30

Re: String mit Hilfe einer Schleife zerteilen und auslesen
 
Zitat:

Zitat von SirThornberry
:shock: Strings beginnen beim Index 1 und nicht bei 0!
Die Zugriffsverletzung muss an etwas anderem liegen. Ich hab es bei mir selbst probiert und es kam keine Zugriffsverletzung. Ich vermute es wurde die hälfte vergessen beim abschreiben.

Uuups, sorry :oops: Wäre irgendein auch ein Fehler gewesen, den ich dir nicht zugetraut hätte, SirThornberry! :zwinker:

cRayZo 22. Aug 2007 22:29

Re: String mit Hilfe einer Schleife zerteilen und auslesen
 
okay klappt alles soweit, vielen Dank nochmal.

ich hab jetzt weitergearbeitet, stoße jetzt aber auf den Fehler ungültige Gleitkommaoperation

Zitat:

procedure ExtractNumbers(const s: string; var ida: TIntegerDynArray);
var
i, n: Integer;
isNum: Boolean;
begin
SetLength(ida, 0);
n := 0;
isNum := False;
for i := 1 to Succ(Length(s)) do
begin
if (i > Length(s)) and not isNum
then Break
else isNum := s[i] in ['0'..'9'];
if isNum then
n := n * 10 + Ord(s[i]) - Ord('0')
else
begin

SetLength(ida, Succ(Length(ida)));
ida[High(ida)] := n;
n := 0;
end;
end;
end;



procedure TGeheimcodeForm.BitButtonEntschluesselnClick(Sende r: TObject);
var
numbers: TIntegerDynArray;
i,i2: Integer;
s: TStrings;
x, buffer2: string;
Zahl1, Zahl2, Zahl3: integer;
Zahl1count, Zahl2count, Zahl3count, buffer: integer;
begin
Form2.OriginalText.Text:='';
x:=GeheimcodeText.Text;

ExtractNumbers(x, numbers);
s := TStringList.Create;
for i := Low(numbers) to High(numbers) do
s.Add(IntToStr(numbers[i]));
showmessage(s.Text);
s.Free;

-------------------------------------------------------------------------------------------

Zahl1count:=0; Zahl2count:=1; Zahl3count:=2;

for i2:=1 to trunc(length(x)) do begin
Zahl1:=numbers[Zahl1count];
Zahl2:=numbers[Zahl2count];
Zahl3:=numbers[zahl3count];

buffer:=trunc((Zahl2 - Zahl1)/ Zahl3);

//Zahlen in Zeichen konvertieren
if buffer=1 then Buffer2:='a' else if buffer=2 then Buffer2:='b' else if buffer=3 then Buffer2:='c' else
// usw...
if buffer=73 then Buffer2:='X' else if buffer=74 then Buffer2:='Y' else if buffer=75 then Buffer2:='Z' else
buffer2:='?';

Form2.OriginalText.Text:= Form2.OriginalText.Text + Buffer2;

Zahl1count:= Zahl1count+3;
Zahl2count:= Zahl2count+3;
Zahl3count:= Zahl3count+3;
end;
end;


Der Fehler müsste unter der gestrichelten Linie sein.
Die ersten, schät mal so 30 buchstaben wandelt er auch wieder völlig korrekt um, aber danach kommt eben der Fehler..

mkinzler 22. Aug 2007 22:32

Re: String mit Hilfe einer Schleife zerteilen und auslesen
 
Normalerweise sagt der Compiler, wo genau der Fehler auftritt

cRayZo 22. Aug 2007 22:45

Re: String mit Hilfe einer Schleife zerteilen und auslesen
 
meinst du mit compiler das, was vor dem starten der Anwendung den code checkt?
wenn ja, dann kann ich dir sagen, dass da überhaupt kein Fehler kommt.

erst wenn ich die Zahlen konvertieren will, gibts ein Problem. Die ersten Zahlengruppen konvertiert er brav in buchstaben, aber nach dem 30ten oder so nicht mehr. liegt das vll an einer maximalkapazität von reihen in einer stringlist? ich weiß ja nicht, aber vll könnte es sowas in der art sein?

hier mal als beispiel:

wenn ich diesen string in buchstaben umwandeln will:
Code:
0;207:3|8;108:20|2;1342:67|3;339:16|3;2019:42|0;2397:47|0;1260:84|0;116:29|9;189:36|7;1543:32|6;5802:84|
7;1597:30|1;2177:32|4;1660:24|8;1304:27|4;718:14|8;1772:28|7;5051:97|4;4668:88|
(was nichts anderes heißt als Test Code TEST CODE)

dann tritt schon der fehler auf.

Hawkeye219 22. Aug 2007 22:55

Re: String mit Hilfe einer Schleife zerteilen und auslesen
 
Hallo,

die Fehlerursache ist wahrscheinlich der falsche Endwert deiner Schleife:

Delphi-Quellcode:
// for i2:=1 to trunc(length(x)) do begin
for i2 := 1 to Length(numbers) div 3 do begin
Gruß Hawkeye

grenzgaenger 22. Aug 2007 23:34

Re: String mit Hilfe einer Schleife zerteilen und auslesen
 
wo liegt das Problem?

das hier funktioniert problemlos ..
Delphi-Quellcode:
program Project1;
{$APPTYPE CONSOLE}

uses
  SysUtils;

const
 cs = '0;207:3|8;108:20|2;1342:67|3;339:16|3;2019:42|0;2397:47|'
    + '0;1260:84|0;116:29|9;189:36|7;1543:32|6;5802:84|7;1597:3'
    + '0|1;2177:32|4;1660:24|8;1304:27|4;718:14|8;1772:28|7;505'
    + '1:97|4;4668:88|';

var
 i: integer;
 s: string;
 wert,j: integer;
 dele: set of char = [';',':','|'];
begin
 s := '';
 for I := 1 to length(cs) do
 begin
  if cs[i] in dele then
  begin
   val(s,wert,j);
   if j=0 then
   begin
    s := '';
    writeln('Integer: ', wert);
   end;
  end
  else
  begin
   s := s + cs[i];
  end;
 end;
 readln;
end.
aber wenn wir keinen code von dir haben, können wir nur raten... und meine kristallkugel hab ich leider vergessen ... :-(

cRayZo 23. Aug 2007 08:36

Re: String mit Hilfe einer Schleife zerteilen und auslesen
 
bin grade nichzt zu hause, ich schick euch von mir aus den ganzen code.
soll ich euch auch den Code für die verschlüsselung schicken? das wird dann halt nur nen ziemlich langer post, weil ich das alles mit realtiv wenig befehlen gemacht hab, weil ich noch nicht so skilled in delphi bin.
das von dir Hawkeye219 probier ich mal aus, könnte echt das Problem sein, thx


Nachtrag:
Okay hier jetzt die ganze umkonvertierung von den Zeichen zur Zahl...
Code:
Var
buffer:                string;
Zufall1, ZUfall2:      integer;
i, buffer2:            integer;
CodeVar:               integer;
begin
try CodeVar:= strtoint(Codex.Text); except showmessage('Code ist keine Zahl'); end;
Geheimcodeform.GeheimcodeText.Text:='';

for i:=1 to length(OriginalText.Text) do begin
        buffer:=Originaltext.Text[i];
        Zufall1:=random(10);
        Zufall2:=random(100);

     //Konvertierungstabelle
        if buffer='a' then Buffer2:=1 else if buffer='b' then Buffer2:=2 else if buffer='c' then Buffer2:=3 else
        if buffer='d' then Buffer2:=4 else if buffer='e' then Buffer2:=5 else if buffer='f' then Buffer2:=6 else
        if buffer='g' then Buffer2:=7 else if buffer='h' then Buffer2:=8 else if buffer='i' then Buffer2:=9 else
        if buffer='j' then Buffer2:=10 else if buffer='k' then Buffer2:=11 else if buffer='l' then buffer2:=12 else
        if buffer='m' then Buffer2:=13 else if buffer='n' then Buffer2:=14 else if buffer='o' then buffer2:=15 else
        if buffer='p' then Buffer2:=16 else if buffer='q' then Buffer2:=17 else if buffer='<' then Buffer2:=18 else
        if buffer='r' then Buffer2:=19 else if buffer='s' then Buffer2:=20 else if buffer='t' then Buffer2:=21 else
        if buffer='u' then Buffer2:=22 else if buffer='v' then Buffer2:=23 else if buffer='w' then Buffer2:=24 else
        if buffer='x' then Buffer2:=25 else if buffer='y' then Buffer2:=26 else if buffer='z' then Buffer2:=27 else
        if buffer='!' then Buffer2:=28 else if buffer='"' then Buffer2:=29 else if buffer='§' then Buffer2:=30 else
        if buffer='$' then Buffer2:=31 else if buffer='%' then Buffer2:=32 else if buffer='&' then Buffer2:=33 else
        if buffer='/' then Buffer2:=34 else if buffer='(' then Buffer2:=35 else if buffer=')' then Buffer2:=36 else
        if buffer='=' then Buffer2:=37 else if buffer='?' then Buffer2:=38 else if buffer='*' then Buffer2:=39 else
        if buffer='+' then Buffer2:=40 else if buffer='#' then Buffer2:=41 else if buffer='-' then Buffer2:=42 else
        if buffer='_' then Buffer2:=43 else if buffer=':' then Buffer2:=44 else if buffer='.' then Buffer2:=45 else
        if buffer=',' then Buffer2:=46 else if buffer=';' then Buffer2:=47 else if buffer=' ' then Buffer2:=48 else
        if buffer='A' then Buffer2:=49 else if buffer='B' then Buffer2:=50 else if buffer='C' then Buffer2:=51 else
        if buffer='D' then Buffer2:=52 else if buffer='E' then Buffer2:=53 else if buffer='F' then Buffer2:=54 else
        if buffer='G' then Buffer2:=55 else if buffer='H' then Buffer2:=56 else if buffer='I' then Buffer2:=57 else
        if buffer='J' then Buffer2:=58 else if buffer='K' then Buffer2:=59 else if buffer='L' then buffer2:=60 else
        if buffer='M' then Buffer2:=61 else if buffer='N' then Buffer2:=62 else if buffer='O' then buffer2:=63 else
        if buffer='P' then Buffer2:=64 else if buffer='Q' then Buffer2:=65 else if buffer='>' then Buffer2:=66 else
        if buffer='R' then Buffer2:=67 else if buffer='S' then Buffer2:=68 else if buffer='T' then Buffer2:=69 else
        if buffer='U' then Buffer2:=70 else if buffer='V' then Buffer2:=71 else if buffer='W' then Buffer2:=72 else
        if buffer='X' then Buffer2:=73 else if buffer='Y' then Buffer2:=74 else if buffer='Z' then Buffer2:=75 else
        buffer2:=0;

        Buffer2:=(buffer2 * Zufall2) + Zufall1;
        Geheimcodeform.GeheimcodeText.Text:=Geheimcodeform.GeheimcodeText.Text + inttostr(Zufall1) + ';' + inttostr(buffer2) + ':' + inttostr(Zufall2) + '|';

        end;

end;

und hier dann die Umkonvertierung vom zaahlenstring zurück in Buchstaben:
Code:
procedure TGeheimcodeForm.BitButtonEntschluesselnClick(Sender: TObject);
var
  numbers: TIntegerDynArray;
  i,i2: Integer;
  s: TStrings;
  x, buffer2: string;
  Zahl1, Zahl2, Zahl3: integer;
  Zahl1count, Zahl2count, Zahl3count, buffer: integer;
begin
Form2.OriginalText.Text:='';
  x:=GeheimcodeText.Text;

  ExtractNumbers(x, numbers);
  s := TStringList.Create;
  for i := Low(numbers) to High(numbers) do
    s.Add(IntToStr(numbers[i]));
  showmessage(s.Text);
  s.Free;

    Zahl1count:=0; Zahl2count:=1; Zahl3count:=2;

  for i2:=1 to Length(numbers) do begin
  Zahl1:=numbers[Zahl1count];
  Zahl2:=numbers[Zahl2count];
  Zahl3:=numbers[zahl3count];

  buffer:=trunc((Zahl2 - Zahl1)/ Zahl3);

     //Konvervierungstabelle
        if buffer=1 then Buffer2:='a' else if buffer=2 then Buffer2:='b' else if buffer=3 then Buffer2:='c' else
        if buffer=4 then Buffer2:='d' else if buffer=5 then Buffer2:='e' else if buffer=6 then Buffer2:='f' else
        if buffer=7 then Buffer2:='g' else if buffer=8 then Buffer2:='h' else if buffer=9 then Buffer2:='i' else
        if buffer=10 then Buffer2:='j' else if buffer=11 then Buffer2:='k' else if buffer=12 then buffer2:='l' else
        if buffer=13 then Buffer2:='m' else if buffer=14 then Buffer2:='n' else if buffer=15 then buffer2:='o' else
        if buffer=16 then Buffer2:='p' else if buffer=17 then Buffer2:='q' else if buffer=18 then Buffer2:='<' else
        if buffer=19 then Buffer2:='r' else if buffer=20 then Buffer2:='s' else if buffer=21 then Buffer2:='t' else
        if buffer=22 then Buffer2:='u' else if buffer=23 then Buffer2:='v' else if buffer=24 then Buffer2:='w' else
        if buffer=25 then Buffer2:='x' else if buffer=26 then Buffer2:='y' else if buffer=27 then Buffer2:='z' else
        if buffer=28 then Buffer2:='!' else if buffer=29 then Buffer2:='"' else if buffer=30 then Buffer2:='§' else
        if buffer=31 then Buffer2:='$' else if buffer=32 then Buffer2:='%' else if buffer=33 then Buffer2:='&' else
        if buffer=34 then Buffer2:='/' else if buffer=35 then Buffer2:='(' else if buffer=36 then Buffer2:=')' else
        if buffer=37 then Buffer2:='=' else if buffer=38 then Buffer2:='?' else if buffer=39 then Buffer2:='*' else
        if buffer=40 then Buffer2:='+' else if buffer=41 then Buffer2:='#' else if buffer=42 then Buffer2:='-' else
        if buffer=43 then Buffer2:='_' else if buffer=44 then Buffer2:=':' else if buffer=45 then Buffer2:='.' else
        if buffer=46 then Buffer2:=',' else if buffer=47 then Buffer2:=';' else if buffer=48 then Buffer2:=' ' else
        if buffer=49 then Buffer2:='A' else if buffer=50 then Buffer2:='B' else if buffer=51 then Buffer2:='C' else
        if buffer=52 then Buffer2:='D' else if buffer=53 then Buffer2:='E' else if buffer=54 then Buffer2:='F' else
        if buffer=55 then Buffer2:='G' else if buffer=56 then Buffer2:='H' else if buffer=57 then Buffer2:='I' else
        if buffer=58 then Buffer2:='J' else if buffer=59 then Buffer2:='K' else if buffer=60 then buffer2:='L' else
        if buffer=61 then Buffer2:='M' else if buffer=62 then Buffer2:='N' else if buffer=63 then buffer2:='O' else
        if buffer=64 then Buffer2:='P' else if buffer=65 then Buffer2:='Q' else if buffer=66 then Buffer2:='>' else
        if buffer=67 then Buffer2:='R' else if buffer=68 then Buffer2:='S' else if buffer=69 then Buffer2:='T' else
        if buffer=70 then Buffer2:='U' else if buffer=71 then Buffer2:='V' else if buffer=72 then Buffer2:='W' else
        if buffer=73 then Buffer2:='X' else if buffer=74 then Buffer2:='Y' else if buffer=75 then Buffer2:='Z' else
        buffer2:='?';

 Form2.OriginalText.Text:= Form2.OriginalText.Text + Buffer2;

 Zahl1count:= Zahl1count+3;
 Zahl2count:= Zahl2count+3;
 Zahl3count:= Zahl3count+3;
end;
end;

cRayZo 23. Aug 2007 15:48

Re: String mit Hilfe einer Schleife zerteilen und auslesen
 
wie schon gesagt: das Problem liegt beim Konvertieren vom Zahlencode zurück zu den Buchstaben.

Ach ja, zur Vollständiogkeit halber:

Ich arbeite mit 2 Fenstern, einem Original- und einem Geheimcode-Fenster. Beide Fenster haben (um es auf das wesentliche zu beschränken) ein RIchEdit-Feld und einen BitBttn zur konvertierung.

Ich glaube das Problem liegt in der großen schleife, aber ich bin mir nicht sicher.

@ Hawkeye219: danke wegen dem Tip, habs geändert, war aber dann leider doch nciht der Fehler.

Hawkeye219 23. Aug 2007 18:21

Re: String mit Hilfe einer Schleife zerteilen und auslesen
 
Hallo cRayZo,

du mußt schon genau hinsehen:

Zitat:

Zitat von Hawkeye219
Delphi-Quellcode:
for i2 := 1 to Length(numbers) div 3 do begin

Zitat:

Zitat von cRayZo
Delphi-Quellcode:
for i2 := 1 to Length(numbers) do begin

Bemerkst du den Unterschied?

Zu deiner "Konvertierungstabelle":
Wäre es nicht viell einfacher und übersichtlicher, den Zeichenvorrat in einen String zu packen? Dann kannst du mit der Funktion Delphi-Referenz durchsuchenPos nach einem Zeichen suchen und erhältst dessen Position im String oder den Wert 0, falls das gesuchte Zeichen nicht im String enthalten ist. Beim Entschlüsseln kannst du mit einem gültigen Index [1..Length(Zeichenvorrat)] jedes Zeichen aus dem String direkt auslesen.

Gruß Hawkeye

cRayZo 23. Aug 2007 19:16

Re: String mit Hilfe einer Schleife zerteilen und auslesen
 
oh stimmt, ja hab ich übersehen, danke. Ändert an dem Problem aber auch nichts.. :( :( :(

Das mit der stringlist ist ne super idee. kannst du das vll in einem code zeigen, wie du das meinst? weil ich bin noch zu (blöd?) um das dann gleich richtig umzusetzen^^

thx! schonmal

groß cRayZo

cRayZo 25. Aug 2007 09:24

Re: String mit Hilfe einer Schleife zerteilen und auslesen
 
Okay klappt soweit, aber

Pos

berücksichtigt die groß und kleinschreibung nicht. Wie kann man das ändern? Ist nämlich ausschlaggebend

wenn ichs jetzt so mache, damit er groß und kleinschreibung berücksichtig,
Delphi-Quellcode:
buffer:=trunc((Zahl2 - Zahl1)/ Zahl3);
  Konvert:='abcdefghijklmnopq<rstuvwxyz!"§$%&/()=?*+#-_:.,;ABCDEFGHIJKLMNOPQ>RSTUVWXYZ';

  buffer2:=Konvert[buffer];
kommt zumindest noch immer die ungültige gleitkomma operation obwohl die schleife bedeutend kleiner geworden ist.

Ich habde den Fehler mal im COde abgefangen. Der Fehler müsste hier liegen
Zitat:

procedure TGeheimcodeForm.BitButtonEntschluesselnClick(Sende r: TObject);
var
numbers: TIntegerDynArray;
i,i2: Integer;
s: TStrings;
x, buffer2, Konvert: string;
Zahl1, Zahl2, Zahl3: integer;
Zahl1count, Zahl2count, Zahl3count, buffer: integer;
begin

Form2.OriginalText.Text:='';
x:=GeheimcodeText.Text;

ExtractNumbers(x, numbers);
s := TStringList.Create;


for i := Low(numbers) to High(numbers) do
try
s.Add(IntToStr(numbers[i]));
showmessage(s.Text);
s.Free;


Zahl1count:=0; Zahl2count:=1; Zahl3count:=2;

except begin showmessage('Fehler im ersten Bereich'); break; end; end;

for i2:=1 to Length(numbers) div 3 do begin
Zahl1:=numbers[Zahl1count];
Zahl2:=numbers[Zahl2count];
Zahl3:=numbers[zahl3count];
buffer:=trunc((Zahl2 - Zahl1)/ Zahl3);


buffer:=trunc((Zahl2 - Zahl1)/ Zahl3);
Konvert:='abcdefghijklmnopq<rstuvwxyz!"§$%&/()=?*+#-_:.,;ABCDEFGHIJKLMNOPQ>RSTUVWXYZ';

buffer2:=Konvert[buffer];


Form2.OriginalText.Text:= Form2.OriginalText.Text + Buffer2;

Zahl1count:= Zahl1count+3;
Zahl2count:= Zahl2count+3;
Zahl3count:= Zahl3count+3;
end;
end;

Hawkeye219 25. Aug 2007 10:33

Re: String mit Hilfe einer Schleife zerteilen und auslesen
 
Hallo cRayZo,

keine Sorge, die Funktion Pos beachtet Groß- und Kleinschreibung, auch wenn die Hilfedatei in älteren Delphi-Versionen etwas anderes behauptet.

Den Gleitkommafehler kann ich nicht nachvollziehen. Wie sieht dein aktueller Quelltext aus?

Gruß Hawkeye

cRayZo 25. Aug 2007 10:56

Re: String mit Hilfe einer Schleife zerteilen und auslesen
 
der Quelltext ist noch immer der selbe wie hier wobei der zweite code Probleme bereitet (der erste funktioniert)

ich habe das mit dem pos rückgängig gemacht, weil es mir im mom zu aufwändig ist, exakt jeden buchstaben in der richtigen reihenfolge in einen string zu schreiben, weil vorher buchstaben vertauscht wurden etc. aber diese lange if then else-tabelle kann der Fehler ja nicht sein..
mfg cRayZo

Klaus01 25. Aug 2007 15:56

Re: String mit Hilfe einer Schleife zerteilen und auslesen
 
Zitat:

Zitat von cRayZo
der Quelltext ist noch immer der selbe wie hier wobei der zweite code Probleme bereitet (der erste funktioniert)

ich habe das mit dem pos rückgängig gemacht, weil es mir im mom zu aufwändig ist, exakt jeden buchstaben in der richtigen reihenfolge in einen string zu schreiben, weil vorher buchstaben vertauscht wurden etc. aber diese lange if then else-tabelle kann der Fehler ja nicht sein..
mfg cRayZo

Da Du nicht schreibst welches Problem Dir der zweite Code bereitet eine kleine Vermutung:

Delphi-Quellcode:
buffer:=trunc((Zahl2 - Zahl1)/ Zahl3);
Bis Du dir sicher, dass buffer immer eine eindeutige Zahl zugewiesen bekommt.
Denn es ist nicht sichergestellt, das (Zahl2 - Zah11)/Zahl3 immer ein eindeutiges Ergebnis liefert.
z.B.

105 - 93 = 12 / 4 = 3 -> trunc -> 3
und auch
417 - 365 = 52 / 15 = 3,... -> trunc -> 3

Grüße
Klaus

Hawkeye219 25. Aug 2007 17:39

Re: String mit Hilfe einer Schleife zerteilen und auslesen
 
Hallo cRayZo,

Zitat:

Ich habde den Fehler mal im COde abgefangen.
Es stimmt, du hast einen Fehler abgefangen. Leider ist es einer, den du erst durch die Fehlerbehandlung eingebaut hast. Wenn man den Quelltext etwas umformatiert, wird es deutlich:

Delphi-Quellcode:
for i := Low(numbers) to High(numbers) do
  try
    s.Add(IntToStr(numbers[i])); // Zugriff auf StringListe
    showmessage(s.Text);
    s.Free; // Freigabe der Stringliste
    Zahl1count:=0;
    Zahl2count:=1;
    Zahl3count:=2;
  except
    begin
      showmessage('Fehler im ersten Bereich');
      break;
    end;
  end;
Beim zweiten Durchlauf wird auf eine Stringliste zugegriffen, die im vorangegangenen Durchlauf freigegeben wurde.

Zitat:

ich habe das mit dem pos rückgängig gemacht, weil es mir im mom zu aufwändig ist, exakt jeden buchstaben in der richtigen reihenfolge in einen string zu schreiben, weil vorher buchstaben vertauscht wurden etc.
Hast du vielleicht versehentlich die Korrektur des Schleifenendwertes (Beitrag #17) ebenfalls rückgängig gemacht?

Zitat:

aber diese lange if then else-tabelle kann der Fehler ja nicht sein..
Möglich, aber sie ist unübersichtlich und somit ein ideales Versteck für weitere Fehler. Bei jeder Änderung deiner Codetabelle mußt du zwei dieser Ungetüme synchronisieren. Das wäre mir auf Dauer zuviel Aufwand...

Gruß Hawkeye

marabu 25. Aug 2007 19:39

Re: String mit Hilfe einer Schleife zerteilen und auslesen
 
Hallo cRayZo,

immer wenn ich in diesem Thread das Wort Gleitkommafehler lese, dann frage ich mich, warum du überhaupt mit der Gleitkomma-Division arbeitest, schließlich ist deine ganze Ver- und Entschlüsselung doch ein reiner Ganzzahl-Algorithmus. Hier bekommst du noch eine Funktion Decode(), die den Ansatz von Hawkeye demonstriert. An der Funktion Encode() kannst du dich mal versuchen.

Delphi-Quellcode:
uses
  Types; // TIntegerDynArray

const
  Alphabet
    = 'abcdefghijklmnopq<rstuvwxyz!"§$%&/()=?*+#-'
    + '_:.,; ABCDEFGHIJKLMNOPQ>RSTUVWXYZ'
    ;
  Chiffre
    = '0;207:3|8;108:20|2;1342:67|3;339:16|3;2019:42|0;2397:47|'
    + '0;1260:84|0;116:29|9;189:36|7;1543:32|6;5802:84|7;1597:3'
    + '0|1;2177:32|4;1660:24|8;1304:27|4;718:14|8;1772:28|7;505'
    + '1:97|4;4668:88|'
    ;

{$I Proc.ExtractNumbers.pas}

function Decode(ida: TIntegerDynArray): string;
var
  i, n: Integer;
begin
  SetLength(Result, Length(ida) div 3);
  for i := 1 to Length(Result) do
  begin
    n := Pred(i) * 3;
    Result[i] := Alphabet[(ida[n + 1] - ida[n]) div ida[n + 2]];
  end;
end;

procedure TDemoForm.ButtonClick(Sender: TObject);
var
  ida: TIntegerDynArray;
begin
  ExtractNumbers(Chiffre, ida);
  ShowMessage(Decode(ida));
end;
Freundliche Grüße

cRayZo 26. Aug 2007 21:56

Re: String mit Hilfe einer Schleife zerteilen und auslesen
 
hm also ich hab das Problem gefunden.

danke an Klaus01.

Ja ICH war mir sicher dass immer ein exakter wert heraus kommt, aber mein pc scheinbar nicht. Ich habe den code

buffer:=trunc((Zahl2 - Zahl1)/ Zahl3);

einfach vereinfacht, sodass keine division angewand werden muss.
läuft einwandfrei thx :)


(edit: endlich :lol: )

cRayZo 27. Aug 2007 13:21

Re: String mit Hilfe einer Schleife zerteilen und auslesen
 
Zitat:

Zitat von Hawkeye219
Zu deiner "Konvertierungstabelle":
Wäre es nicht viell einfacher und übersichtlicher, den Zeichenvorrat in einen String zu packen? Dann kannst du mit der Funktion Pos nach einem Zeichen suchen und erhältst dessen Position im String oder den Wert 0, falls das gesuchte Zeichen nicht im String enthalten ist.

Dazu hab ich noch eine Frage. Ich habs (meiner Meinung nach) genauso gemacht, wie in der Hilfe, aber Delphi sagt ich hätte nicht genügend parameter. Versteh ich nicht, weil in der Klammer doch eig. nur 2 strings stehen müssen..

Delphi-Quellcode:
buffer2:=Pos(buffer; konvert);

buffer{buchstabe}, konvert{Text in dem gesucht werden soll}: string;
buffer 2: integer;
<-- was fehlt da?

mfg cRayZo

Klaus01 27. Aug 2007 13:29

Re: String mit Hilfe einer Schleife zerteilen und auslesen
 
Delphi-Quellcode:
buffer2:=Pos(buffer; konvert);
da sollte ein Komma und nicht ein Semikolon stehen.


In etwa so:
Delphi-Quellcode:
buffer2:=Pos(buffer,konvert);
Grüße
Klaus

cRayZo 27. Aug 2007 16:30

Re: String mit Hilfe einer Schleife zerteilen und auslesen
 
:oops:
:P
okay danke, *peinlichguck*


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