Delphi-PRAXiS

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;

EWeiss 25. Okt 2017 22:48

AW: Delemiter > Char
 
Pattern[-1] ist immer '#0' und wird erst nach dem ersten Durchlauf inkrementiert.
Ich verstehe jetzt nicht warum das ein Problem sein sollte.

ok ich habe es geändert.
Nein geht nicht dann stimmt das Ergebnis nicht mehr.

Zitat:

't":12256,"id":19995
gruss

Zacherl 25. Okt 2017 22:56

AW: Delemiter > Char
 
Zitat:

Zitat von EWeiss (Beitrag 1384171)
Pattern[-1] ist immer '#0' und wird erst nach dem ersten Durchlauf inkrementiert.
Ich verstehe jetzt nicht warum das ein Problem sein sollte.

Das ist aber purer Zufall, dass im Speicher vor deiner
Delphi-Quellcode:
Pattern
Variable eine 0 steht. Es könnte dort auch nicht-reservierter Speicher (oder andere zufällige Daten) sein, dann kracht es.

Zitat:

Zitat von EWeiss (Beitrag 1384171)
ok ich habe es geändert.

Nach deiner Änderung funktioniert es nur mit exakt 2-stelligen Pattern. Schau mal in meinen Edit, da habe ich dir die Funktion mal 1 zu 1 übersetzt :)

EWeiss 25. Okt 2017 23:01

AW: Delemiter > Char
 
Zitat:

Schau mal in meinen Edit, da habe ich dir die Funktion mal 1 zu 1 übersetzt
WoW ja das ist es ;) Auch der String passt.
Danke dir.

Nicht so einfach C++ -> Delphi :)

gruss

EWeiss 26. Okt 2017 11:45

AW: Delemiter > Char
 
Ich dachte eigentlich D2010 wäre Unicode ÄÖÜ (Umlaute) werden aber nicht berücksichtigt. Warum?
Ist kein Problem den Codepage zu addieren aber wundern tut mich das schon.

Delphi-Quellcode:
MultiByteToWideChar(CP_UTF8, 0, PAnsiChar(buffer), BytesReaded, PWideChar(Buf), BytesReaded);
WideCharToMultiByte(CP_ACP, 0, PWideChar(Buf), -1, PAnsiChar(buffer), BytesReaded, nil, nil);
gruss

Fritzew 26. Okt 2017 11:54

AW: Delemiter > Char
 
Zitat:

Zitat von EWeiss (Beitrag 1384210)
Ich dachte eigentlich D2010 wäre Unicode ÄÖÜ (Umlaute) werden aber nicht berücksichtigt. Warum?
gruss

D2010 ist Ansi.
Wenn Deine original Daten Unicode sind must Du erst umwandeln in Deine CodePage. (Mit Verlusten Wenn Deine Unicode Strings nicht komplett in der Codepage abgebildet werden können)
Stichwort CharToOem* etc

DeddyH 26. Okt 2017 11:55

AW: Delemiter > Char
 
:?: Delphi 2007 war Ansi, alles danach Unicode.

EWeiss 26. Okt 2017 11:56

AW: Delemiter > Char
 
Zitat:

Zitat von Fritzew (Beitrag 1384211)
Zitat:

Zitat von EWeiss (Beitrag 1384210)
Ich dachte eigentlich D2010 wäre Unicode ÄÖÜ (Umlaute) werden aber nicht berücksichtigt. Warum?
gruss

D2010 ist Ansi.
Wenn Deine original Daten Unicode sind must Du erst umwandeln in Deine CodePage. (Mit Verlusten Wenn Deine Unicode Strings nicht komplett in der Codepage abgebildet werden können)
Stichwort CharToOem* etc

Ahh ok hab mich schon gewundert ;)
Danke.

Zitat:

Delphi 2007 war Ansi, alles danach Unicode.
Nur warum funktionieren die Umlaute dann nur mit CodePage ?

gruss

Fritzew 26. Okt 2017 11:58

AW: Delemiter > Char
 
Zitat:

Zitat von DeddyH (Beitrag 1384212)
:?: Delphi 2007 war Ansi, alles danach Unicode.

Stimmt, Hatte XE im Kopf.... Zu lange her:shock:

freimatz 26. Okt 2017 15:20

AW: Delemiter > Char
 
Zitat:

Zitat von EWeiss (Beitrag 1384210)
Nur warum funktionieren die Umlaute dann nur mit CodePage ?

Darum:
Zitat:

Zitat von EWeiss (Beitrag 1384165)
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.

Mehr dazu in der Doku zu PAnsiChar u.a.

EWeiss 26. Okt 2017 15:23

AW: Delemiter > Char
 
Zitat:

Mehr dazu in der Doku zu PAnsiChar u.a.
OK gut, ändert aber nichts daran das ich PAnsiChar verwenden muss. ;)
Den Text lade ich über eine URL ein und dieser ist nun mal AnsiChar\AnsiString.

gruss

Fritzew 26. Okt 2017 15:34

AW: Delemiter > Char
 
Zitat:

Zitat von EWeiss (Beitrag 1384259)

OK gut, ändert aber nichts daran das ich PAnsiChar verwenden muss. ;)
Den Text lade ich über eine URL ein und dieser ist nun mal AnsiChar\AnsiString.

gruss

Bist Du sicher das da nicht Utf8 ankommt?

EWeiss 26. Okt 2017 15:37

AW: Delemiter > Char
 
Zitat:

Zitat von Fritzew (Beitrag 1384261)
Zitat:

Zitat von EWeiss (Beitrag 1384259)

OK gut, ändert aber nichts daran das ich PAnsiChar verwenden muss. ;)
Den Text lade ich über eine URL ein und dieser ist nun mal AnsiChar\AnsiString.

gruss

Bist Du sicher das da nicht Utf8 ankommt?

Ich kann dir gerne mal den Source schicken..
Hochladen kann ich ihn hier nicht weil ich einen registrierten API_Key verwende der nicht verbreitet werden darf.

Dann kannst du es selber prüfen. ;)

gruss

Fritzew 26. Okt 2017 15:40

AW: Delemiter > Char
 
Gerne

EWeiss 26. Okt 2017 15:44

AW: Delemiter > Char
 
Zitat:

Zitat von Fritzew (Beitrag 1384267)
Gerne

Unterwegs ;)

gruss

freimatz 26. Okt 2017 15:52

AW: Delemiter > Char
 
Du könnste dich auch mal über utf-8 schlau machen (https://de.wikipedia.org/wiki/UTF-8) und selber schauen :wink:

Fritzew 27. Okt 2017 10:23

AW: Delemiter > Char
 
Zitat:

Zitat von EWeiss (Beitrag 1384270)
Zitat:

Zitat von Fritzew (Beitrag 1384267)
Gerne

Unterwegs ;)

gruss

Wohin?

EWeiss 27. Okt 2017 10:43

AW: Delemiter > Char
 
PM..

gruss

bytecook 27. Okt 2017 21:14

AW: Delemiter > Char
 
Zitat:

Zitat von EWeiss (Beitrag 1384326)
PM..

gruss

Hi EWeiss,

ich weiß nicht, ob das einfach ein Typo ist, aber du checkst auf die Nullterminierung mit

Delphi-Quellcode:
  if str[mi] = '0' then
Du prüfst so auf das Ansi Zeichen #48, also '0', nicht auf Hex 0.

Checken musst du aber auf
Delphi-Quellcode:
if str[mi] = #0 then

EWeiss 27. Okt 2017 21:22

AW: Delemiter > Char
 
Danke aber das war in dem Beitrag schon geklärt. ;)
http://www.delphipraxis.net/1384170-post10.html

gruss

bytecook 27. Okt 2017 21:26

AW: Delemiter > Char
 
Zitat:

Zitat von EWeiss (Beitrag 1384379)
Danke aber das war in dem Beitrag schon geklärt. ;)
http://www.delphipraxis.net/1384170-post10.html

gruss

Oh ja, habs zwischenzeitlich auch gesehen. Warum wandelst du die PAnsichars innerhalb der Routine eigentlich nicht in Ansistrings, und suchst den Delimiter mit Search oder Pos?

EWeiss 27. Okt 2017 21:34

AW: Delemiter > Char
 
Zitat:

Zitat von bytecook (Beitrag 1384380)
Zitat:

Zitat von EWeiss (Beitrag 1384379)
Danke aber das war in dem Beitrag schon geklärt. ;)
http://www.delphipraxis.net/1384170-post10.html

gruss

Oh ja, habs zwischenzeitlich auch gesehen. Warum wandelst du die PAnsichars innerhalb der Routine eigentlich nicht in Ansistrings, und suchst den Delimiter mit Search oder Pos?

Das haben wir alles schon privat geregelt (me und Fritzw) also alles nach strings umgelegt.

Allerdings stelle ich im Moment fest das es kracht wenn ich diesen Titel Parse.
Zitat:

Avatar - Aufbruch nach Pandora
Na ja muss schauen woran das liegt.

gruss

bytecook 27. Okt 2017 21:42

AW: Delemiter > Char
 
Zitat:

Allerdings stelle ich im Moment fest das es kracht wenn ich diesen Titel Parse.
Zitat:

Avatar - Aufbruch nach Pandora
Na ja muss schauen woran das liegt.

gruss
Vermutlich an zuviel $ff0000ff in dem Titel :P
(sorry, konnte nicht widerstehen... hrhr)

EWeiss 27. Okt 2017 21:45

AW: Delemiter > Char
 
Zitat:

Zitat von bytecook (Beitrag 1384382)
Zitat:

Allerdings stelle ich im Moment fest das es kracht wenn ich diesen Titel Parse.
Zitat:

Avatar - Aufbruch nach Pandora
Na ja muss schauen woran das liegt.

gruss
Vermutlich an zuviel $ff0000ff in dem Titel :P
(sorry, konnte nicht widerstehen... hrhr)

nö.. Wenn überhaupt dann an dem hohen Rating. 5 Sterne sind noch zu wenig.

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:15 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