AGB  ·  Datenschutz  ·  Impressum  







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

PChar Zeichen Index

Ein Thema von luke2 · begonnen am 29. Mai 2012 · letzter Beitrag vom 30. Mai 2012
Antwort Antwort
luke2

Registriert seit: 17. Jun 2009
117 Beiträge
 
#1

PChar Zeichen Index

  Alt 29. Mai 2012, 21:55
Delphi-Version: XE2
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;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#2

AW: PChar Zeichen Index

  Alt 29. Mai 2012, 22:01
Mathematik?

Index := aktuelle_Position - Anfangsposition{Position des ersten Zeichens};
Eventuell auch noch + 1 , jenachdem ab wo gezählt werden soll.

Und nicht vergessen:
Unicode ... 1 Zeichen = 2 Byte
$2B or not $2B
  Mit Zitat antworten Zitat
luke2

Registriert seit: 17. Jun 2009
117 Beiträge
 
#3

AW: PChar Zeichen Index

  Alt 29. Mai 2012, 22:15
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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: PChar Zeichen Index

  Alt 29. Mai 2012, 22:30
Ähhhhm, ein @ ?
@ und ^ heben sich auf.

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.
$2B or not $2B

Geändert von himitsu (29. Mai 2012 um 22:35 Uhr)
  Mit Zitat antworten Zitat
luke2

Registriert seit: 17. Jun 2009
117 Beiträge
 
#5

AW: PChar Zeichen Index

  Alt 29. Mai 2012, 23:03
So? Das funktioniert auch ohne Division.
writeln(p-addr(pointer(s)^)+1);
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

AW: PChar Zeichen Index

  Alt 30. Mai 2012, 00:09
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:
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
$2B or not $2B

Geändert von himitsu (30. Mai 2012 um 00:12 Uhr)
  Mit Zitat antworten Zitat
luke2

Registriert seit: 17. Jun 2009
117 Beiträge
 
#7

AW: PChar Zeichen Index

  Alt 30. Mai 2012, 00:23
OK, danke für die Hilfe.
  Mit Zitat antworten Zitat
Antwort Antwort


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:24 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