Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Int64 und Delphi 3 (https://www.delphipraxis.net/58177-int64-und-delphi-3-a.html)

Ati 2. Dez 2005 13:10


Int64 und Delphi 3
 
Mahlzeit,

ich sitze gerade an einem Progamm, welches unter anderem die Festplattengröße auslesen soll. Nun gibt es ja die Funktion GetDiskFreeSpaceEx diese arbeitet aber mit INT64 welches es bei Delphi 3 nicht gibt. Ich hatte hier im Forum schon eine Unit von Briggs gefunden, mit der ich aber nichts anfangen kann. Dann gab es das Stichwort "TLargeInteger", nur scheint es hierfür keine Ausgabemöglichkeit zu geben. Dann gibt es noch den Datentyp "Comp", welcher laut Hilfe den gleichen Zahlenraum wie Int64 haben soll nur klappt es auch damit nicht.
Hat einer von Euch eine Idee???

Ati

Lannes 2. Dez 2005 13:44

Re: Int64 und Delphi 3
 
Hallo,

such mal auf der Seite:
Delphi Files, Directories, Disks, I/O
nach "D3DiskSpaceKludge.ZIP",da wird auch mit Comp gearbeitet.

himitsu 2. Dez 2005 13:56

Re: Int64 und Delphi 3
 
Ja, mit Comp kann es nicht funktionieren, da Comp und Int64 den Zahlenwert intern anders abspeichern. (glaub ich jedenfalls ... hab mich noch nicht so mit Comp beschäftigt, da es eh selten verwendet wird)

Und wenn man jetzt versucht die Daten als Int64 zu schreiben, dann kommt natürlich als Comp ausgelesen etwas anderes raus :zwinker:

Ansonsten ... mal sehn ob/womit in D3 ein 64-Bit-Wert verfügbar gemacht werden kann ^^

Zur auswahl stehen fürs Erste mal folgende Werte:
signet 64 bit integer (LargeInt) = Int64 __int64 LargeInt NativeInt
unsignet 64 bit integer (LargeWord) = UInt64 LargeWord NativeUInt

Wobei für die beiden Native-Werte noch keine festen Werte vorliegen ... es kann sein, daß diese in verschiedenen Compiler-Versionen anders gehandhabt werden.
Außerdem werden nicht immer alle Definitionen verfügbar sein.
Wobei die LargeWord-Typen wohl erst nach D4 eingeführt wurden.

Flocke 2. Dez 2005 14:13

Re: Int64 und Delphi 3
 
Die FPU kann immer schon mit 64-Bit-Ints umgehen. Probier mal den folgenden Code (ungetestet):

Delphi-Quellcode:
function LoadInt64(var Value {:int64}): extended;
asm
  db $DF,$28  // fild qword ptr [eax]
end;

Chegga 2. Dez 2005 14:21

Re: Int64 und Delphi 3
 
Hi,

Zitat:

Zitat von Ati
ich sitze gerade an einem Progamm, welches unter anderem die Festplattengröße auslesen soll.

Antwort:
Delphi-Quellcode:
procedure ...(...);
var
  Gesamt: Double;
begin
  Gesamt := DiskSize(3);
  Form1.Caption := Format('Gesamtgröße: %12.0n',[Gesamt]);
end;
Dann noch zur Info:
DiskSize gibt die die Größe in Byte des angegebenen Laufwerks zurück;
0 ist dabei das aktuelle Laufwerk, 1 Laufwerk A, 2 Laufwerk B usw. DiskSize liefert –1, wenn die Laufwerksnummer ungültig ist.


MfG Marc

himitsu 2. Dez 2005 14:23

Re: Int64 und Delphi 3
 
OK, habs gerade mal getestet, Comp scheint intern doch genauso zu arbeiten, wie Int64, also sollte es keine Probleme geben, wenn du statt Int64 das Comp verwendest. (ich glaub die Delphi-OH hat mich etwas verwirrt, was das Comp angeht)

@Flocke: hier geht es nicht um die FPU, sondern darum, ob Delphi solch einen Wert verwalten kann.
Und außerdem, was ist, wenn

Flocke 2. Dez 2005 17:09

Re: Int64 und Delphi 3
 
Zitat:

Zitat von himitsu
@Flocke: hier geht es nicht um die FPU, sondern darum, ob Delphi solch einen Wert verwalten kann.
Und außerdem, was ist, wenn

(Fast) jede Sprache kann einen Typen für INT64 definieren (und somit auch verwalten), z.B. wie's in windows.pas deklariert ist:
Delphi-Quellcode:
  _LARGE_INTEGER = record
    case Integer of
    0: (
      LowPart: DWORD;
      HighPart: Longint);
    1: (
      QuadPart: LONGLONG);
  end;
Wenn die Sprache den Datentyp aber nicht nativ unterstützt, dann kann man halt nicht damit rechnen und mit Format oder IntToStr nicht formatieren. Darum habe ich die kleine Assembler-Routine hingeschrieben, die macht einfach ein "fild qword ..." und konvertiert einen INT64-Wert in einen Fließkommawert, so dass man damit rechnen und ihn ausgeben kann.

Mit comp (was übrigens wirklich einem int64 entspricht) kann man auch nicht rechnen. Dann kann man sich aber die Umwandlungsroutine in Assembler sparen und direkt einem extended zuweisen.

Ati 2. Dez 2005 17:22

Re: Int64 und Delphi 3
 
@Chegga
Das funktioniert nicht mit Festplatten >2GB

@Flocke
Hört sich interessant an. Nur wie arbeite ich jetzt mit Deiner Funktion??
Ein kleines Beispiel wäre nett!!

himitsu 2. Dez 2005 17:48

Re: Int64 und Delphi 3
 
Zitat:

Zitat von Flocke
(Fast) jede Sprache kann einen Typen für INT64 definieren (und somit auch verwalten)

Ich bezog mich auf den Integer typen, welcher halt an die Umgebung angepasst wird :zwinker:

Und das von Flocke ist keine Funktion, dieses ist nur eine Typendefinition.
also:
Delphi-Quellcode:
type
  _LARGE_INTEGER = record
    case Integer of
    0: ( 
      LowPart: DWORD;
      HighPart: Longint);
    1: ( 
      QuadPart: LONGLONG);
  end;
Meine eigene Version davon sieht z.B. so aus ^^
Delphi-Quellcode:
Type
    TLargeIntRec = packed Record Case Byte of
      0: (Org:      LargeInt);
      4: (Bin:      LargeWord);
      5: (Lo:       LongWord; Hi: LongInt);
      6: (Bits:     TLargeWordSet);
      7: (Bytes:    TByteArray8);
      8: (Words:    TWordArray4);
      9: (LongWords: TLongWordArray2);
    End;
Aber das hat mich auf die Idee gebracht ... schau mal nach, ob LONGLONG bei dir definiert ist ... wenn ja, dann hast du ja dein LargeInt/Int64 :angel2:

Flocke 2. Dez 2005 18:11

Re: Int64 und Delphi 3
 
Ich weiß jetzt nicht, wie GetDiskFreeSpaceEx bei dir deklariert ist, aber du solltest in Windows.pas den Typen LARGE_INTEGER haben.
Delphi-Quellcode:
var
  iFreeBytesAvailable, iTotalNumberOfBytes, iTotalNumberOfFreeBytes: LARGE_INTEGER;
  xFreeBytesAvailable, xTotalNumberOfBytes, xTotalNumberOfFreeBytes: Extended;
begin
  GetDiskFreeSpaceEx('C:', @iFreeBytesAvailable, @iTotalNumberOfBytes, @iTotalNumberOfFreeBytes);
  xFreeBytesAvailable := LoadInt64(iFreeBytesAvailable);
  ...
end;
// Nachtrag:

Konvertierung ohne Assembler:

Delphi-Quellcode:
function LoadInt64Soft(var Value: LARGE_INTEGER): Extended;
begin
  Result := 4294967296.0 * Value.HighPart + Value.LowPart;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:11 Uhr.
Seite 1 von 2  1 2      

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