Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi PChar Zeichen Index (https://www.delphipraxis.net/168588-pchar-zeichen-index.html)

luke2 29. Mai 2012 20:55

Delphi-Version: XE2

PChar Zeichen Index
 
Hi,

gibt es eine sichere Methode den Zeichenindex eines PChars zu erhalten?

Beispiel:
Delphi-Quellcode:
var
  s:string;
  p:pchar;
begin
  s:='hallo';
  p:=pointer(s);
  writeln(integer(p)); //hier soll 1 für das 1. Zeichen, auf das p zeigt, ausgegeben werden
  inc(p,2);
  writeln(integer(p)); //hier soll 3 für das 3. Zeichen, auf das p zeigt, ausgegeben werden
end;

himitsu 29. Mai 2012 21:01

AW: PChar Zeichen Index
 
Mathematik?

Delphi-Quellcode:
Index := aktuelle_Position - Anfangsposition{Position des ersten Zeichens};

Eventuell auch noch
Delphi-Quellcode:
+ 1
, jenachdem ab wo gezählt werden soll.

Und nicht vergessen:
Unicode ... 1 Zeichen = 2 Byte

luke2 29. Mai 2012 21:15

AW: PChar Zeichen Index
 
Das war mir klar, ich wusste nur nicht genau wie ich an die Anfangsposition komme, aber jetzt hab ich es:
Delphi-Quellcode:
var
  s:string;
  p:pchar;
begin
  s:='hallo';
  p:=pointer(s);
  writeln(p-@pointer(s)^+1); //hier soll 1 für das 1. Zeichen, auf das p zeigt, ausgegeben werden
  inc(p,2);
  writeln(p-@pointer(s)^+1); //hier soll 3 für das 3. Zeichen, auf das p zeigt, ausgegeben werden
end;
Ist das denn sicher, also funktioniert das immer, auch mit Unicode und sehr langen Strings?

himitsu 29. Mai 2012 21:30

AW: PChar Zeichen Index
 
Ähhhhm, ein @ ?
@ und ^ heben sich auf.

Delphi-Quellcode:
writeln(integer(p));
= Position im Speicher

Du hast 2 Pointer und brauchst 2 Integer (besser NativeInt, wegen eventuellem 64 Bit).

Tipp: SizeOf(Char) kann man für eine Division verwenden.

luke2 29. Mai 2012 22:03

AW: PChar Zeichen Index
 
So? Das funktioniert auch ohne Division.
Delphi-Quellcode:
writeln(p-addr(pointer(s)^)+1);

himitsu 29. Mai 2012 23:09

AW: PChar Zeichen Index
 
Delphi-Quellcode:
x := (NativeInt(P) - NativeInt(PChar(s))) div {SizeOf(Char)} SizeOf(s[1]) + 1;


Delphi-Quellcode:
var
  s: string;
  p, p1: PChar;
  i: NativeInt absolute p;
  i1: NativeInt absolute p1;
begin
  s := 'hallo';
  p := PChar(s);
  p1 := p;
  WriteLn('"', p^, '" ', (i - i1) div 2 + 1);
  Inc(p, 2);
  WriteLn('"', p^, '" ', (i - i1) div 2 + 1);
end;
Oder verpack die die Formel einfach in eine Funktion, so ala
Delphi-Quellcode:
function GetCharIndex(C, Str: PChar): Integer;
//oder
function GetCharIndex(C: PChar; Str: String): Integer;
PS:
Zitat:

Delphi-Quellcode:
addr(pointer(s)^)

- mach einen "Pointer" aus dem String (interner Stringzeiger)
- dereferenziere (^) ihn wieder (Pointer rückgängig)
- und mach wieder einen Zeiger/Pointer (addr) daraus

luke2 29. Mai 2012 23:23

AW: PChar Zeichen Index
 
OK, danke für die Hilfe.


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