![]() |
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; |
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:
|
AW: Delemiter > Char
Zitat:
Delphi-Quellcode:
Variable eine 0 steht. Es könnte dort auch nicht-reservierter Speicher (oder andere zufällige Daten) sein, dann kracht es.
Pattern
Zitat:
|
AW: Delemiter > Char
Zitat:
Danke dir. Nicht so einfach C++ -> Delphi :) gruss |
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:
gruss
MultiByteToWideChar(CP_UTF8, 0, PAnsiChar(buffer), BytesReaded, PWideChar(Buf), BytesReaded);
WideCharToMultiByte(CP_ACP, 0, PWideChar(Buf), -1, PAnsiChar(buffer), BytesReaded, nil, nil); |
AW: Delemiter > Char
Zitat:
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 |
AW: Delemiter > Char
:?: Delphi 2007 war Ansi, alles danach Unicode.
|
AW: Delemiter > Char
Zitat:
Danke. Zitat:
gruss |
AW: Delemiter > Char
Zitat:
|
AW: Delemiter > Char
Zitat:
Zitat:
|
AW: Delemiter > Char
Zitat:
Den Text lade ich über eine URL ein und dieser ist nun mal AnsiChar\AnsiString. gruss |
AW: Delemiter > Char
Zitat:
|
AW: Delemiter > Char
Zitat:
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 |
AW: Delemiter > Char
Gerne
|
AW: Delemiter > Char
Zitat:
gruss |
AW: Delemiter > Char
Du könnste dich auch mal über utf-8 schlau machen (
![]() |
AW: Delemiter > Char
Zitat:
|
AW: Delemiter > Char
PM..
gruss |
AW: Delemiter > Char
Zitat:
ich weiß nicht, ob das einfach ein Typo ist, aber du checkst auf die Nullterminierung mit
Delphi-Quellcode:
Du prüfst so auf das Ansi Zeichen #48, also '0', nicht auf Hex 0.
if str[mi] = '0' then
Checken musst du aber auf
Delphi-Quellcode:
if str[mi] = #0 then
|
AW: Delemiter > Char
Danke aber das war in dem Beitrag schon geklärt. ;)
![]() gruss |
AW: Delemiter > Char
Zitat:
|
AW: Delemiter > Char
Zitat:
Allerdings stelle ich im Moment fest das es kracht wenn ich diesen Titel Parse. Zitat:
gruss |
AW: Delemiter > Char
Zitat:
(sorry, konnte nicht widerstehen... hrhr) |
AW: Delemiter > Char
Zitat:
gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:35 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