User Tools

Site Tools


aliasing_20strings_20and_20byte_20arrays

Differences

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

Link to this comparison view

aliasing_20strings_20and_20byte_20arrays [2018/03/31 13:19]
127.0.0.1 external edit
aliasing_20strings_20and_20byte_20arrays [2018/04/17 15:00] (current)
tbest3112 Added syntax highlighting
Line 2: Line 2:
  
 //by Richard Russell, March 2014//\\ \\ //BBC BASIC for Windows// provides two data types in which you can store a set of byte (8-bit, or character) values: one is the **string** (for example **A$**) and the other is the **byte array** (for example **A&​()**). Both can contain arbitrary binary data (all possible 8-bit values are allowed) and both are limited in length only by the amount of available heap (this applies to BB4W version 6, in version 5 strings are limited to 65535 bytes).\\ \\  The best choice of data type will often depend on the kind(s) of operation you intend to perform. For example if you want to **search** the data a string is likely to be the better choice, because you can use the **INSTR** function to do that. On the other hand if you want (for example) to **add together** all the data values an array is the better choice, because you can use the **SUM** function.\\ \\  But what do you do if you want to perform, on the same data set, operations that are best suited to strings **and** operations that are best suited to arrays? There is a way, which is to create an array and a string which **alias** each other, that is each accesses the same data in memory! Here is how it can be done, assuming the data is initially stored in the 1-dimensional array **byte&​()**:​\\ ​ //by Richard Russell, March 2014//\\ \\ //BBC BASIC for Windows// provides two data types in which you can store a set of byte (8-bit, or character) values: one is the **string** (for example **A$**) and the other is the **byte array** (for example **A&​()**). Both can contain arbitrary binary data (all possible 8-bit values are allowed) and both are limited in length only by the amount of available heap (this applies to BB4W version 6, in version 5 strings are limited to 65535 bytes).\\ \\  The best choice of data type will often depend on the kind(s) of operation you intend to perform. For example if you want to **search** the data a string is likely to be the better choice, because you can use the **INSTR** function to do that. On the other hand if you want (for example) to **add together** all the data values an array is the better choice, because you can use the **SUM** function.\\ \\  But what do you do if you want to perform, on the same data set, operations that are best suited to strings **and** operations that are best suited to arrays? There is a way, which is to create an array and a string which **alias** each other, that is each accesses the same data in memory! Here is how it can be done, assuming the data is initially stored in the 1-dimensional array **byte&​()**:​\\ ​
 +<code bb4w>
         !^byte$ = ^byte&​(0)         !^byte$ = ^byte&​(0)
         !(^byte$+4) = DIM(byte&​(),​1) + 1         !(^byte$+4) = DIM(byte&​(),​1) + 1
 +</​code>​
 After execution of that code the string **byte$** will alias the array **byte&​()**. As shown the code is appropriate only for version 6 of //BBC BASIC for Windows//; for version 5 the maximum data size is 65535 bytes and the alias string must be created as follows:​\\ ​ After execution of that code the string **byte$** will alias the array **byte&​()**. As shown the code is appropriate only for version 6 of //BBC BASIC for Windows//; for version 5 the maximum data size is 65535 bytes and the alias string must be created as follows:​\\ ​
 +<code bb4w>
         !^byte$ = ^byte&​(0)         !^byte$ = ^byte&​(0)
         ?(^byte$+4) = DIM(byte&​(),​1) + 1         ?(^byte$+4) = DIM(byte&​(),​1) + 1
         ?(^byte$+5) = (DIM(byte&​(),​1) + 1) >> 8         ?(^byte$+5) = (DIM(byte&​(),​1) + 1) >> 8
 +</​code>​
 Note that array indexes are **zero-based** and string indexes are **one-based** so for example **byte&​(3)** will have the same value as **ASC(MID$(byte$,​4))**. If you find that confusing you can ignore the first element in the array and alias the string to the rest as follows (here for BB4W v6):​\\ ​ Note that array indexes are **zero-based** and string indexes are **one-based** so for example **byte&​(3)** will have the same value as **ASC(MID$(byte$,​4))**. If you find that confusing you can ignore the first element in the array and alias the string to the rest as follows (here for BB4W v6):​\\ ​
 +<code bb4w>
         !^byte$ = ^byte&​(0) + 1         !^byte$ = ^byte&​(0) + 1
         !(^byte$+4) = DIM(byte&​(),​1)         !(^byte$+4) = DIM(byte&​(),​1)
 +</​code>​
 Now the array and string indexes will align.\\ \\  Do not attempt to change the **length** of the string; if you do that you will confuse BBC BASIC, and may well crash it. In particular do not empty the string (e.g. **byte$ = ""​**);​ this means that you mustn'​t declare it as a **LOCAL** variable because BB4W will automatically empty it on exit from the function or procedure. However it should be safe to declare it as **PRIVATE**.\\ \\  This is a powerful technique but it should be used with care. Now the array and string indexes will align.\\ \\  Do not attempt to change the **length** of the string; if you do that you will confuse BBC BASIC, and may well crash it. In particular do not empty the string (e.g. **byte$ = ""​**);​ this means that you mustn'​t declare it as a **LOCAL** variable because BB4W will automatically empty it on exit from the function or procedure. However it should be safe to declare it as **PRIVATE**.\\ \\  This is a powerful technique but it should be used with care.
aliasing_20strings_20and_20byte_20arrays.txt ยท Last modified: 2018/04/17 15:00 by tbest3112