This shows you the differences between two versions of the page.
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 |