Autor |
Beitrag |
Sal-9000
      
Beiträge: 30
|
Verfasst: Do 16.04.09 18:05
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:
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!
Zuletzt bearbeitet von Sal-9000 am Do 16.04.09 18:22, insgesamt 1-mal bearbeitet
|
|
Ulixes
      
Beiträge: 63
Win Vista Home Premium
Delphi 2009 Professional, XHTML, CSS, PHP
|
Verfasst: Do 16.04.09 18:22
Versuch doch mal schrittweise zu debuggen.
_________________ "Alles ist möglich, Unmögliches dauert nur ein bisschen länger!"
|
|
Sal-9000 
      
Beiträge: 30
|
Verfasst: 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
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: 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
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
Sal-9000 
      
Beiträge: 30
|
Verfasst: 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
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: 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.
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
Sal-9000 
      
Beiträge: 30
|
Verfasst: 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
      
Beiträge: 133
D3 Prof, D7 PE
|
Verfasst: 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 
      
Beiträge: 30
|
Verfasst: 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
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
|
|