Entwickler-Ecke
Sonstiges (Delphi) - Problem mit For-Schleife
Sal-9000 - Do 16.04.09 18:05
Titel: Problem mit For-Schleife
Hi
Kann mir jemand sagen, warum dieser code nicht richtig funktioniert, wenn ich ihn mit einer For-Schleife benutze, aber wenn ich ihn einfach mehrmals hintereinander aufrufe schon:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64:
| Function GetWordOfAnsiString(Text : string; WordPos : Word): string; var p, Sep : PChar;
begin p := PChar(Text); Sep := ' '; repeat Dec(WordPos); while p^ <> Sep do begin if WordPos = 0 then Result := Result + p^; Inc(p); end; if WordPos = 0 then Exit; Inc(p); until p^ = Sep; end;
procedure TMainFrm.TestSpBtnClick(Sender: TObject); var s1, s2: string; APos: Integer;
begin s1 := TestEdt.Text; for Apos := 1 to 3 do begin s2 := Format('%0.3s',[GetWordOfAnsiString(s1, APos)]); Showmessage( 'APosition: ' + #09 + IntToStr(APos) + #10+#13 + 'Value: ' + #09 + #09 + s2 + #10+#13 + 'Length: ' + #09 + IntToStr(Length(s2))); end;
Apos := 1; s2 := Format('%0.3s',[GetWordOfAnsiString(s1, APos)]); Showmessage( 'APosition: ' + #09 + IntToStr(APos) + #10+#13 + 'Value: ' + #09 + #09 + s2 + #10+#13 + 'Length: ' + #09 + IntToStr(Length(s2)));
Apos := 2; s2 := Format('%0.3s',[GetWordOfAnsiString(s1, APos)]); Showmessage( 'APosition: ' + #09 + IntToStr(APos) + #10+#13 + 'Value: ' + #09 + #09 + s2 + #10+#13 + 'Length: ' + #09 + IntToStr(Length(s2)));
Apos := 3; s2 := Format('%0.3s',[GetWordOfAnsiString(s1, APos)]); Showmessage( 'APosition: ' + #09 + IntToStr(APos) + #10+#13 + 'Value: ' + #09 + #09 + s2 + #10+#13 + 'Length: ' + #09 + IntToStr(Length(s2)));
end; |
Wäre für jeden Tipp Dankbar!
Ulixes - Do 16.04.09 18:22
Versuch doch mal schrittweise zu debuggen.
Sal-9000 - Do 16.04.09 18:27
Ulixes hat folgendes geschrieben : |
Versuch doch mal schrittweise zu debuggen. |
Also .... genau dafür hab ich ja den VErsuch unternommen, einfach mehrmals aufzurufen ... das Ergebniss ist folgendes: Die Schleife Zählt zwar brav hoch, die Var "APosition" wird auch übergeben, aber die Antwort is Driss!
Was meinst du mit schrittweise? Eizelanweisung? Hab ich auch schon ... nur ist mir nichts aufgefallen!
uall@ogc - Do 16.04.09 18:40
Ich weiß zwar nicht ob dir posex was sagt aber du solltest result auch mal initalisieren.
Und wenn du selbst durchgehen willst, dann mach das doch direkt im String:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| i := 1; dec(wordnr); while (i < Length(str)) and (wordnr >) 0) do begin if PChar(str[i])^ = ' ' then dec(wordnr);
if wordnr = 0 then Result := result+str[i]; end; |
wobei position und länge merken und dann nen copy wohl um einiges schneller ist
Sal-9000 - Do 16.04.09 18:47
Danke schon mal ... werd ich zuhause mal versuchen ... aber kannst du mir sagen, warum die Func klappt, wenn ich sie einfach 3x aufrufe, aber nicht, wenn ich sie aus der Schleife aufrufe? In letzerem Fall bekomm ich zwar auch drei Messages, aber der Rückgabe-Wert ist eben nur Murks .... das muss doch einen für Anfänger wie mich verständlichen Grund haben ;)
uall@ogc - Do 16.04.09 18:50
Result nicht initalisiert tipp ich jetzt mal
Der Vergleich ist auch murks: wenn du schon
sep: pchar
hast dann muss du das auch mittels
p^ = sep^
vergleichen und vorher noch speicher reservieren
Oder mach nen
var sep: char;
sep := ' ';
raus.
Sal-9000 - Do 16.04.09 19:01
Wärst du evtl so nett und würdest den Code mal so testen, wie er bei mir steht? dann siehst du was ich meine ... wenns es am Result liegen würde, würde die Func doch überhaupt nicht klappen, oder nicht?
Ich muss zugeben, das der GetWord-Code nicht von mir ist ... ich will ihn erstmal versuchsweise benutzen und nach dem "verstehen" dann meinen eigenen nehmen! Ziel war es, Stringabschnitte, die mittels leerzeichen getrennt sind zu überprüfen und das "Wort", das an einer bestimmten Pos ist zurück zu geben ... das ganze eben mit einer For-Schleife ....
ICh muss 16 Zeilen mit je 3 "Worten" überprüfen und stelle fest ... ich bin zu blöde!
Michael Stenzel - Do 16.04.09 21:31
Hallo Sal-9000
Ich habe deinen Code bei mir getestet. Die Funktion
GetWordOfAnsiString gab immer nur beim erstem Aufruf in der Schleife den korekten Wert zurück. Danach wurde in
Result nicht mehr der korekte Wert gespeichert, sondern es stand immer noch der Übergabestring von
Showmessage drin. Danach habe ich die Funktion wie folgt geändert, so läuft es jetzt.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
| Function GetWordOfAnsiString(Text : string; WordPos : Word): string; var p, Sep : PChar; erg : string; begin erg := ''; p := PChar(Text); Sep := ' '; repeat Dec(WordPos); while p^ <> Sep do begin if WordPos = 0 then erg := erg + p^; Inc(p); end; if WordPos = 0 then begin result := erg; Exit; end; Inc(p); until p^ = Sep;
end; |
Warum das so ist, kann ich dir auch nicht beantworten.
Gruß
Michael.
Sal-9000 - Fr 17.04.09 11:46
Hi Michael
Danke für die Mühe! Werd es dann nachher Zuhause direkt mal ausprobieren!
Würde mich ja schon brennend interessieren, wo der Fehler lag, bzw. was ihn ausgelöst hat :D
Ich weiß ... ist jetzt leicht bis mittelschwer offtopic, aber kann mir hier jemand ein gutes Einsteiger(!)-Tut für Pointer empfehlen? Nicht, das ich google nicht kennen würde - ich such nur eben was für Einsteiger ... denn nachdem mich uall@ogc darauf hingewiesen hat, fiel mir auf ... ich hab mich noch nie mit Pointern auseinander gesetzt!
Danke euch nochmal für die Hilfe!
Gruß
SAL-9000
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!