User Tools

Site Tools


re-dimensioning_20arrays

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
re-dimensioning_20arrays [2018/04/17 18:21]
tbest3112 Added syntax highlighting
re-dimensioning_20arrays [2019/04/09 22:08] (current)
richardrussell Added BBCSDL procedures
Line 1: Line 1:
 =====Re-dimensioning arrays===== =====Re-dimensioning arrays=====
  
-//by Richard Russell, May 2014//\\ \\  BBC BASIC does not have a **REDIM** or **REDIM PRESERVE** statement, as found in some other dialects of BASIC (REDIM allows you to increase the dimensions of an existing array - the contents are lost - and REDIM PRESERVE allows you to increase the dimensions of an array without destroying its contents). However it is not difficult to provide an equivalent functionality using user-defined procedures:​\\ ​+//by Richard Russell, May 2014//\\ \\  BBC BASIC does not have a **REDIM** or **REDIM PRESERVE** statement, as found in some other dialects of BASIC (REDIM allows you to increase the dimensions of an existing array - the contents are lost - and REDIM PRESERVE allows you to increase the dimensions of an array without destroying its contents). However it is not difficult to provide an equivalent functionality using user-defined procedures ​(these are for BB4W, for BBCSDL see below):\\ 
 <code bb4w> <code bb4w>
         DEF PROCredim1d(RETURN P%,S%,D%)         DEF PROCredim1d(RETURN P%,S%,D%)
Line 72: Line 72:
         PROCredim1d(array$(),​ ^array$(1)-^array$(0),​ newsize%)         PROCredim1d(array$(),​ ^array$(1)-^array$(0),​ newsize%)
 </​code>​ </​code>​
-\\  ​The most reliable way of determining the element size is to calculate it at run-time, as in the above examples, but for reference here are the appropriate sizes for each type of array:\\ \\ + 
 +Here are equivalent procedures for //BBC BASIC for SDL 2.0//: 
 + 
 +<code bb4w> 
 +      DEF PROCredim1d(RETURN p%%,​S%,​D%) 
 +      LOCAL a%%,N% 
 +      IF ?​p%%<>​1 ERROR 14, "Bad use of array"​ 
 +      N% = 5+S%*(D%+1) 
 +      IF p%%<​LOMEM OR p%%>​HIMEM SYS "​free",​ p%% 
 +      SYS "​malloc",​ N% TO a%% 
 +      IF @platform% AND &40 ELSE a%%=!^a%% 
 +      IF a%%=0 ERROR 11, "DIM space"​ 
 +      SYS "​memset",​ a%%, 0, N% 
 +      ?a%%=1 : a%%!1=D%+1 
 +      p%% = a%% 
 +      ENDPROC 
 + 
 +      DEF PROCredim2d(RETURN p%%,​S%,​D%,​E%) 
 +      LOCAL a%%,N% 
 +      IF ?​p%%<>​2 ERROR 14, "Bad use of array"​ 
 +      N% = 9+S%*(D%+1)*(E%+1) 
 +      IF p%%<​LOMEM OR p%%>​HIMEM SYS "​free",​ p%% 
 +      SYS "​malloc",​ N% TO a%% 
 +      IF @platform% AND &40 ELSE a%%=!^a%% 
 +      IF a%%=0 ERROR 11, "DIM space"​ 
 +      SYS "​memset",​ a%%, 0, N% 
 +      ?a%%=2 : a%%!1=D%+1 : a%%!5=E%+1 
 +      p%% = a%% 
 +      ENDPROC 
 + 
 +      DEF PROCredimpreserve1d(RETURN p%%,​S%,​D%) 
 +      LOCAL a%%,N%,O% 
 +      IF ?​p%%<>​1 ERROR 14, "Bad use of array"​ 
 +      N% = 5+S%*(D%+1) 
 +      O% = 5+S%*p%%!1 
 +      SYS "​malloc",​ N% TO a%% 
 +      IF @platform% AND &40 ELSE a%%=!^a%% 
 +      IF a%%=0 ERROR 11, "DIM space"​ 
 +      IF N%>O% SWAP N%,O% 
 +      SYS "​memmove",​ a%%, p%%, N% 
 +      a%%!1=D%+1 
 +      IF p%%<​LOMEM OR p%%>​HIMEM SYS "​free",​ p%% 
 +      p%% = a%% 
 +      ENDPROC 
 + 
 +      DEF PROCredimpreserve2d(RETURN p%%,​S%,​D%,​E%) 
 +      LOCAL a%%,N%,O% 
 +      IF ?​p%%<>​2 ERROR 14, "Bad use of array"​ 
 +      N% = 9+S%*(D%+1)*(E%+1) 
 +      O% = 9+S%*p%%!1*p%%!5 
 +      SYS "​malloc",​ N% TO a%% 
 +      IF @platform% AND &40 ELSE a%%=!^a%% 
 +      IF a%%=0 ERROR 11, "DIM space"​ 
 +      IF N%>O% SWAP N%,O% 
 +      SYS "​memmove",​ a%%, p%%, N% 
 +      a%%!1=D%+1 : a%%!5=E%+1 
 +      IF p%%<​LOMEM OR p%%>​HIMEM SYS "​free",​ p%% 
 +      p%% = a%% 
 +      ENDPROC 
 +</​code>​ 
 + 
 +The most reliable way of determining the element size is to calculate it at run-time, as in the above examples, but for reference here are the appropriate sizes for each type of array:\\
  
 | **byte** e.g. array&​()\\ | size=**1**\\ | | **byte** e.g. array&​()\\ | size=**1**\\ |
Line 82: Line 143:
 | **64-bit integer** e.g. array%%() \\ | size=**8***\\ | | **64-bit integer** e.g. array%%() \\ | size=**8***\\ |
 | **80-bit float** e.g. array()\\ | size=**10***\\ | | **80-bit float** e.g. array()\\ | size=**10***\\ |
- * BB4W version 6 only+ * BB4W version 6 or BBCSDL 
re-dimensioning_20arrays.1523989283.txt.gz · Last modified: 2018/04/17 18:21 by tbest3112