Arrays are an efficient way to organise and access data. Providing a 4
dimensional capability allows users to store data
for multiple pages, each containing multiple objects with associated text and
image entities.
A typical application would be a multi-page soft key menu system allowing user
editing of key labels and images.
Multiple language support is easier to achieve rather than using pointers to a
list of variables.
Arrays can be handled using a single name to simplify transfer to and from the
host.
In this example a single command sends the array data to the RS2 port with STX,
array length in 4 byte padded 0 Hex,
the contents of the array "PArray" then ETX.
Checksum can be added as required.
The length of the array will have been
pre-defined during creation.
LOAD(RS2, "\\02", %H04%lenArray, %r%PArray, "\\03");
Arrays are defined using an extension to the VAR() command.
Each required dimension is passed as an additional parameter to the command.
VAR(name,init,type,size0); One-dimensional (or single dimension) array
VAR(name,init,type,size0,size1); Two-dimensional array
VAR(name,init,type,size0,size1,size2); Three-dimensional array
VAR(name,init,type,size0,size1,size2,size3); Four-dimensional array
Definitions
Array: A data structure consisting of a collection of elements (values), each
identified by at least one index.
Index: A non-negative integer used to index a value in an array. Indices can
also be called subscripts.
Element: A location in the array data structure which is used to store a value.
Dimension: The dimension of an array is the number of indices needed to select
an element.
Indexing Arrays
Arrays use zero-based indexing, i.e. the first element of the array is
indexed by 0.
For example, we define a 20 element array as:
VAR( A, 0, U8, 20 );
Then the elements of the array are indexed A.0 through to A.19.
Array elements are accessed by separating the indices with a dot.
Single dimension with A.0 through to 4 dimensions with
name.idx0.idx1.idx2.idx3
Future Releases
Arrays currently accept numeric values and individual characters.
The CALC() command currently only accepts single elements from an array,
however it is intended to add the
ability to process a range on elements of an array in the future.
If this is a critical requirement for your project then please email us.
Structures will be achieved using U8 arrays with
the user defining U8,U16,U32, FLT, TXT entities and the TFT will take
care of handling each type according to its format.
Single Dimension Arrays
These are defined as
VAR( name, init, type, size0 );
For example, to create an 8 element array, named A, storing U8 data and initial
values of 0,
VAR( A, 0, U8, 8 );
Accessing the elements of a single dimension array uses just a single subscript.
LOAD( ivar, A.4 );
LOAD( A.x, ivar );
As an addition to this, all elements of the array can be loaded with a single
value.
LOAD( A, 45 );
LOAD( A, ivar );
The whole array can be passed to a serial port, text box, text variable or
another array.
LOAD( rs2, A );
LOAD( tvar, A );
TEXT( txt, A );
LOAD( A1, A );
TEXT( txt, %h02%A );
When the array is passed, the elements are sent A.0 to A.7
The array can be loaded with the contents of a serial buffer.
LOAD( A, as1 );
A series of elements of an array can be loaded.
LOAD( A, 1, 2, 3, \\04, 5, ivar, 7, 8 );
The existing text variables are like a single dimension array of 32 characters
when using style TXT.
Two-Dimensional Arrays
These are defined as
VAR( name, init, type, size0, size1 );
This can be pictured as a table with size0 rows and size1 columns.
For example, to create a 2 (row) by 32 (column) element array, named B, storing
S16 data and initial values of 0,
VAR( B, 0, S16, 2, 32 );
This type of array could be used to store 32 points (x,y) for a graph, row 0
holds x values, row 1 holds y values.
Accessing the elements of a two-dimensional array uses two subscripts.
LOAD( ivar, B.1.12 );
LOAD( B.x.pt, ivar );
As an addition to this, all elements of the array can be loaded with a single
value.
LOAD( B, 45 );
LOAD( B, ivar );
A single row can be loaded with a value by specifying only the first (row)
subscript.
LOAD( B.1, ivar );
The whole array can be passed to a serial port, text box, text variable or
another array.
LOAD( rs2, B );
LOAD( tvar, B );
TEXT( txt, B );
LOAD( B1, B );
TEXT( txt, %h02%B );
When the whole array is passed, the elements are sent a row at a time,
i.e. B.0.0, B.0.1, B.0.2, ..., B.0.31, B.1.0, B.1.1, B.1.2, ..., B.1.31
A single row can be passed by specifying only the first (row) subscript.
LOAD( rs2, B.0 );
When the single row is passed, the elements are sent B.0.0 to B.0.31
The array (or row of) can be loaded with the contents of a serial buffer.
LOAD( B, as1 );
LOAD( B.1, rs2 );
A series of elements of an array can be loaded.
LOAD( B.0, 1, 2, 3, \\04, 5, ivar, 7, 8 );
A graph can automatically be plotted when passed a two-dimensional array in the
format B.2.n, where n is the
number of points and row 0 contains the x-values, row 1 the y-values.
DRAW( graph, B.0, B.1 );
Three-Dimensional Arrays
These are defined as
VAR( name, init, type, size0, size1, size2 );
This could be used to store data for three graphs each containing 50 (x,y)
points.
For example, to create a 3 by 2 by 50 element array, named C, storing U8 data
and initial values of 0,
VAR( C, 0, U8, 3, 2, 50 );
Accessing the elements of a three-dimensional array uses three subscripts.
LOAD( ivar, C.1.1.5 );
LOAD( C.g.x.pt, ivar );
As an addition to this, all elements of the array can be loaded with a single
value.
LOAD( C, 45 );
LOAD( C, ivar );
A single dimension can be loaded with a value by specifying only the first two
subscripts.
LOAD( C.1.0, ivar );
This loads C.1.0.0 to C.1.0.49 with ivar.
Two dimensions can be loaded with a value by specifying only the first
subscript.
LOAD( C.1, ivar );
This loads C.1.0.0 to C.1.1.49 with ivar.
The whole array can be passed to a serial port, text box, text variable or
another array.
LOAD( rs2, C );
LOAD( tvar, C );
TEXT( txt, C );
LOAD( B1, C );
TEXT( txt, %h02%C );
When the whole array is passed, the elements are sent as,
C.0.0.0, C.0.0.1, ..., C.0.0.49, C.0.1.0, ..., C.0.1.49, C.1.0.0, ..., C.1.0.49,
C.1.1.0, ..., C.1.1.49, C.2.0.0, ..., C.2.0.49, C.2.1.0, ..., C.2.1.49
A single dimension can be passed by specifying only the first two subscripts.
LOAD( rs2, C.2.0 );
The elements are sent C.2.0.0 to C.2.0.49
Two dimensions can be passed by specifying only the first subscript.
LOAD( rs2, C.2 );
The elements are sent C.2.0.0 to C.2.0.49 then C.2.1.0 to C.2.1.49
The array (or dimension) can be loaded with the contents of a serial buffer.
LOAD( C, as1 );
LOAD( C.1, rs2 );
LOAD( C.1.1, i2c );
A series of elements of an array can be loaded.
LOAD( C.0.0, 1, 2, 3, \\04, 5, ivar, 7, 8 );
Graphs can automatically be plotted when passed a two-dimensional array in the
format C.g.2.n,
where n is the number of points and row 0 contains the x-values, row 1 the
y-values.
DRAW( graph0, C.0.0, C.0.1 );
DRAW( graph1, C.1.0, C.1.1 );
DRAW( graph2, C.2.0, C.2.1 );
Four-Dimensional Arrays - 47.24
These are defined as
VAR( name, init, type, size0, size1, size2, size3 );
For example, to create a 4 by 3 by 2 by 5 element array, named D, storing U8
data and initial values of 0,
VAR( D, 0, U8, 4, 3, 2, 5 );
This could be used to represent touch panel game with 4-rows by 3-columns of
buttons where each button
has a text string (maximum length 5 characters including terminating character)
for the button when it is 'up' and when is 'down'.
The player has to 'guess' where the "YES!" is.
This can be pictured as
Buttons Up Buttons Down
"1" "2" "3" "no" "no" "no"
"4" "5" "6" "no" "no" "YES!"
"7" "8" "9" "no" "no" "no"
"10" "11" "12" "no" "no" "no"
Accessing the elements of a four-dimensional array uses four subscripts.
LOAD( ivar, D.2.1.1.4 );
LOAD( D.r.c.u.s, ivar );
As an addition to this, all elements of the array can be loaded with a single
value.
LOAD( D, 45 );
LOAD( D, ivar );
A single dimension can be loaded with a value by specifying the first three
subscripts.
LOAD( D.1.0.0, ivar );
This loads D.1.0.0.0 to D.1.0.0.4 with ivar.
Two dimensions can be loaded with a value by specifying the first two
subscripts.
LOAD( D.1.2, ivar );
This loads D.1.2.0.0 to D.1.2.1.4 with ivar.
Three dimensions can be loaded with a value by specifying only the first
subscript.
LOAD( D.1, ivar );
This loads D.1.0.0.0 to D.1.2.1.4 with ivar.
The whole array can be passed to a serial port, text box, text variable or
another array.
LOAD( rs2, D );
LOAD( tvar, D );
TEXT( txt, D );
LOAD( B1, D );
TEXT( txt, %h02%D );
When the whole array is passed, the elements are sent as,
D.0.0.0.0, D.0.0.0.1, ..., D.3.2.1.4
A single dimension can be passed by specifying the first three subscripts.
LOAD( rs2, D.1.2.0 );
TEXT( but1, %r%D.1.2.0 );
The elements are sent D.1.2.0.0 to D.1.2.0.4
Two dimensions can be passed by specifying the first two subscripts.
LOAD( rs2, D.2.1 );
The elements are sent D.2.1.0.0 to D.2.1.1.4
Three dimensions can be passed by specifying the first subscript.
LOAD( rs2, D.2 );
The elements are sent D.2.0.0.0 to D.2.2.1.4
The array (or dimension) can be loaded with the contents of a serial buffer.
LOAD( D, as1 );
LOAD( D.1, rs2 );
LOAD( D.1.1, i2c );
LOAD( D.1.1.1, rs4 );
A series of elements of an array can be loaded.
LOAD( D.0.0.0, 1, 2, 3, \\04, 0 );
Array with Text Usage - v49.00
This temporary solution enables text to be put in arrays using formatting %t%.
An intelligent text handling solution is being developed.
If we have the following variables:
VAR( A, \\ff, U8, 10 );
VAR( u8Var, 63, U8 );
VAR( txtVar1, "123XYZ", TXT );
VAR( txtVar2, "PQ", TXT );
VAR( txtVar3, "ABCDEFGHIJKLMN", TXT );
All examples assumed from initial
declaration of array A
LOAD( A, 4 ); // A =
{ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 } <- fill array
LOAD( A.1, 3 ); // A = { \\ff, 3, \\ff, \\ff, \\ff, \\ff, \\ff,
\\ff, \\ff, \\ff } <- fill single location
LOAD( A, u8Var ); // A = { 63, 63, 63, 63, 63, 63, 63,
63, 63, 63 } <- fill array
LOAD( A.4, u8Var ); // A = { \\ff, \\ff, \\ff, \\ff, 63, \\ff, \\ff, \\ff,
\\ff, \\ff } <- fill single location
LOAD( A, txtVar1 ); // A = { 123, 123, 123, 123, 123, 123, 123,
123, 123, 123 } <- fill whole array with number
LOAD( A.2, txtVar1 ); // A = { \\ff, \\ff, 123, \\ff, \\ff, \\ff, \\ff, \\ff,
\\ff, \\ff } <- single destination specified
LOAD( A.2, txtVar2 ); // A = { \\ff, \\ff, \\00, \\ff, \\ff, \\ff, \\ff, \\ff,
\\ff, \\ff } <- unable to convert to a number so result is zero
LOAD( A.1, %t% txtVar1 ); // A = { \\ff, '1', \\ff, \\ff, \\ff, \\ff, \\ff,
\\ff, \\ff, \\ff } <- single destination specified, no padding applied
LOAD( A, %t% txtVar1, %t% txtVar2 ); // A = { '1', '2', '3', 'X', 'Y',
'Z', 'P', 'Q', \\00, \\00 } <- concatenation with zero padding
LOAD( A, %t% txtVar1 ); // A = {'1','2','3','X','Y','Z',\\00,\\00,\\00,\\00}
<- text formatting is supplied, string is shorter than array dimension to pad
with zeros
LOAD( A, %t% txtVar3 ); // A = {'A','B','C','D','E','F','G','H','I','J'} <-
Longer than array, no terminator reqd as array dimension know
LOAD( A, %n% u8Var ); // A = {'6','3',\\00,\\00,\\00,\\00,\\00,\\00,\\00,\\00 }
<- text formatter supplied, therefore store as text
LOAD( A, %H04% u8Var ); // A={'0','0','3','F',\\00,\\00, \\00, \\00, \\00, \\00
} <- text formatter supplied, therefore store as text
LOAD( A, "0x", %H04% u8Var ); // A =
{ \\00, '0', '0', '3', 'F', \\00, \\00, \\00, \\00, \\00
}
** wrong - no text format provided to first string, therefore attemps conversion
to number
LOAD( A, %t% "0x", %H04% u8Var ); // A = { '0', 'x', '0', '0', '3',
'F', \\00, \\00, \\00, \\00 } <- correct - text formatting applied
If A = { '1', '2', '3', 'X', 'Y',
'Z', \\00, 'P', 'Q', \\00 }
LOAD( RS2, %r% A ); \\ RS2 = "123XYZ\\00PQ\\00" <- zeros are also sent
LOAD( RS2, %t% A ); \\ RS2 = "123XYZ" <- zeros are text terminators and are not
sent, nor is text after a zero
Note:
The same destination values would be achieved
if TEXT( txt, %r% A );
or TEXT( txt, %t% A );
or LOAD( txtVar, %r% A );
or LOAD( txtVar, %t% A );
Array Minimum and Maximum Values - 49.02
CALC( ... "MIN" ) and CALC( ... "MAX" )
* New functions added to obtain the minimum and maximum values stored in an
array
> CALC( val, array, "MIN" ); The minimum value in the 'array' is stored in 'val'
> CALC( val, array, "MAX" ); The maximum value in the 'array' is stored in 'val'
Array Data Shift - 49.02
CALC( ... "SHIFT" )
* New function added to shift the values in an array up or down its indices.
> CALC( array, carry, shift, "SHIFT" );
> CALC( array, shift, "SHIFT" );
- 'array' is shifted by 'shift' places, one shift at a time.
- If 'shift' is positive then array.1 -> array.2; array.0 -> array.1 etc
- If 'shift' is negative then array.1 -> array.0; array.2 -> array.1 etc
- The shift is 'circular', so the shifted out value is shifted in the other end.
- If 'carry' is specified then the shift passes through the carry, ie the carry
is shifted in and a new
carry is shifted out.
Example:
VAR( arr, 0.0, FLT2, 5 );
VAR car, 8.88, FLT2 );
LOAD( arr.0, 0.00 );
LOAD( arr.1, 1.11 ); LOAD( arr.2, 2.22 );
LOAD( arr.3, 3.33 ); LOAD( arr.4, 4.44 ); // setup arr
= { 0.00, 1.11, 2.22, 3.33, 4.44 }
CALC( arr, -1, "SHIFT" );
// Gives arr = { 1.11, 2.22, 3.33, 4.44, 0.00 }
CALC( arr, 2, "SHIFT" );
// Gives arr = { 4.44, 0.00, 1.11, 2.22, 3.33 }
CALC( arr, car, -1, "SHIFT" );
// Gives arr = { 0.00, 1.11, 2.22, 3.33, 8.88 } and car = 4.44
LOAD( car, 9.99 );
CALC( arr, car, -1, "SHIFT" ); // Gives arr = { 1.11, 2.22, 3.33,
8.88, 9.99 } and car = 0.00
Array Sort
CALC(..."ASORT"); and CALC(..."ASORTR");
Added functions to sort arrays
CALC(arrname, "ASORT|ASORTR");
CALC(arrname.index, "ASORT|ASORTR");
Examples :-
VAR(arrname, 0, U8, 10);
LOAD(arrname, 9, 34, 2, 42, 102, 33, 52, 1, 67, 19);
CALC(arrname, "ASORT");
Results :-
arrname.0 = 1
arrname.1 = 2
arrname.2 = 9
arrname.3 = 19
arrname.4 = 33
arrname.5 = 34
arrname.6 = 42
arrname.7 = 52
arrname.8 = 67
arrname.9 = 102
VAR(arrname, 0, U8, 3, 4);
LOAD(arrname.0, 34, 2, 67, 4);
LOAD(arrname.1, 123, 45, 6, 127);
LOAD(arrname.2, 3, 109, 16, 5);
CALC(arrname, "ASORT");
Results :-
arrname.0 = 3, 109, 16, 5
arrname.1 = 34, 2, 67, 4
arrname.2 = 123, 45, 6, 127
VAR(arrname, 0, U8, 3, 4);
LOAD(arrname.0, 34, 2, 67, 4);
LOAD(arrname.1, 123, 45, 6, 127);
LOAD(arrname.2, 3, 109, 16, 5);
CALC(arrname.1, "ASORT");
Results :-
arrname.0 = 34, 2, 67, 4
arrname.1 = 6, 45, 123, 127
arrname.2 = 3, 109, 16, 5
Additional Len parameter added to sort only a specified number of
elements
Syntax / Example
CALC(arrname, "ASORT");
CALC(arrname.index, "ASORT");
CALC(arrname, "ASORTR");
CALC(arrname.index, "ASORTR");
CALC(arrname,len, "ASORT");
CALC(arrname.index,len, "ASORT");
CALC(arrname,len, "ASORTR");
CALC(arrname.index,len, "ASORTR");
Pointer
Arrays as LOAD() Source - v49.42
* Added functionality to allow a LOAD() source
to be from a pointer array.
LOAD(RS2,A.0.0); where A is array of pointers.
Text Arrays - Functionality available by using U8
and U16 arrays - 49.46
* Text arrays can consist of either ASCII (8-bit) or Unicode (16-bit)
characters.
* Creating an array of ASCII (8-bit) characters. Use the U8 data type.
VAR( varA, 0, U8, 6, 10 );
Number of text strings = 6
Maximum text string length = 10
Loading the array, use text formatting '%t%'
LOAD( varA.0, %t% "Zero" );
LOAD( varA.1, %t% "One" );
LOAD( varA.2, %t% "Two" );
LOAD( varA.3, %t% "Three" );
LOAD( varA.4, %t% "Four" );
LOAD( varA.5, %t% "This is too long" ); // truncates to "This is to"
Reading from the array, again using the text formatting '%t%'
LOAD( RS2, %t% varA.0, ", ", %t% varA.4 ); // Outputs "Zero, Four"
LOAD( RS2, %t% varA.5 ); // Outputs "This is to"
TEXT( txt1, varA.3 );; // Displays "Three"
* Creating an array of Unicode (16-bit) characters. Use the U16 data type
VAR( varB, 0, U16, 4, 8 );
Number of text strings = 4
Maximum text string length = 8
Loading the array, using text formatting '%t%'
LOAD( varB.0, %t% "\\w1234Zero" ); // varB.0.0 = \\1234
LOAD( varB.1, %t% "One" );
LOAD( varB.2, %t% "Two" );
LOAD( varB.3, %t% "Three" );
Reading from the Array, using the text formatting '%t%'
LOAD( RS2, %t% varB.0, ", ", %t% varB.3 ); // Outputs "\\w1234Zero, Three"
* Accessing individual characters using standard array accesses.
LOAD( RS2, %h% varB.0.0 ); // Outputs 1234
LOAD( varB.2.1, 42 ); // '*'
LOAD( RS2, varB.2 ); // Outputs "T*o"
* Displaying the raw data using the %r% formatting outputs the whole string
including the terminating nulls.
LOAD( RS2, %r% varB.3 ); // Outputs "Three\\00\\00\\00"
|