AGB  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Zugriff auf String^ (String pointer)

Ein Thema von Pixel · begonnen am 16. Feb 2017 · letzter Beitrag vom 17. Feb 2017
Antwort Antwort
Seite 2 von 2     12
Pixel

Registriert seit: 23. Aug 2016
26 Beiträge
 
#11

AW: Zugriff auf String^ (String pointer)

  Alt 16. Feb 2017, 14:01
Ja ich denke ich hab es jetzt verstanden.

Delphi-Quellcode:
@String = Adresse die Auf String zeigt
String[0] = Länge
String[1] = Erster Char
@String[1] = Adresse von erstem Char

=>

Entweder PChar(@NormalerString[1] + 4); (gefährlich)

oder (einfacher, besser)

@NormalerString[5];

Geändert von Pixel (16. Feb 2017 um 14:04 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
4.622 Beiträge
 
Delphi 2010 Professional
 
#12

AW: Zugriff auf String^ (String pointer)

  Alt 16. Feb 2017, 14:20
Zitat:
@String = Adresse die Auf String zeigt
Ja, wenn dus richtig meinst

String (ohne @) ist schon die Adresse auf den Zeichenkette des Strings.
@String ist die Adresse auf die Adresse auf die Zeichenkette des Strings

Oder anders gesagt: @String (ohne Index auf ein bestimmtes Zeichen) ist zu 99% falsch oder unnötig.
Delphi-Quellcode:
var str: String;
    pstr: PChar;
begin
  // Beides das gleiche
  // Die erste Zeile zeigt aber was intern bei @str[5] quasi passiert.
  // ==> str[5] = PChar(Integer(str) + 4)^ intern
  // ==> str ist schon ein Pointer
  pstr := @(PChar(Integer(str) + 4)^);
  pstr := @str[5];
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Geändert von Neutral General (16. Feb 2017 um 14:28 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
33.469 Beiträge
 
Delphi XE3 Professional
 
#13

AW: Zugriff auf String^ (String pointer)

  Alt 16. Feb 2017, 19:08
Ein String ist mehr als nur Text, gefolgt von einer #0.
Wobei Delphi-Strings die #0 eigentlich nicht brauchen, denn "vor" dem Text (also vor der Stelle des ersten Zeichens, auf die der interne String-Pointer zeigt) liegt noch eine Längenangabe, der Referenzzähler und die CodePage-Informationen.
Und hinter dem letzten Zeichen liegen noch zwei #0-en, als Kompatibilität und um "schnell" in einen PChar casten zu können.

Fazit: Als "String" kann man den Zeiger nicht einfach so verschieben.
Ein Cast von String zu PChar geht immer,
aber andersrum geht's nimmer (hier muß man eine neue String-Variable erzeugen und da rein den PChar-Inhalt kopieren).

Mit einem PChar kann man das problemlos machen (also von einem PChar aus oder Anfangs auch von einem String/AnsiString/UnicodeString oder WideString),
denn dort zeigt der Zeiger wirklich "nur" auf ein Zeichen und dann so lange, bis eine #0 gefunden wird.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (16. Feb 2017 um 19:12 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
5.732 Beiträge
 
Delphi 7 Personal
 
#14

AW: Zugriff auf String^ (String pointer)

  Alt 16. Feb 2017, 22:51
mystring[0] ist nur bei Shortstrings die Länge des Strings. Benutze bitte immer length(mystring) falls Du die Länge benötigst.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
4.622 Beiträge
 
Delphi 2010 Professional
 
#15

AW: Zugriff auf String^ (String pointer)

  Alt 17. Feb 2017, 09:20
mystring[0] ist nur bei Shortstrings die Länge des Strings. Benutze bitte immer length(mystring) falls Du die Länge benötigst.
Stimmt nicht:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var str: String;
begin
  str := 'Hallo Welt!';
  Caption := IntToStr(PInteger(Integer(@str[1])-SizeOf(Integer))^);
end;
Length(mystring) ist natürlich trotzdem zu bevorzugen.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
2.872 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#16

AW: Zugriff auf String^ (String pointer)

  Alt 17. Feb 2017, 09:28
Ohne konkreten Anwendungsfall und Not, würde ich mir heutzutage keine Gedanken mehr um Zeiger machen...speziell bei Strings. Moderne Strings sind mehr als nur simple Bytefolgen, da steckt zu viel dahinter, um es von Hand durchzuhecheln.

O'Neill
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
5.732 Beiträge
 
Delphi 7 Personal
 
#17

AW: Zugriff auf String^ (String pointer)

  Alt 17. Feb 2017, 11:50
mystring[0] ist nur bei Shortstrings die Länge des Strings. Benutze bitte immer length(mystring) falls Du die Länge benötigst.
Stimmt nicht:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var str: String;
begin
  str := 'Hallo Welt!';
  Caption := IntToStr(PInteger(Integer(@str[1])-SizeOf(Integer))^);
end;
Length(mystring) ist natürlich trotzdem zu bevorzugen.
Delphi-Quellcode:
const
  bstb='aaaaaaaaaa';
var
  i: integer;
  mystring: ansistring;

begin
  mystring:='';
  for i:=1 to 30 do
    mystring:=mystring+bstb;
  self.Button1.Caption:=format('%d -- %d',[length(mystring),mystring[0]]);
end;
ergibt:

[Fehler] Unit1.pas(38): Auf Element 0 kann nicht zugegriffen werden - 'Length' oder 'SetLength' verwenden
es ging ja explizit um MyString[0] mit irgendwelcher Pointerartistik kann man ja beinahe alles erreichen

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
33.469 Beiträge
 
Delphi XE3 Professional
 
#18

AW: Zugriff auf String^ (String pointer)

  Alt 17. Feb 2017, 16:18
Ohne konkreten Anwendungsfall und Not, würde ich mir heutzutage keine Gedanken mehr um Zeiger machen...speziell bei Strings. Moderne Strings sind mehr als nur simple Bytefolgen, da steckt zu viel dahinter, um es von Hand durchzuhecheln.
Die interne Definition versteckt sich als Record in der System.pas.
Im Grunde genommen ist String recht einfach, wenn man sich einen Hauch auskennt.
* der Zeiger bei Strings zeigt auf das erste Zeichen und und nicht auf den Recordanfang.
* leere Strings sind NIL (theoretisch könnte man auch den Record mit der Daten-Länge 0 verwenden, aber eigentlich kommt das nie vor)
** drum kann man Strings/dynamische Arrays auch oft "schnell" mit Assigned oder =nil bzw. ='' prüfen, anstatt ein Length(x)=0 nehmen zu müssen
* Die beiden #0#0 am Ende werden da nicht erwähnt, aber sind immer da (wenn niemand einen Buffer-Overflow verbrockt hat)
** #0 für PChar-Ende und #0#0 für C-StringListen (#0 für WertEnde und #0#0 für ListenEnde, also ein '' als letzter Wert)
* Die Referenzzählung hat einen Wert für String-Konstanten (-1), welcher bei Speicheroperationen beachtet werden sollte.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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:

Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:51 Uhr.
Powered by vBulletin® Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2017 by Daniel R. Wolf