![]() |
Zitat:
|
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. |
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.
|
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. |
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 |
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? |
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.
|
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. |
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. |
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