> -- Pavel писал(а):
> А как просчитать, какой объём пропустит система, если компилятор не ругается?

Большие массивы надо размещать не на стеке, а в динамической памяти, т.е. через NEW. Узнать сколько памяти в компьютере под Windows можно так:
## Код:
```
MODULE UtilsMemoryHost ["Kernel32"];

   IMPORT SYSTEM;

   TYPE
      Boolean* = INTEGER;
      String* = INTEGER; (* address of s[0] *)

      MemoryStatusExDesc* = RECORD [noalign]
         thisStructureLength*, load*: INTEGER;
         totalPhys*, availPhys*, totalPageFile*, availPageFile*, totalVirtual*, availVirtual*, availExtendedVirtual*: LONGINT
      END;

   PROCEDURE GlobalMemoryStatusEx* (VAR r: MemoryStatusExDesc): Boolean;
   PROCEDURE GetDiskFreeSpaceExW* (directoryName: String; OUT freeBytesAvailableToCaller, totalNumberOfBytes, totalNumberOfFreeBytes: LONGINT): Boolean;

END UtilsMemoryHost.
```


## Код:
```
MODULE UtilsMemory;

   IMPORT Log := StdLog, UtilsMemoryHost;
   
   PROCEDURE Do*; (* (!)UtilsMemory.Do *)
      VAR desc: UtilsMemoryHost.MemoryStatusExDesc;
   BEGIN
      desc.thisStructureLength := SIZE(UtilsMemoryHost.MemoryStatusExDesc);
      IF UtilsMemoryHost.GlobalMemoryStatusEx(desc) # 0 THEN
         Log.String("load: "); Log.Int(desc.load); Log.Ln;
         Log.String("totalPhys: "); Log.Int(desc.totalPhys); Log.Ln;
         Log.String("availPhys: "); Log.Int(desc.availPhys); Log.Ln;
         Log.String("totalPageFile: "); Log.Int(desc.totalPageFile); Log.Ln;
         Log.String("availPageFile: "); Log.Int(desc.availPageFile); Log.Ln;
         Log.String("totalVirtual: "); Log.Int(desc.totalVirtual); Log.Ln;
         Log.String("availVirtual: "); Log.Int(desc.availVirtual); Log.Ln;
         Log.String("availExtendedVirtual: "); Log.Int(desc.availExtendedVirtual); Log.Ln
      ELSE
         Log.String("Error...")
      END;
      Log.Ln
   END Do;

END UtilsMemory.
```


availPhys - сколько физической памяти доступно,
availVirtual - сколько доступно виртуальной.