home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1989 / 03 / tricks / virtuell.pas < prev   
Encoding:
Pascal/Delphi Source File  |  1988-12-13  |  4.1 KB  |  128 lines

  1. (* ------------------------------------------------------ *)
  2. (*                     VIRTUELL.PAS                       *)
  3. (*  das Programm demonstriert die Verwendung des Haupt-   *)
  4. (*  speichers, wenn die 64 kB-Datengrenze überschritten   *)
  5. (*  werden soll. Es wird eine Matrix aus zufälligen       *)
  6. (*  reellen Werten aufgebaut und anschließend die Zeilen- *)
  7. (*  und Spaltensummen dieser Matrix ermittelt.            *)
  8. (*                                                        *)
  9. (*       (c) 1989 Dr. Lothar Wenzel & TOOLBOX             *)
  10. (* ------------------------------------------------------ *)
  11. PROGRAM Virtuell;
  12.  
  13. USES Crt;
  14.  
  15. CONST
  16.   intern    =  6;     { Anzahl Bytes für real-Darstellung }
  17.   paragraph = 16;     { 1 Paragraph := 16 Bytes           }
  18.   dim1      = 90;     { Anzahl Zeilen der Matrix          }
  19.   dim2      = 90;     { Anzahl Spalten der Matrix         }
  20.                       { Benötigt min. 291600 Bytes RAM    }
  21. VAR
  22.   zeile     : ARRAY[1..dim1] OF REAL; { Zeilensummen }
  23.   spalte    : ARRAY[1..dim2] OF REAL; { Spaltensummen }
  24.   Z_Summe   : REAL;
  25.   S_Summe   : REAL;
  26.   zahl      : REAL;
  27.   Memo_Seg  : LONGINT;
  28.   Memo_Ofs  : LONGINT;
  29.   start     : LONGINT;
  30.   i, j      : LONGINT;
  31.   antwort   : CHAR;
  32.  
  33. (* ------------------------------------------------------ *)
  34. (*   Bestimmen des ersten freien Speicherplatzes im RAM   *)
  35. PROCEDURE StartPunkt;
  36.  
  37. BEGIN
  38.   Memo_Seg := Seg(HeapOrg^);
  39.   Memo_Ofs := Ofs(HeapOrg^);
  40.   start := paragraph * Memo_Seg + Memo_Ofs;
  41. END;
  42.  
  43. (* ------------------------------------------------------ *)
  44. (*          Auslesen eines Elements der Matrix            *)
  45. FUNCTION Virt_Read(i1, j1 : LONGINT) : REAL;
  46. VAR adr_seg, adr_ofs  : word;
  47.     index             : INTEGER;
  48.     hilfszahl         : REAL;
  49.     differenz, d1, d2 : LONGINT;
  50.  
  51. BEGIN
  52.   adr_seg := Seg(hilfszahl);
  53.   adr_ofs := Ofs(hilfszahl);
  54.   differenz := intern * ((i1-1) * dim2 + j1 - 1) + start;
  55.   FOR index := 0 TO intern - 1 DO BEGIN
  56.     d1 := differenz MOD paragraph;
  57.     d2 := differenz DIV paragraph;
  58.     Mem[d2:$0000+d1] := Mem[adr_seg:$0000+(adr_ofs+index)];
  59.     differenz := Succ(differenz);
  60.   END;
  61. END;
  62.  
  63. (* ------------------------------------------------------ *)
  64. (*        Speichern eines Elements der Matrix             *)
  65. PROCEDURE Virt_Write(i1, j1 : LONGINT; zahl : REAL);
  66. VAR adr_seg, adr_ofs  : word;
  67.     index             : INTEGER;
  68.     differenz, d1, d2 : LONGINT;
  69.  
  70. BEGIN
  71.   adr_seg := Seg(zahl);
  72.   adr_ofs := Ofs(zahl);
  73.   differenz := intern * ((i1-1) * dim2 + j1 - 1) + start;
  74.   FOR index := 0 TO intern - 1 DO BEGIN
  75.     d1 := differenz MOD paragraph;
  76.     d2 := differenz DIV paragraph;
  77.     Mem[d2:$0000+d1] := Mem[adr_seg:$0000+(adr_ofs+index)];
  78.     differenz := Succ(differenz);
  79.   END;
  80. END;
  81.  
  82.  
  83. (* ------------------------------------------------------ *)
  84. (*   Ausgabe der ermittelten Zeilen- und Spaltensummen    *)
  85. PROCEDURE Auswertung;
  86.  
  87. BEGIN
  88.   FOR i := 1 TO dim1 DO zeile[i] := 0;
  89.   FOR j := 1 TO dim2 DO spalte[j] := 0;
  90.   FOR i := 1 TO dim1 DO BEGIN
  91.     FOR j := 1 TO dim2 DO BEGIN
  92.       zeile[i] := Virt_Read(i, j) + zeile[i];
  93.       spalte[j] := Virt_Read(i, j) + spalte[j];
  94.     END;
  95.   END;
  96.   FOR i := 1 TO dim1 DO BEGIN
  97.     WriteLn('Zeile ',i,' ---> Summe = ',zeile[i]);
  98.     Z_Summe := Z_Summe + zeile[i];
  99.   END;
  100.   WriteLn('Weiter mit <Enter> !');
  101.   antwort := ReadKey;
  102.   FOR j := 1 TO dim2 DO BEGIN
  103.     WriteLn('Spalte ',j,' ---> Summe = ',spalte[j]);
  104.     S_Summe := S_Summe + spalte[j];
  105.   END;
  106.   WriteLn('Summe der Zeilensummen  = ',Z_Summe);
  107.   WriteLn('Summe der Spaltensummen = ',S_Summe);
  108.   WriteLn('Weiter mit <Enter> !');
  109.   antwort := ReadKey;
  110. END;
  111.  
  112. (* ------------------------------------------------------ *)
  113. (*                   Hauptprogramm                        *)
  114. BEGIN
  115.   ClrScr;
  116.   Z_Summe := 0; S_Summe := 0;
  117.   StartPunkt;
  118.   FOR i := 1 TO dim1 DO BEGIN
  119.     FOR j := 1 TO dim2 DO BEGIN
  120.       zahl := Random;
  121.       Virt_Write(i, j, zahl);
  122.     END;
  123.   END;
  124.   Auswertung;
  125. END.
  126. (* ------------------------------------------------------ *)
  127. (*               Ende von VIRTUELL.PAS                    *)
  128.