/ Forside / Teknologi / Udvikling / Delphi/Pascal / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Delphi/Pascal
#NavnPoint
oldwiking 603
jrossing 525
rpje 520
EXTERMINA.. 500
gandalf 460
gubi 270
DJ_Puden 250
PARKENSS 230
technet 210
10  jdjespers.. 200
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

Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408847
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste