[Back to MEMORY SWAG index]  [Back to Main SWAG index]  [Original]

{
Tel   : 7+(095) 333-9469
E-Mail: vad@glas.apc.org

>I'm wondering if anyone can tell me whether dynamic arrays have the same
>64Kbyte limit per field that static arrays do? If so can ayone suggest away
>to store data in memory that is sure to exceed this limit?

The first way is known to all serious TP programmers.
You could create large fragmental structure by control block.
Example:
}

Type
    Large =  Array [1 .. 65520] of Byte;
    PLarge = ^Large;
    Huge = Array [1 .. 16380] of Pointer; { control block }
    PHuge = ^Huge;
Var
   Hg : PHuge;
   MaxRow , MaxCol , r , c : Word;

begin
     Repeat ReadLn(MaxRow , MaxCol)
     Until (MaxCol > 0) and (MaxCol <= 65520) and
                              (MaxRow > 0) and (MaxRow <= 16380);
     GetMem(Hg , Sizeof(Pointer) * MaxRow);
     For r := 1 to MaxRow do GetMem(Hg^[r] , MaxCol);
     For r := 1 to MaxRow
     do For c := 1 to MaxCol
        do Hg^[r]^[c] := Random(255);
end.

{
This method creating huge structures is using Borland in object named
TColection.
This method has two defects.
 * You must use big control structure consists of pointers.
 * You haven't garant of unfrugmental of this structure.
This method have two advantages.
 * You can use standart pascal procedures & macros for operating with
   this structure (As Move, FillChar ets).
 * You can use standart TP heap menager for creating huge
   structure.

The second way for creating huge structure. It's my own method.
I use DOS memory menager.  I can create realy huge unfragmental
structure. It's more complicated way. I can't use standart TP
procedure & macros for operating with that structure, because
this structure greater than 64Kb. For remove huge structure I
write some procedure, function & inline macros. I used standart TP
heap menager for allocation small control structure and used
DOS memory menager for allocation huge data structure.
Example:
{$M 4096,10000,10000 <- It's very important option. Without
this option Your program should use all DOS memory for his TP
heap. You should write Your realy heap size. Use TpStack from
Turbo profesional for get this value.
}

function dosAlloc (Size : Longint) : Pointer; assembler;
asm 
   mov   ax , word ptr Size 
   mov   dx , word ptr Size[2] 
   add   ax , 000Fh 
   adc   dx , 0 
   mov   bx , 0010h 
   div   bx 
   mov   bx , ax 
   mov  ah , 48h 
   int  21h 
   jC  @@Error 
   mov  dx , ax 
   xor  ax , ax 
   jmp  @@Exit 
@@Error: 
   xor  ax , ax 
   xor  dx , dx 
@@Exit: 
end;
 
function dosFree (Var P) : Boolean; assembler; 
asm 
   les   di , P 
   mov   ax , es:[di] 
   mov   dx , es:[di][2] 
   mov   cl , 4 
   shr   ax , cl 
   add   ax , dx 
   or    ax , ax
   jZ    @@Exit 
   mov   es , ax 
   mov   ah , 49h 
   int   21h 
   jNC   @@Continue 
   mov   ax , False 
   jmp   @@Exit 
@@Continue: 
   xor    ax , ax 
   les    di , P 
   mov    es:[di] , ax 
   mov    es:[di][2] , ax 
   mov    ax , True 
@@Exit:
end; 
 
function dosResize (P : Pointer; NewSize : Longint) : Boolean; assembler; 
asm 
   mov   ax , False 
   mov   bx , word ptr P[2] 
   mov   es , bx 
   or    bx , word ptr P 
   jZ    @@Exit 
   mov   ax , word ptr NewSize 
   mov   dx , word ptr NewSize[2] 
   mov   bx , 16 
   div   bx 
   mov   bx , ax 
   or    dx , dx 
   jZ    @@Margin 
   inc   bx 
@@Margin: 
   mov  ah , 4Ah 
   int  21h 
   jC  @@Error 
   mov  ax , True 
   jmp  @@Exit 
@@Error: 
   mov  ax , False 
@@Exit: 
end; 
 
function dosAvail : Longint; assembler; 
asm 
   mov  bx , 0FFFFh
   mov  ah , 48h 
   int  21h 
   mov  ax , 16 
   mul  bx 
end; 
 
Var 
   Hg : Pointer; 
 
begin 
     Hg := dosAlloc(123456); 
end.         

{
   I don't want send more than 16Kb of my library. Because I don't test
   all procedure & function. But I can give You my idea.
   This way has one defect.
   * You should rewrite all low level memory access (As Move,
      FillChar ets.).
   This way has four advantages.
   * You can use all DOS memory functions: Allocation, Resize,
     Free (It's more powerfull that TP).
   * You recive paragraph align pointer.
   * You get unfragmental memory block.
   * You don't use big control structure.
}

[Back to MEMORY SWAG index]  [Back to Main SWAG index]  [Original]