AGB  ·  Datenschutz  ·  Impressum  







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

Int64 und Delphi 3

Ein Thema von Ati · begonnen am 2. Dez 2005 · letzter Beitrag vom 2. Dez 2005
Antwort Antwort
Seite 1 von 2  1 2      
Ati

Registriert seit: 16. Okt 2003
Ort: Gelsenkirchen
406 Beiträge
 
Delphi 3 Professional
 
#1

Int64 und Delphi 3

  Alt 2. Dez 2005, 14:10
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
Ich weiß das ich nichts weiß

Sokrates
  Mit Zitat antworten Zitat
Benutzerbild von Lannes
Lannes

Registriert seit: 30. Jan 2005
Ort: Münster
745 Beiträge
 
Delphi 3 Professional
 
#2

Re: Int64 und Delphi 3

  Alt 2. Dez 2005, 14:44
Hallo,

such mal auf der Seite:
Delphi Files, Directories, Disks, I/O
nach "D3DiskSpaceKludge.ZIP",da wird auch mit Comp gearbeitet.
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#3

Re: Int64 und Delphi 3

  Alt 2. Dez 2005, 14:56
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

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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

Re: Int64 und Delphi 3

  Alt 2. Dez 2005, 15:13
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;
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Benutzerbild von Chegga
Chegga

Registriert seit: 5. Nov 2004
Ort: Kirchheim
453 Beiträge
 
Delphi 7 Architect
 
#5

Re: Int64 und Delphi 3

  Alt 2. Dez 2005, 15:21
Hi,

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
Marc P.
Grüße aus Kirchheim Teck
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#6

Re: Int64 und Delphi 3

  Alt 2. Dez 2005, 15:23
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
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

Re: Int64 und Delphi 3

  Alt 2. Dez 2005, 18:09
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.
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Ati

Registriert seit: 16. Okt 2003
Ort: Gelsenkirchen
406 Beiträge
 
Delphi 3 Professional
 
#8

Re: Int64 und Delphi 3

  Alt 2. Dez 2005, 18:22
@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!!
Ich weiß das ich nichts weiß

Sokrates
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#9

Re: Int64 und Delphi 3

  Alt 2. Dez 2005, 18:48
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

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
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#10

Re: Int64 und Delphi 3

  Alt 2. Dez 2005, 19:11
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;
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 15:43 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