Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Warum ist PChar ^= @String[1]? (https://www.delphipraxis.net/2044-warum-ist-pchar-%5E%3D-%40string%5B1%5D.html)

jbg 6. Jan 2003 18:16

Zitat:

Zitat von Christian Seehase
Delphi-Quellcode:
function GetComputerName(const AsName : string;const ApdwSize : PDWORD) : LongBool; stdcall; external 'kernel32.dll' name 'GetComputerNameA';

Das geht nicht nur bei string=ShortString sondern auch bei string=AnsiString in die Hose. Denn beim ersten Zugriff auf AsName wird automatisch überprüft, ob die Länge nicht überschritten wurde, und ob der string kopiert werden muss, da der Referenzzähler > 1 ist. Um dies durchzuführen, greiften die internen Delphiroutinen auf die 8 Bytes, die vor einem String liegen zu. Bei dieser Deklaration hingegen, gibt es diese nicht.

Christian Seehase 6. Jan 2003 18:28

Moin jbg,

da in diesem Beispiel ja ein Buffer übergeben werden muss, also eine existierende Variable, werden die Felder spätestens beim initialisieren des Buffers angelegt.

jbg 6. Jan 2003 18:31

Den Compiler bringst du aber durch das const ziemlich durcheinander, da er davon ausgehen kann, das AsName in GetComputerName nicht verändert wird/werden kann.

Christian Seehase 6. Jan 2003 18:44

Moin jbg,

Das man sich um die Verwaltung dann selber kümmern muss ist natürlich das Problem dessen, der's so einbindet (würde ich offengestanden auch nicht tun). Auch wenn es soweit funktioniert.

Das mit dem const ist auch nur die Macht der Gewohnheit ;-)
Beim Import von API Funktionen deklariere ich die Parameter immer so.

d3g 6. Jan 2003 18:57

OK, ich hab's kapiert :D, danke.

Eine Frage hätte ich aber noch: Was macht Delphi, wenn ich über 2^32 Zeichen in einen String packe und folglich die der Längenzähler überläuft? Gibt es einen Boundchecking für Strings oder hat Borland das (in der Hoffnung, dass keiner auf diese Idee kommt oder aus Geschwindigkeitsgründen oder warum auch immer) einfach nicht implementiert und ist dann die Länge des Strings die wahre Länge des Strings modulo 2^32? Ich habe gerade keine 2GB Arbeitspeicher, mit denen ich das ausprobieren könnte, zur Hand :mrgreen:.

MfG,
d3g

Chewie 6. Jan 2003 19:52

Soweit ich weiß, ist der Datenbus in 32bit-Rechnern nur 32 Bit breit. Somit kann keine Adresse jenseits 2^32 gewählt werden.
Was ich allerdings nicht versteh: Wieso eigentlich ist die Grenze für einen String 2 GB und nicht 2^32 Byte = 4 GB? Bei Widestrings wäre das ja verständlich, aber warum bei AnsiStrings?

jbg 6. Jan 2003 19:55

Das liegt daran, dass dem Programm nur die unteren 2 GB zur Verfügung stehen, die oberen 2 GB Address Space werden vom Betriebssystem reserviert.

Christian Seehase 6. Jan 2003 20:07

Moin d3g,

mach' doch einfach mal Deine Auslagerungsdatei gross genug 3 bis 4GB zum Beispiel.

Dann brauchst Du keine 2GB RAM um's mal auszuprobieren.

Aber nicht wundern, wenn der Rechner einschläft, und die Festplatte sich nicht mehr beruhigen will ;-)

BTW: Ich denke mal Du wirst schon eine Exception bekommen, wenn Du versuchst einen String mit SetLength auf das Maximum einzustellen.

Von den 4 GB Adressraum, die jeder Prozess hat, reserviert sich normalerweise das OS 2GB für Shared Daten (Memory Mapped Files, DLLs usw.) Der Rest ist dann für Dein Programm samt Daten.

Chewie 6. Jan 2003 21:02

Mir fällt gerade noch ein. Wäre ein LongString nicht nullterminiert, würde folgender Code nicht wie gewollt funktionieren:
Delphi-Quellcode:
while s[i] <> #0 do
begin
  DoSomething;
  Inc(i);
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:42 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz