Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi size of string? (https://www.delphipraxis.net/11960-size-string.html)

SirThornberry 17. Nov 2003 19:45


size of string?
 
ich habe einen record und davon einen Pointertyp
Delphi-Quellcode:
  TDaten = record
    von: String;
    an: String;
  end;
  PDaten = ^TDaten;
jetzt habe ich die befürchtung wenn ich mit new(PDatenvariable) arbeite das es zu einem fehler in der Speicherreservierung kommt da ja String keine feste größe hat wie ein Integer oder lieg ich da falsch?? Wie viel zeischen kann ich dann in "von" bzw "an" schreiben wenn ich den speicher mit "new" angefordert hab?

CalganX 17. Nov 2003 19:55

Re: size of string?
 
Hi,
wenn du die genaue Größe eines Strings angibst, so hat er immer das Maximum. Somit dürfte es - meiner Meinung nach - keine Probleme geben. Ganz sicher bin ich mir aber auch nicht, da ich es jetzt nicht getestet habe.

Chris

Chewie 17. Nov 2003 19:58

Re: size of string?
 
Eine Variable vom Typ "String" ist nur ein Zeiger und dementsprechend 4 Byte groß.

SirThornberry 17. Nov 2003 20:02

Re: size of string?
 
also kann ich dann in den String dann fast unbegrenzt schreiben. Was passiert dann aber wenn ich dispose(Zeigervariable) mache, wird dann der speicher wo der String hinzeigt mit freigegeben?

Chewie 17. Nov 2003 20:06

Re: size of string?
 
Hmm, weiß nicht genau, ob er dann freigegeben wird. Um sicher zu gehen, benutz zum Freigeben Finalize.

HAF4ever 17. Nov 2003 21:19

Re: size of string?
 
beim String kann man doch die Länge angeben.
Delphi-Quellcode:
var s: String[10];
hat zum beispiel die länge 10, also auch 10 Byte
wenn man aber keine Länge angibt ...
ist sie 255 :gruebel: (glaube ich)

Chewie 17. Nov 2003 21:26

Re: size of string?
 
@HAF4ever: So ähnlich... ;-)

Es gibt zwei verschieden Typen Strings: Shortstrings und Hugestrings. Shortstrings können eine Länge zw. 1 und 255 haben, die in eckigen Klammern angegeben wird. Anstatt String[255] kann man auch Shortstring schreiben. Diese Strings sind einfache Array of Chars, an der Stelle 0 wird die Länge gespeichert, anschließend die Zeichen.

Anders sieht das bei Strings aus. Eine Variable vom Typ String stellt einen Zeiger auf eine String-Struktur dar, die so aussieht, dass zunächst ein 4 Byte großer Referenzzähler, gefolgt von einer 4 Byte großen Längenangabe gespeichert wird. Dahintendran stehen die Zeichen, terminiert von einer 0.

Während Shortstrings also problemlos in dyn. Records verwendet werden können, ist die Verwendung von Hugestrings mit Vorsicht zu genießen.

SirThornberry 17. Nov 2003 21:27

Re: size of string?
 
falsch, wenn man keine länger angibt kann man mehr reinschmeißen, weiß allerdings nicht wieviel, hatte bisher noch nie die grenze erreischt selbst wenn ich eine komplette datei eingelesen hab die 10 mb oder so groß war

Chewie 17. Nov 2003 21:31

Re: size of string?
 
Ein String kann bis zu 2^31 - 1 Zeichen speichern, also etwa 2,1 Milliarden (2 Gigabyte). Vorausgesetzt, du hast dazu genug virtuellen Speicher :wink:

himitsu 17. Nov 2003 21:31

Re: size of string?
 
String ist in Delphi als normaler Weise AnsiString. (4 LängenByte's + Daten = 4 Byte bis 2 GB)
OH:
Zitat:

Das reservierte Wort string funktioniert wie ein generischer Typbezeichner:

var S: string;

Hier wird beispielsweise die Variable S für einen String erstellt. Im voreingestellten Status {$H+} interpretiert der Compiler string als AnsiString (wenn auf das reservierte Wort keine Zahl in eckigen Klammern folgt). Bei Verwendung der Direktive {$H–} wird string als ShortString interpretiert.
String[X] = ShortString (1 LängenByte + 1 bis 255 Byte = 2 bis 256 Byte)


Add:
Zitat:

Zitat von Chewie
Ein String kann bis zu 2^31 - 1 Zeichen speichern, also etwa 2,1 Milliarden (2 Gigabyte).

IntegerGrenze = 2^31 - 1 = 2147483647

Da ein String einen Integer (4 Byte) für die Längenangabe verwendet, sind das 2^31 - 1 - 4 = 2^31 - 5 = 2147483643 Bytes = 2 GB - 5 Byte.

Christian Seehase 17. Nov 2003 22:16

Re: size of string?
 
Moin Chewie,

Zitat:

Zitat von Chewie
Eine Variable vom Typ String stellt einen Zeiger auf eine String-Struktur dar, die so aussieht, dass zunächst ein 4 Byte großer Referenzzähler, gefolgt von einer 4 Byte großen Längenangabe gespeichert wird.

Fast ;-)

Der Zeiger zeigt auf das erste Datenbyte, wenn die Länge > 0 ist. Davor, also auf Zeiger-4 beginnt der Längenzähler, auf Zeiger-8 der Referenzzähler.

Delphi-Quellcode:
var
  s : string;

begin
  s := StringOfChar(#32,800);
  ShowMessage(IntToStr(PDWORD(PChar(s)-4)^)+#13#10+IntToStr(PDWORD(PChar(s)-8)^));
end;

himitsu 17. Nov 2003 22:27

Re: size of string?
 
:oops: stimmt den Referenzzähler hab ich ganz vergessen. :duck:

scp 18. Nov 2003 00:58

Re: size of string?
 
Zitat:

Zitat von Christian Seehase
Der Zeiger zeigt auf das erste Datenbyte, wenn die Länge > 0 ist. Davor, also auf Zeiger-4 beginnt der Längenzähler, auf Zeiger-8 der Referenzzähler.

Mit PChar() mag das stimmen, aber versuchst du das selbe mal mit @AStr wirst du feststellen, das das nicht zum selben ergebnis führt wie @AStr[1]

choose 18. Nov 2003 08:03

Re: size of string?
 
Zitat:

Zitat von SirThornberry
Was passiert dann aber wenn ich dispose(Zeigervariable) mache, wird dann der speicher wo der String hinzeigt mit freigegeben?

Diese Aufgabe wird von Dispose übernommen.
Die Prozeduren Initialize und Finalize brauchen nur in den seltenste Fällen verwendet werden. Der Gebrauch von New und Dispose zählt nicht hierzu (wie ein Blick in dessen Implementierung oder die OH verrät ;))

Chewie 18. Nov 2003 13:50

Re: size of string?
 
Finalize wird aber laut OH bei dyn. Arrays benötigt (sofern keine Zuweisung an nil stattfindet). Also wenn das dyn. Array sich in einem dynamisch erzeugten Record befindet.

Christian Seehase 18. Nov 2003 19:11

Re: size of string?
 
Moin scp,

Zitat:

Zitat von scp
Mit PChar() mag das stimmen, aber versuchst du das selbe mal mit @AStr wirst du feststellen, das das nicht zum selben ergebnis führt wie @AStr[1]

Logisch, weil @AStr die Adresse der Variablen angibt, die die Adresses des Strings enthält, wohingegen @AStr[1] das gleiche ergibt wie @AStr^[0] (wenn man es so schreiben könnte), also die Dereferenzierung.


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