Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Unterschied? (PChar) (https://www.delphipraxis.net/8967-unterschied-pchar.html)

Pseudemys Nelsoni 16. Sep 2003 02:58


Unterschied? (PChar)
 
hi,

da ich gelesen hab das eine variable vom Typ PChar immer gleich gross ist, frage ich mich was der unterschied zwischen:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  p: PChar;
begin
  p := 'bla';
  ShowMessage(p);
end;
und:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  p: PChar;
begin
  p := StrNew('bla');
  ShowMessage(p);
  StrDispose(p);
end;
bzw was der vorteil an letzterem sein soll?

Meine zweite frage ist, wozu es PChar überhaupt gibt, kann es irgendwas, was mit nem String nicht geht?

Tonic1024 16. Sep 2003 07:20

Re: Unterschied? (PChar)
 
Moin.

Kann man nicht wirklich vergleichen, denke ich.

Ein String ist eine Zeichenkette. Eine Art Array, beginnend mit dem Index 0 und das ende wird markiert durch NULL (nullterminierte Strings).

PChar ist ein Zeiger (Pointer) auf einen Char-Wert.

Kannst ausführlich in der Hilfe nachlesen.

Bis denne...

Motzi 16. Sep 2003 10:55

Re: Unterschied? (PChar)
 
Seit Delphi 2 sind die Strings in Delphi auch nur mehr Zeiger auf die Zeichenkette (-> SizeOf(String) = 4!!). Außerdem hat das erste Zeichen den Index 1 und das letzte Zeichen den Index Length(String)! Der einzige Unterschied ist, dass die Delphi-Strings noch 2 interne Zähler mitführen (Längenzähler und Referenzzähler). Natürlich erleichtert der Compiler die Arbeit mit den Delphi-Strings enorm, da er automatisch alle möglichen nötigen Zwischenschritte komplett transparent vornimmt und man sich so nicht mehr darum kümmern muss. Aber vom Aufbau her sind Delphi-Strings und PChars gar nicht so unähnlich..!

CalganX 16. Sep 2003 11:03

Re: Unterschied? (PChar)
 
Hi,
wie bereits gesagt, ist ein PChar ein Pointer auf ein Character.
Zu bemerken ist, dass ein PChar, immer so groß ist wie die Speicheradresse (wenn ich mich nicht täusche, dann ist das 4 Byte).

Ein Pointer ist also eigentlich ein integer, in dem die Speicheradresse zum eigentlichen Inhalt liegt.

Chris

PS: So habe ich es zumindest gelernt. ;)

Pseudemys Nelsoni 16. Sep 2003 11:04

Re: Unterschied? (PChar)
 
danke für die beschreibung :). kann mir dann noch jemand sagen was der unterschied zwischen meinen 2 beispielen ist?

Motzi 16. Sep 2003 13:47

Re: Unterschied? (PChar)
 
@Chakotay: korrekt.. Windows kann 4GB Speicher adressieren (2^32 Bytes), um also denn gesamten Speicher adressieren zu können braucht man einen Zeiger mit 32Bit "Bandbreite". Und 32Bit sind eben 4 Bytes...

@silent: der Unterschied...
Dank der erweiterten String-Syntax reserviert Delphi im ersten Beispiel den Speicher selbst (völlig transparent), wogegen du im 2ten Beispiel diesen Schritt selbst machst. Und nachdem du den Speicher selbst reservierst musst du (was du auch brav getan hast ;)) den Speicher auch selbst wieder freigeben...

jbg 16. Sep 2003 13:56

Re: Unterschied? (PChar)
 
Zitat:

Zitat von Motzi
Dank der erweiterten String-Syntax reserviert Delphi im ersten Beispiel den Speicher selbst (völlig transparent)

Du redest hier von strings. silent hat aber auch im ersten Beispiel einen PChar.

Im ersten Beispiel setzt der Compiler den PChar p auf die Adresse, an der die hard-coded Zeichenkette 'bla' steht. Und diese liegt in einem schreibgeschützten Speicherbereich. Es wird also kein Speicher durch Compiler Magic reserviert.
Folgendes Beispiel verdeutlicht das am besten:
Delphi-Quellcode:
var
  P: PChar;
begin
  P := 'Test';
  P[0] := 'F'; // <-- Schutzverletzung.
end;

Motzi 16. Sep 2003 14:12

Re: Unterschied? (PChar)
 
Ich rede von der "erweiterten String-Syntax", nicht von Strings allgemein. Die erweiterte String-Syntax erleichtert das Arbeiten mit Kombinationen Strings <-> PChars...

Allerdings könntest du damit recht haben, dass kein Speicher reserviert wird.. anscheinend hab ich da was falsch in Erinnerung.. *grübel*

Pseudemys Nelsoni 16. Sep 2003 14:53

Re: Unterschied? (PChar)
 
danke , gut erklärt :)


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