|
| 64 bit integer i d3 Fra : Rune Andersen |
Dato : 18-12-00 22:40 |
|
Hejsa
Er der nogen der ved hvordan man kan regne med store integers i d3?
Det skal benyttes til udregning af fil størrelser > 2G, så evt 32bits
unsigned.
mvh
Rune
| |
Nicolai Buch-Anderse~ (19-12-2000)
| Kommentar Fra : Nicolai Buch-Anderse~ |
Dato : 19-12-00 03:24 |
|
Rune Andersen skrev:
> Er der nogen der ved hvordan man kan regne med store integers i d3?
> Det skal benyttes til udregning af fil størrelser > 2G, så evt 32bits
> unsigned.
En sådan datatype findes mig bekendt desvære ikke i Delphi 3.
Fra og med Delphi 2 er en Integer et signed 32 bits heltal. Den
tilsvarende unsigned datatype heder Cardinal, men af uransagelige
årsager er der kun afsat 31 bits til Cardinal i Delphi 2 og 3.
Først i Delphi 4 kom der logik i systemet og Cardinal blev en fuld 32
bits unsigned værdi. 64 bits integers blev også først introduceret i
Delphi 4.
Beklager.
--
Mvh.
Nicolai Buch-Andersen
nicba@mip.sdu.dk
| |
Michael Thomsen (20-12-2000)
| Kommentar Fra : Michael Thomsen |
Dato : 20-12-00 18:37 |
|
Nicolai Buch-Andersen wrote:
> Fra og med Delphi 2 er en Integer et signed 32 bits heltal. Den
> tilsvarende unsigned datatype heder Cardinal, men af uransagelige
> årsager er der kun afsat 31 bits til Cardinal i Delphi 2 og 3.
Det hænger sammen med, at for at udvikle en funktion, der arbejder med
32 bit unsigned heltal skal man faktisk skrive kode, der svarer til,
at man laver rutinerne til 64-bit signed. Det har Borlands folk så
først valgt at gøre på et senere tidspunkt, med Delphi 4.
--
Regards 'n stuff
Michael Thomsen,
URL: http://fly.to/thomsen
| |
Jan (20-12-2000)
| Kommentar Fra : Jan |
Dato : 20-12-00 21:59 |
|
Hej Rune.
"Rune Andersen" <emche@ready.dk> skrev i en meddelelse
news:nvv%5.3341$ad1.102428@news010.worldonline.dk...
> Hejsa
>
> Er der nogen der ved hvordan man kan regne med store integers i d3?
> Det skal benyttes til udregning af fil størrelser > 2G, så evt 32bits
> unsigned.
>
> mvh
> Rune
>
Se om du ikke kan bruge denne, den brugte vi da vi benyttede D3:
procedure LOAD_DFSpaceEX_FNC;
var
Lib : THandle;
begin
if not GDFSpaceEx_Loaded then
begin
GDFSpaceEx_Loaded := True;
Lib := GetModuleHandle ('kernel32');
If Lib <> 0
then GetDiskFreeSpaceEx := GetProcAddress (Lib, 'GetDiskFreeSpaceExA')
else GetDiskFreeSpaceEx := nil;
end;
end;
function _DiskFree (Drive : Char;
var OutDiskSize : LongInt;
var OutFreeSize : LongInt) : Boolean;
var
Root : array[0..4] of Char;
SecperCluster,
BytesPerSector,
FreeClusters,
Clusters : DWord;
{$ifdef ver120}
User, Total, Free : int64;
{$else}
User, Total, Free : TLargeInteger;
{$endif}
ReadOk : Boolean;
begin
try
ReadOk := False;
Root[0] := UpCase(Drive);
Root[1] := ':';
Root[2] := '\';
Root[3] := #0;
LOAD_DFSpaceEX_FNC;
case (@GetDiskFreeSpaceEx <> nil) of
True : if GetDiskFreeSpaceEx (Root, @User, @Total, @Free) then
begin
{ T1 := Trunc (User.QuadPart / 512); User-size }
{$ifdef ver120}
OutDiskSize := Trunc(Total / 1024);//{orginal}(Trunc
(Total.QuadPart / 512));
OutFreeSize := Trunc(Free / 1024);//{orginal}(Trunc
(Free.QuadPart / 512));
{$else}
OutDiskSize := (Trunc (Total.QuadPart /
1024));//{orginal}(Trunc (Total.QuadPart / 512));
OutFreeSize := (Trunc (Free.QuadPart /
1024));//{orginal}(Trunc (Free.QuadPart / 512));
{$endif}
ReadOk := True;
end;
False : If GetDiskFreeSpace (Root, SecperCluster, BytesPerSector,
FreeClusters, Clusters) then
begin
OutDiskSize := Trunc (1.0 * SecPerCluster * BytesPerSector *
Clusters / 512);
OutFreeSize := Trunc (1.0 * SecPerCluster * BytesPerSector *
FreeClusters / 512);
ReadOk := True;
end;
end;
if not ReadOk then { any errors? result the full longint value }
begin
OutDiskSize := MaxLongInt div 512;
OutFreeSize := MaxLongInt div 512;
end;
_DiskFree := ReadOK;
except
OutDiskSize := MaxLongInt div 512;
OutFreeSize := MaxLongInt div 512;
_DiskFree := False;
end
end;
Mvh. Jan Pedersen
JPSoft DK
| |
Carsten Bager (20-12-2000)
| Kommentar Fra : Carsten Bager |
Dato : 20-12-00 22:41 |
|
Rune Andersen wrote:
>
> Hejsa
>
> Er der nogen der ved hvordan man kan regne med store integers i d3?
> Det skal benyttes til udregning af fil størrelser > 2G, så evt 32bits
> unsigned.
>
> mvh
> Rune
"Comp" er et 63 bits bits heltal + fortegn, som blev introduceret i
TP 4. Jeg har selv brugt typen i D1 og D5.
Typen behandles som en "real" men er i virkeligheden en 64 bit integer.
En måde at få adgang til 32 bit unsigned kunne være:
Type
Word32=array[0..3] of byte;
bit64_typ = packed record
case integer of
1:(c:comp);
2:(Wo:Word32);
3:(Lo,Hi:LongInt);
4:(Lo1,Lo2,Hi1,Hi2:Word);
5:(data:array[0..7] of byte);
6:(pLo,pHi:pointer);
end;
På denne måde kan alle beregninger/udskrivninger gøres med
"comp" typen
Med venlig hilsen
Carsten
| |
|
|