home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1994 #1 / monster.zip / monster / PROG_GEN / EDSV4064.ZIP / EPP-V1_1.ZIP / 2DARRAY_.E next >
Text File  |  1993-06-26  |  4KB  |  134 lines

  1.  
  2. ---  CUT HERE  -------------------------------------------------------------
  3.  
  4. /*========================================================================*/
  5. /*                                                                        */
  6. /* 2D array in E.  It's as easy as this.                                  */
  7. /*                                                                        */
  8. /* User components are:                                                   */
  9. /*   dd_arrayType and the components therein                              */
  10. /*   dd_dim (), create the 2d array                                       */
  11. /*   dd_set (), put a value into an element of the 2d array               */
  12. /*   dd_get (), get a value from an element of the 2d array               */
  13. /*                                                                        */
  14. /* The other components of this module should not be useful.              */
  15. /*                                                                        */
  16. /*========================================================================*/
  17.  
  18.  
  19. RAISE 0 IF CtrlC () = TRUE
  20. /* You should define an error trap for New()=NIL. */
  21.  
  22.  
  23. OBJECT dd_arrayType
  24.   iUBound, jUBound, elSize, elements
  25. ENDOBJECT
  26.  
  27.  
  28. /* These are global to speed up array access. */
  29. DEF dd_ar : PTR TO dd_arrayType,
  30.     dd_charPtr : PTR TO CHAR,
  31.     dd_intPtr : PTR TO INT,
  32.     dd_longPtr : PTR TO LONG,
  33.     dd_elSize
  34.  
  35.  
  36. PROC dd_dim (i, j, elSize)
  37.   IF (elSize <> 1) AND
  38.      (elSize <> 2) AND
  39.      (elSize <> 4) THEN Raise ('Invalid element size.')
  40.   dd_ar := New (SIZEOF dd_arrayType)
  41.   dd_ar.elements := New (i*j*elSize)
  42.   dd_ar.iUBound := i - 1
  43.   dd_ar.jUBound := j - 1
  44.   dd_ar.elSize := elSize
  45. ENDPROC  dd_ar
  46.  
  47.  
  48. PROC checkBounds (i, j)
  49.   /* dd_ar already points to array when this is called. */
  50.   IF (i < 0) OR (i > dd_ar.iUBound) THEN Raise ('"i" subscript out of bounds.')
  51.   IF (j < 0) OR (j > dd_ar.jUBound) THEN Raise ('"j" subscript out of bounds.')
  52. ENDPROC  TRUE
  53.  
  54.  
  55. PROC dd_offset (i, j) RETURN ((i * (dd_ar.jUBound + 1) + j) * dd_elSize)
  56.  
  57.  
  58. PROC dd_set (array, i, j, value)
  59.   dd_ar := array
  60.   checkBounds (i, j)
  61.   dd_elSize := dd_ar.elSize
  62.   SELECT dd_elSize
  63.     CASE 1
  64.       dd_charPtr := dd_ar.elements
  65.       dd_charPtr [dd_offset (i, j)] := value
  66.     CASE 2
  67.       dd_intPtr := dd_ar.elements
  68.       dd_intPtr [dd_offset (i, j)] := value
  69.     CASE 4
  70.       dd_longPtr := dd_ar.elements
  71.       dd_longPtr [dd_offset (i, j)] := value
  72.   ENDSELECT
  73. ENDPROC
  74.  
  75.  
  76. PROC dd_get (array, i, j)
  77.   DEF value
  78.   dd_ar := array
  79.   checkBounds (i, j)
  80.   dd_elSize := dd_ar.elSize
  81.   SELECT dd_elSize
  82.     CASE 1
  83.       dd_charPtr := dd_ar.elements
  84.       value := dd_charPtr [dd_offset (i, j)]
  85.     CASE 2
  86.       dd_intPtr := dd_ar.elements
  87.       value := dd_intPtr [dd_offset (i, j)]
  88.     CASE 3
  89.       dd_longPtr := dd_ar.elements
  90.       value := dd_longPtr [dd_offset (i, j)]
  91.   ENDSELECT
  92. ENDPROC  value
  93.  
  94.  
  95. PROC dd_dispose (array)
  96.   dd_ar := array
  97.   Dispose (dd_ar.elements)
  98.   Dispose (dd_ar)
  99. ENDPROC
  100.  
  101.  
  102. PROC main () HANDLE
  103.   DEF myArray : PTR TO dd_arrayType,  /* Only needs to PTR TO if you want */
  104.                                       /* access to the OBJECT fields.     */
  105.       xDim = 4, yDim = 4,             /* x and y dimensions.              */
  106.       sizeofChar = 1,                 /* Just for readability.            */
  107.       i, j, val = 0                   /* Loop counters.                   */
  108.  
  109.   /* Create the array. */
  110.   myArray := dd_dim (xDim, yDim, sizeofChar)
  111.  
  112.   /* Put stuff in each element. */
  113.   FOR i := 0 TO myArray.iUBound
  114.     FOR j := 0 TO myArray.jUBound
  115.       CtrlC()
  116.       dd_set (myArray, i, j, val++)
  117.     ENDFOR
  118.   ENDFOR
  119.  
  120.   /* Get it back out. */
  121.   FOR i := 0 TO myArray.iUBound
  122.     FOR j := 0 TO myArray.jUBound
  123.       WriteF ('myArray [\d,\d]=\d\n', i, j, dd_get (myArray, i, j))
  124.     ENDFOR
  125.   ENDFOR
  126.  
  127.   /* Cleanup. */
  128.   dd_dispose (myArray)
  129.  
  130. EXCEPT
  131.   IF exception THEN WriteF ('\s\n', exception)
  132.   CleanUp (exception)
  133. ENDPROC
  134.