User Tools

Site Tools


k7:k7.4:k7.4.6:start

7.4.6 Embedded array - Embedded array

Dynamic arrays are real Gambas objects, while embedded arrays are a way to access part of an object as an array. In this case, a memory block is allocated to the array content - exactly where the embedded array was declared object-related. The bottom line is that in gambas, all properties of an object are usually accessible via references, i. e. outside of this object. This is not the case with embedded arrays (hence the name). These arrays get a fixed value when the class is defined and are then stored directly as a memory block in the description of the class as it is available to the interpreter.

Syntax for an embedded array:

[ STATIC ] { PUBLIC | PRIVATE } Identifier [ Array dimensions ... ] AS NativeDatatype 
  • An embedded array is an array assigned directly to an object.
  • An embedded array cannot be initialized.
  • An embedded array cannot be shared and is destroyed when the associated object is destroyed.
  • The size of an embedded array must be known during compilation.
  • With an embedded array,“Embedded” refers to the storage of the array in memory!
  • In Gambas3, embedded arrays cannot be used as local variables - but they can be public!

Since embedded arrays are not objects, but gambas can only work with objects, you go a different way and create a temporary object that shows the interpreter how to work with such arrays without them being full-fledged objects. Embedded arrays cannot be declared as local variables, because each value on the Gambas stack (the local variables are located there) can only consume a certain memory area (32 bytes on a 64-bit system) and arrays can be larger!

The special position of embedded arrays is also reflected in an article by Emil Lenngren. He writes: “Embedded arrays consume less memory because their data is directly allocated in the class structure. But they are slower because a wrapper object must be created for each access. I recommend that you do not use embedded arrays. You are useful when you need to create a structure that contains an array that you want to pass to an external C function later - but not otherwise.”

Similarly, Benoît Minisini commented: “Embedded arrays were introduced to have the ability to imitate a memory structure declared in a C library (In C, all structural elements are allocated as blocks within the structure - which is not normally the case in Gambas - except for embedded arrays). Otherwise there's no real reason to use it.”

Embedded arrays are - as emphasized above by Lenngren and Minisini - marginal phenomena.

Nevertheless, an example shows the (formal) use of an embedded array:

PUBLIC embArray[3, 3, 3] As Integer 
...
Public Sub btnShowEmbeddedArray_Click() 
  Dim i, ii, iii As Integer 
' Dim embArray[3, 3, 3] As Integer ' → FEHLER! 
  
  For i = 0 To 2 
    For ii = 0 To 2 
      For iii = 0 To 2 
        Print "[ "; i; " | "; ii; " | "; iii; " ]"; " = "; 
        embArray[i, ii, iii] = i * 9 + ii * 3 + iii 
        Print embArray[i, ii, iii] 
      Next
    Next 
  Next 
  
End ' btnShowEmbeddedArray_Click() 

Output in the IDE console:

[ 0 | 0 | 0 ] = 0 
[ 0 | 0 | 1 ] = 1 
[ 0 | 0 | 2 ] = 2 
[ 0 | 1 | 0 ] = 3 
... 
[ 1 | 0 | 0 ] = 9 
[ 1 | 0 | 1 ] = 10 
[ 1 | 0 | 2 ] = 11 
... 
[ 2 | 2 | 0 ] = 24 
[ 2 | 2 | 1 ] = 25 
[ 2 | 2 | 2 ] = 26 

Download

Articles

Download


7.4.6 Embedded-Array – Eingebettetes Array

Dynamische Arrays sind echte Gambas-Objekte, während eingebettete (embedded) Arrays eine Möglichkeit darstellen, auf einen Teil eines Objekts als Array zuzugreifen. Dem Array-Inhalt ist in diesem Fall ein Speicherblock alloziert – genau dort, wo das eingebettete Array objekt-bezogen deklariert wurde. Die Quintessenz ist, dass in Gambas normalerweise alle Eigenschaften von einem Objekt über Referenzen erreichbar sind, also außerhalb dieses Objekts liegen. Bei eingebetteten Arrays (daher auch der Name) ist das nicht der Fall. Diese Arrays bekommen bei der Definition der Klasse eine feste Größe und befinden sich dann direkt als Speicherblock in der Beschreibung der Klasse, wie sie dem Interpreter vorliegt.

Syntax für ein Embedded-Array:

[ STATIC ] { PUBLIC | PRIVATE } Identifier [ Array dimensions ... ] AS NativeDatatype 
  • Ein eingebettetes Array ist ein Array, das direkt einem Objekt zugeordnet ist.
  • Ein eingebettetes Array kann man nicht initialisieren.
  • Ein eingebettetes Array kann nicht geteilt werden und wird zerstört, wenn das assoziierte Objekt zerstört wird.
  • Die Größe eines eingebetteten Arrays muss bei der Kompilierung bekannt sein.
  • Bei einem Embedded-Array bezieht sich “Embedded” auf die Ablage des Arrays im Speicher!
  • In Gambas3 können eingebettete Arrays nicht als lokale Variablen verwendet werden – aber sie können öffentlich sein!

Da eingebettete Arrays keine Objekte sind, Gambas jedoch nur mit Objekten arbeiten kann, beschreitet man einen anderen Weg und erstellt ein temporäres Objekt, das dem Interpreter zeigt, wie man mit solchen Arrays arbeiten kann, ohne dass sie jedoch vollwertige Objekte sind. Eingebettete Arrays können wie bereits o.a. nicht als lokale Variablen deklariert werden, da jeder Wert auf dem Gambas-Stack (dort liegen die lokalen Variablen) nur einen bestimmten Speicherbereich verbrauchen darf (32 Bytes auf einem 64-Bit-System) und Arrays können größer sein!

Die besondere Stellung von Embedded-Arrays zeigt sich auch in einem Beitrag von Emil Lenngren. Er schreibt: “Eingebettete Arrays verbrauchen weniger Speicher, da ihre Daten direkt in der Klassenstruktur alloziert sind. Aber sie sind langsamer, weil für jeden Zugriff ein Wrapper-Objekt erstellt werden muss. Ich empfehle, dass Sie auf eingebettete Arrays verzichten. Sie sind nützlich, wenn Sie eine Struktur erstellen müssen, die ein Array enthält, das Sie später einer externen C-Funktion übergeben wollen – aber sonst nicht.”

Ähnlich äußerte sich Benoît Minisini: “Eingebettete Arrays wurden eingeführt, um die Möglichkeit zu haben, eine Speicherstruktur zu imitieren, die in einer C-Bibliothek deklariert wurde (In C sind alle Strukturelemente als Block innerhalb der Struktur alloziert - wie es in Gambas normalerweise nicht ist – außer bei eingebetteten Arrays). Sonst gibt es keinen echten Grund, sie zu nutzen.”

Eingebettete Arrays sind – wie oben von Lenngren und Minisini betont – Randerscheinungen.

Trotzdem soll mit einem Beispiel der (formale) Einsatz eines eingebetteten Arrays gezeigt werden:

PUBLIC embArray[3, 3, 3] As Integer 
...
Public Sub btnShowEmbeddedArray_Click() 
  Dim i, ii, iii As Integer 
' Dim embArray[3, 3, 3] As Integer ' → FEHLER! 
  
  For i = 0 To 2 
    For ii = 0 To 2 
      For iii = 0 To 2 
        Print "[ "; i; " | "; ii; " | "; iii; " ]"; " = "; 
        embArray[i, ii, iii] = i * 9 + ii * 3 + iii 
        Print embArray[i, ii, iii] 
      Next
    Next 
  Next 
  
End ' btnShowEmbeddedArray_Click() 

Ausgabe in der IDE-Konsole:

[ 0 | 0 | 0 ] = 0 
[ 0 | 0 | 1 ] = 1 
[ 0 | 0 | 2 ] = 2 
[ 0 | 1 | 0 ] = 3 
... 
[ 1 | 0 | 0 ] = 9 
[ 1 | 0 | 1 ] = 10 
[ 1 | 0 | 2 ] = 11 
... 
[ 2 | 2 | 0 ] = 24 
[ 2 | 2 | 1 ] = 25 
[ 2 | 2 | 2 ] = 26 

Download

The website uses a temporary session cookie. This technically necessary cookie is deleted when the browser is closed. You can find information on cookies in our privacy policy.
k7/k7.4/k7.4.6/start.txt · Last modified: 02.07.2018 (external edit)

Page Tools