AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Warum ist PChar ^= @String[1]?

Ein Thema von d3g · begonnen am 4. Jan 2003 · letzter Beitrag vom 6. Jan 2003
Antwort Antwort
Seite 2 von 2     12   
jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#11
  Alt 6. Jan 2003, 18:16
Zitat von Christian Seehase:
function GetComputerName(const AsName : string;const ApdwSize : PDWORD) : LongBool; stdcall; external 'kernel32.dllname '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.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#12
  Alt 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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#13
  Alt 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.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#14
  Alt 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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von d3g
d3g

Registriert seit: 21. Jun 2002
602 Beiträge
 
#15
  Alt 6. Jan 2003, 18:57
OK, ich hab's kapiert , 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 .

MfG,
d3g
-- Crucifixion?
-- Yes.
-- Good. Out of the door, line on the left, one cross each.
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#16
  Alt 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?
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#17
  Alt 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.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#18
  Alt 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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#19
  Alt 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;
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:05 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