Autor Beitrag
Sal-9000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: 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:

ausblenden volle Höhe 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!


Zuletzt bearbeitet von Sal-9000 am Do 16.04.09 18:22, insgesamt 1-mal bearbeitet
Ulixes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 63

Win Vista Home Premium
Delphi 2009 Professional, XHTML, CSS, PHP
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: Do 16.04.09 18:27 
user profile iconUlixes hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: 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:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
i := 1;
dec(wordnr);
while (i < Length(str)) and (wordnr >) 0do
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 133


D3 Prof, D7 PE
BeitragVerfasst: 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.

ausblenden 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^; //Result := Result + 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 30



BeitragVerfasst: 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