AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Delemiter > Char

Ein Thema von EWeiss · begonnen am 25. Okt 2017 · letzter Beitrag vom 27. Okt 2017
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    
EWeiss
(Gast)

n/a Beiträge
 
#1

Delemiter > Char

  Alt 25. Okt 2017, 21:10
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] = '0then
    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

Geändert von EWeiss (25. Okt 2017 um 21:36 Uhr)
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Delemiter > Char

  Alt 25. Okt 2017, 21:36
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
Fritz Westermann
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: Delemiter > Char

  Alt 25. Okt 2017, 21:37
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

Geändert von EWeiss (25. Okt 2017 um 21:41 Uhr)
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Delemiter > Char

  Alt 25. Okt 2017, 21:49
Na ja auch pwidechar benutzen, un im delpdicode immer 0 anstatt -1 für mi
Fritz Westermann
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: Delemiter > Char

  Alt 25. Okt 2017, 21:53
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.

while mi <> 2 do

gruss

Geändert von EWeiss (25. Okt 2017 um 22:36 Uhr)
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Delemiter > Char

  Alt 25. Okt 2017, 22:19
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?
Fritz Westermann
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai
Online

Registriert seit: 9. Apr 2006
1.680 Beiträge
 
Delphi 5 Professional
 
#7

AW: Delemiter > Char

  Alt 25. Okt 2017, 22:28
und -1 ist korrekt.
Kann es nicht sein, weil es Pattern[-1] nicht gibt. Das innerhalb der Schleife befindliche 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
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

AW: Delemiter > Char

  Alt 25. Okt 2017, 22:30
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
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#9

AW: Delemiter > Char

  Alt 25. Okt 2017, 22:33
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
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#10

AW: Delemiter > Char

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

Dein Originalcode hat dennoch auf 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;
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl (25. Okt 2017 um 22:54 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:01 Uhr.
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