Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delemiter > Char (https://www.delphipraxis.net/194183-delemiter-char.html)

EWeiss 25. Okt 2017 21:10


Delemiter > Char
 
Ich möchte auf einen Delemiter hin parsen der mehr als 1 Char enthält.

Delphi-Quellcode:
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;
Pattern ist ',"'
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:
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;
}
gruss

Fritzew 25. Okt 2017 21:36

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

EWeiss 25. Okt 2017 21:37

AW: Delemiter > Char
 
Zitat:

Sorry aber das passt nicht zusammen
Deshalb frage ich ja ;)

Zitat:

dein delphi code untersucht pansichar = 1 Byte
Habe ich mir gedacht aber wie kann man es ändern?

Zitat:

Dann beginnt der delphi teil mit einem index von-1 ???
Das ist korrekt wird ja unten um 1 incrementiert.

Zitat:

du weist was ++mi macht (c++)?
Ja inc(mi)

gruss

Fritzew 25. Okt 2017 21:49

AW: Delemiter > Char
 
Na ja auch pwidechar benutzen, un im delpdicode immer 0 anstatt -1 für mi

EWeiss 25. Okt 2017 21:53

AW: Delemiter > Char
 
Zitat:

Zitat von Fritzew (Beitrag 1384164)
Na ja auch pwidechar benutzen, un im delpdicode immer 0 anstatt -1 für mi

sorry aber ich benötige bedingt durch den Text der geliefert wird PAnsiChar nicht PWideChar.
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

Fritzew 25. Okt 2017 22:19

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?

Dalai 25. Okt 2017 22:28

AW: Delemiter > Char
 
Zitat:

Zitat von EWeiss (Beitrag 1384165)
und -1 ist korrekt.

Kann es nicht sein, weil es Pattern[-1] nicht gibt. Das innerhalb der Schleife befindliche
Delphi-Quellcode:
Inc(mi)
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
Code:
int mi = -1;
while(Pattern[++mi]) {
Der erste Schleifendurchlauf ist Pattern[0] - im Gegensatz zu deinem Delphi-Code
Delphi-Quellcode:
mi := -1;
while Pattern[mi] <> Pattern do
, wo es Pattern[-1] ist. Hättest du in deinem C++-Code Pattern[mi++] geschrieben, hätte es dort genausowenig funktioniert.

Grüße
Dalai

EWeiss 25. Okt 2017 22:30

AW: Delemiter > Char
 
Zitat:

Wo zeigt dann -1 hin? Pattern[-1] kann niemals korrekt sein!
str[mi] wenn -1 dann ist das Ergebnis "#0" das ist korrekt.

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:

',"id":19995....
Also ',"' war mein Pattern.

gruss

EWeiss 25. Okt 2017 22:33

AW: Delemiter > Char
 
Zitat:

wo es Pattern[-1] ist. Hättest du in deinem C++-Code Pattern[mi++] geschrieben, hätte es dort genausowenig funktioniert.
c++

Code:
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
Delphi-Quellcode:
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
gruss

Zacherl 25. Okt 2017 22:41

AW: Delemiter > Char
 
Bezüglich des Operators ansich hast du Recht:
  • Delphi-Quellcode:
    ++i
    ist der Pre-increment-Operator, der zuerst inkrementiert, bevor er die Variable verwendet. Wenn
    Delphi-Quellcode:
    i = 0
    , dann steht nach
    Delphi-Quellcode:
    x = ++i
    die Zahl
    Delphi-Quellcode:
    1
    in
    Delphi-Quellcode:
    x
    .
  • Delphi-Quellcode:
    i++
    ist der Post-increment-Operator, der erst inkrementiert, nachdem er die Variable verwendet. Wenn
    Delphi-Quellcode:
    i = 0
    , dann steht nach
    Delphi-Quellcode:
    x = i++
    die Zahl
    Delphi-Quellcode:
    0
    in
    Delphi-Quellcode:
    x
    .
In beiden Fällen ist
Delphi-Quellcode:
i
nach der Ausführung
Delphi-Quellcode:
1
.

Dein Originalcode hat dennoch auf
Delphi-Quellcode:
Pattern[-1]
zugegriffen, was im Zweifelsfalle eine Zugriffsverletzung darstellt.

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 13:32 Uhr.
Seite 1 von 4  1 23     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz