Nagy tömb

Címkék
Nagy tömb
2005-03-08T01:21:44+01:00
2016-11-26T20:40:18+01:00
2022-08-10T10:20:28+02:00
Villám
Az lenne a kérdésem, hogy PASCAl ban a következő tömböt kellene a változóknál létrehozni: 1000x1000x5 -ös 3D-tömb, de azt irja ki hogy tul nagy, ezen nem lehet segíteni?

Köszi.
Mutasd a teljes hozzászólást!
Meg lehet Pascalban is oldani, de csak védett üzemmódban (a BP7-es tudja) és némi ügyeskedéssel. Egyetlen adattömb max. mérete 64 kB lehet, de pointerekkel az egész rendelkezésre álló heap területet fel lehet fűzni (védett üzemmódban ez 16 MB ha jól emléxem)

type a = array [1..1000,1..5] of valami {max. 13 hosszu} b = array [1..1000] of ^a; var tomb:b; ... for i:=1 to 1000 do new(tomb[i]); ... for i:=1000 downto 1 do dispose(tomb[i]);
az egyes tömbelemeket így éred el:

valami:=tomb[i]^[j,k];

Mutasd a teljes hozzászólást!

  • Nem.
    DOS alatt Pascalban az összes változód össz mérete nem haladhatja meg a 64k-t, ha pedig dinamikusan hozol létre változókat a heap-en, ezek összesen max. 640k-t tehetnek ki. (Kivéve persze valami felső/kiterjesztett memória managerrel.)
    Amit te írtál: 1000x1000x5-ös bájt tömb az kb. 5MB, ami jócskán túllépi ezen korlátokat...
    Mutasd a teljes hozzászólást!
  • Lehet ilyet Pascal-ban csinálni, miért ne lehetne, teljesen szabványos amit akarsz (azaz a szabványok nem tartalmaznak ilyen megkötéseket a tömbök méretére vonatkozóan), csak olyan Pascal környezet kell neked, amivel ezt meg is tudod csinálni. A Turbo Pascal-nak igen erős korlátai vannak ezen a téren.

    Free Pascal-ban simán megy az ilyen, mert DOS-on DPMI (Go32) alatt fut a programod. Csak legyen helyed a cégyökérben a lapozófájlnak... Én ezt anno egy dimenziós tömbbel próbáltam ki, de az a tömb 100 megás volt. És volt akkor a gépemben 16 mega RAM...
    Mutasd a teljes hozzászólást!
  • Meg lehet Pascalban is oldani, de csak védett üzemmódban (a BP7-es tudja) és némi ügyeskedéssel. Egyetlen adattömb max. mérete 64 kB lehet, de pointerekkel az egész rendelkezésre álló heap területet fel lehet fűzni (védett üzemmódban ez 16 MB ha jól emléxem)

    type a = array [1..1000,1..5] of valami {max. 13 hosszu} b = array [1..1000] of ^a; var tomb:b; ... for i:=1 to 1000 do new(tomb[i]); ... for i:=1000 downto 1 do dispose(tomb[i]);
    az egyes tömbelemeket így éred el:

    valami:=tomb[i]^[j,k];

    Mutasd a teljes hozzászólást!
  • Nekem van egy XMS unitom, amivel kihasználhatod a bővített memóriát dos alatt (HIMEM.SYS kell hozzá)
    http://karnokd.uw.hu/Utils/XMS.PAS

    Használata egyszerű
    var Handle: Word; begin XMSInit; AllocXMS((1000*1000*5*SizeOf(BasicType)) div 1024 + 1, Handle); // méret KB-ban MoveDataToXMS(Handle, StartOffset, Addr(Data), Size); MoveDataToRAM(Handle, StartOffset, Addr(Data), Size); FreeXMS(Handle); XMSDone; end;
    Mutasd a teljes hozzászólást!
  • A tömb elemeinek elérésére pedig egy mód:
    // tomb[ 0..999, 0..999, 0..4 ] of Integer; Function GetItem(Handle: Word; Dim1, Dim2, Dim3: Longint): Integer; var Offset: Longint; Result : Integer; begin Offset := (Dim1 * 5000 + Dim2 * 5 + Dim3)*SizeOf(Integer); MoveDataToRAM(Handle, Offset, @Result, SizeOf(Integer)); end; Procedure SetItem(Handle: Word; Dim1, Dim2, Dim3: Longint; Value: Integer); var Offset: Longint; begin Offset := (Dim1 * 5000 + Dim2 * 5 + Dim3)*SizeOf(Integer); MoveDataToXMS(Handle, Offset, @Value, SizeOf(Integer)); end;
    Mutasd a teljes hozzászólást!
  • Ez sem segít azon, hogy egyetlen adattömb max. nagysága 64 kB lehet.
    Mutasd a teljes hozzászólást!
  • Igen, ha egyben szeretnéd látni a tömböt. De szerintem elfogadható kompromisszum, ha mindig csak egy részlete van átemelve a valós memóriába.

    Például lenne

    var Index: Longint; RTomb: Array[0..9,0..999,0..4] of Integer;
    Amibe mindig letöltené a teljes tömb egy részletét az XMS-ből.
    Mutasd a teljes hozzászólást!
  • Nos igen, a megoldások lehetősége számtalan.
    Tárolhatja egy tmp fájlban is, és akkor se XMS, se Protected mode nem kell.
    Mutasd a teljes hozzászólást!
  • Van egy másik módszer: Real Mode Linear Flat Model.

    Az a tapasztalatom, hogy a HIMEM.SYS 386-tól felfelé nem vált át védett módba az adatok másolásához, hanem a szegmens regiszterek címtartományát állítja át 4GB-ra, igy ESI, EDI regiszterek segítségével közvetlenül lehet írni-olvasni a kiterjesztett memóriából, de ehhez assembly kell:
    var Offset: LongInt; Address: Longint begin LockXMS(Handle, Address); Offset := (Dim1 * 5000 + Dim2 * 5 + Dim3)*SizeOf(Integer) + Address; asm db 66h mov di, word ptr [offset] push es mov ax, 0 mov ex, ax db 67h mov ax, word ptr [di] pop es mov result, ax end; end;
    Mutasd a teljes hozzászólást!
  • Az én progimmal is ez lenne a gond?


    unit filec; interface type bmfile = word; bmfilerec = array [word] of record ftext : text; fname : string; fmode : integer; end; function file_open_read (fil : word) : bmfile; function file_open_write (fil : word) : bmfile; procedure file_close (f : bmfile); implementation var f , s : string; bmf : bmfile; function file_open_read (fil:word):bmfile; begin if fil <= '.ZZZ' then begin writeLn ('file_open error: bad filename'); halt; end; bmfilerec[bmfile].fname=fil; {$I-} assign (bmfilerec[bmfile].ftext,fil); reset (bmfilerec[bmfile].ftext); {$I+} if ioresult <> 0 then begin write ('file_open error, I/O error code: '); writeln (ioresult); halt; end; bmfilerec[bmfile].fmode=1; end; function file_read_write (fil:word):bmfile; begin if fil <= '.ZZZ' then begin writeLn ('file_open error: bad filename'); halt; end; bmfilerec[bmfile].fname=fil; {$I-} assign (bmfilerec[bmfile].ftext,fil); append (bmfilerec[bmfile].ftext); {$I+} if ioresult <> 0 then begin write ('file_open error, I/O error code: '); writeln (ioresult); halt; end; bmfilerec[bmfile].fmode=2; end; procedure file_close(f:bmfile) begin close (f.ftext); end; BEGIN writeLn ('FileC unit loaded.'); writeLn ('Filename:'); readLn (f); bmf:=bmfilerec[bmfile](f); readLn (bmf.ftext , s); writeLn ('The file: '); writeLn (s); file_close (bmf); End.

    Azt írja hibának hogy Structure too large, és a rekordot befejező end végére teszi a kurzort.

    Van megoldás vagy inkább máshogy csináljam?
    Mutasd a teljes hozzászólást!
  • vagy hasznalj 32bites pascal forditot, mint a tmt, a freepascal, a virtual pascal vagy a gnu.

    Tom#
    Mutasd a teljes hozzászólást!
  • Lazarust, próbáld meg ahelyett, hogy BP7-tel himem.sys-eznél. 

    Tessék :

    unit Unit1;

    {$mode objfpc}{$H+}

    interface

    uses
    Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs;

    type
    TForm1 = class(TForm)
    private
    { private declarations }
    public
    { public declarations }
    end;

    var
    Form1: TForm1;
    tombodvillam : array[1..1000, 1..1000, 1..5] of longint;

    implementation

    {$R *.lfm}

    end.

    (Hivatalos honlap : http://www.lazarus.freepascal.org/)

    2.6-os verzió a legújabb, van magyar honlap is kezdőknek. Leírással.

    Fut WinXp Win7 Linux alatt.

    Nem kell megijedni a Lazarustól, ugyanis csak 110 kb. mega, de van BP szerű karakteres IDE is.
    Mutasd a teljes hozzászólást!
  • Kösszi ez jó majdnem magam alá rosáltam, hogy valaki himem syssel jön meg assemblivel a szó jó értelmében.
    Bocs de van free paci is nem kell form semmi korlát meg vidi karit is használ 3.0 nál jár kb. 50 ezren fejlesztik ha van kedved nézd meg. TP7 visszafele kompatibilis. Ez utóbbi a srácnak szólt a tömbje miatt.
    Mutasd a teljes hozzászólást!
Címkék
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd