![]() |
Delemiter > Char
Ich möchte auf einen Delemiter hin parsen der mehr als 1 Char enthält.
Delphi-Quellcode:
Pattern ist ',"'
function tcsstr(str, Pattern: PAnsiChar): PAnsiChar;
var mi: Integer; begin mi := -1; while Pattern[mi] <> Pattern do begin if str[mi] = '0' then begin result := nil; exit; end; if(str[mi] <> Pattern[mi]) then begin Inc(str, 1); mi := -1; end; inc(mi); end; result := str; end; Der String wird solange um 1 Char(zeichen) gelöscht bis Pattern[mi] = Pattern ist. Nur das tritt nie ein. Wo ist der Denkfehler? In C++ ist das einfach aber in Delphi will es irgendwie nicht.
Code:
gruss
WCHAR* tcsstr(WCHAR* String, WCHAR* Pattern) {
int mi = -1; while(Pattern[++mi]) { if(String[mi] == 0) return 0; if(String[mi] != Pattern[mi]) { String++; mi = -1; } } return String; } |
AW: Delemiter > Char
Das begint schon mit der signatur
dein delphi code untersucht pansichar = 1 byte Der c++ code wchars = 2 byte Dann beginnt der delphi teil mit einem index von-1 ??? Mi muss im delphi teil 0 sein du weist was ++mi macht (c++)? Sorry aber das passt nicht zusammen |
AW: Delemiter > Char
Zitat:
Zitat:
Zitat:
Zitat:
gruss |
AW: Delemiter > Char
Na ja auch pwidechar benutzen, un im delpdicode immer 0 anstatt -1 für mi
|
AW: Delemiter > Char
Zitat:
Sonst habe ich Kauderwelsch. Ich benötige den Text in Klarschrift. und -1 ist korrekt. Weil 0 bei mir gleich NULL(#0) darstellt. OK.. Hat sich erledigt nach abändern einer zeile.
Delphi-Quellcode:
while mi <> 2 do
gruss |
AW: Delemiter > Char
Emil,
Was ist ein pansichar? Ein pointer auf ein array Wo zeigt dann -1 hin? Pattern[-1] kann niemals korrekt sein! Und wenn du pansichar brauchst warum zeigst du dann code der pwchar benutzt? |
AW: Delemiter > Char
Zitat:
Delphi-Quellcode:
hilft da nicht. In C/C++ gibt es nun mal einen Unterschied zwischen ++mi und mi++ (ich denke, das dürfte dir bekannt sein) - deswegen funktioniert dort sowas wie
Inc(mi)
Code:
Der erste Schleifendurchlauf ist Pattern[0] - im Gegensatz zu deinem Delphi-Code
int mi = -1;
while(Pattern[++mi]) {
Delphi-Quellcode:
, wo es Pattern[-1] ist. Hättest du in deinem C++-Code Pattern[mi++] geschrieben, hätte es dort genausowenig funktioniert.
mi := -1;
while Pattern[mi] <> Pattern do Grüße Dalai |
AW: Delemiter > Char
Zitat:
dann wird str[mi] <> Pattern[mi] verglichen beides ist "#0" anschließend wird mi incrementiert also 0 dann ist mein erstes zeichen str[mi] wenn 0 '"' was auch korrekt ist. Ist nun das erste zeichen des Pattern erreicht in dem Fall ',' wird mi hochgezählt auf 1 Ist das zweite zeichen erreicht in dem Fall '"' wird mi hochgezählt auf 2 Danach habe ich exakt den String den ich beim parsen erreichen will. Zitat:
gruss |
AW: Delemiter > Char
Zitat:
Code:
Delphi
als Präfix-Operator:
++i; int x, y; x = 3; y = ++x; // y = 4 und x = 4 als Postfix-Operator: i++; int x, y; x = 3; y = x++; // y = 3 und x = 4
Delphi-Quellcode:
gruss
inc(i); oder i:= i + 1;
var x, y: Integer; x:= 3; inc(x); y:= x; // y = 4 und x = 4 inc(i); oder i:= i + 1; var x, y: Integer; x:= 3; y:= x; inc(x); // y = 3 und x = 4 |
AW: Delemiter > Char
Bezüglich des Operators ansich hast du Recht:
Delphi-Quellcode:
nach der Ausführung
i
Delphi-Quellcode:
.
1
Dein Originalcode hat dennoch auf
Delphi-Quellcode:
zugegriffen, was im Zweifelsfalle eine Zugriffsverletzung darstellt.
Pattern[-1]
1 zu 1 übersetzt sollte die Funktion ca. so aussehen (mit der PWideChar zu PAnsiChar Änderung):
Delphi-Quellcode:
function tcsstr(Str, Pattern: PAnsiChar): PAnsiChar;
var I: Integer; begin Assert(Assigned(Str) and Assigned(Pattern)); I := 0; while (Pattern[I] <> #0) do begin if (Str[I] = #0) then begin Exit(nil); end; if (Str[I] <> Pattern[I]) then begin Inc(Str); I := -1; end; Inc(I); end; Result := Str; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:51 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