User Tools

Site Tools


k7:k7.4:k7.4.5:start

7.4.5 Inline array

With the inline notation of an array, you can create an array in a compact way and fill it with data immediately.

Syntax for an inline array:

Array = [ Expression [ , ... ] ] 

The statement creates an array and returns it. The data type of all elements is checked. If they are all of the same type, or if they can be converted to the same native data type, then an array of a specific type is returned. For example, string[] if all elements are only string values, float[] for floating point numbers and so on…. . Otherwise, a variant[] array is returned. You create an array within an expression with the[….] operator.

The next 2 lines can be read like this:

Dim aZeichenArray As String[] 
aZeichenArray = ["I", "IV", "V", "IX", "X", "XL", "L", "XC", "C", "CD", "D", "CM", "M"] 

The declared array' aZeichenArray' is assigned the inline array[“I”,“IV”,…,“M”]. It has been declared anonymously or as it is called in the Gambas documentation: inline (? http://gambaswiki.org/wiki/lang/array). The Inline array[“I”,“IV”,…,“M”] is a full-fledged array - but without name and can be used like a normal array.

Hint:

The array[“I”,“IV”,…,“M”] is an inline array - but not an embedded array, although both terms are almost the same. The “Inline” refers to the way in which the array is written. For embedded arrays,“Embedded” refers to the position of the array in memory. Further information can be found in chapter 7.4.6 Embedded Array.

7.4.5.1 Example 1

In the first project an inline array with 5 elements is specified, all of which have a different data type:

Dim aArray As Array 
Dim vElement As Variant 
Dim iCount As Integer 

aArray = ["Adam", 44, True, Sqr(9), Year(Now)] 
Print "Typ von aArray = "; Object.Type(aArray) 

For Each vElement In aArray 
  Print vElement 
Next 

Print "Alternative Ausgabe über einen Index:" 
For iCount = 0 To aArray.Max 
  Print aArray[iCount] 
Next 

Output in the IDE console:

Typ von aArray = Variant[] 

Adam 
44 
True 
3 
2014 

The alternative output via an index provides the same result.

7.4.5.2 Example 2

The join(…)-method is used for the inline array[“A”,“B”,“C”]:

PRINT ["A", "B", "C"].Join("/") 

Output: A/B/C

7.4.5.3 Example 3

The two inline arrays are used in the following source code:

[[“I”,“IV”,“V”,“IX”,“X”,“XL”,“L”,“XC”,“C”,“CD”,“D”,“CM”,“M”] [1,4,5,9,10,40,50,90,100,400,500,900,1000]

and are assigned in the lines (1*) and (2*) to the declared arrays 'aZeichenArray' and 'aZahlenArray' in different ways:

Function IntegerZahlToZahlZeichen(iIntegerZahl As Long) As String 
  Dim aZeichenArray As String[] 
  Dim aZahlenArray As New Integer[] 
  Dim iCount As Integer 
  Dim sZahlZeichen As String 
 
' Verwendung von Inline-Arrays 
  aZeichenArray = ["I", "IV", "V", "IX", "X", "XL", "L", "XC", "C", "CD", "D", "CM", "M"]   * 
  aZahlenArray.Insert([1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000])              ** 
 
  For iCount = 12 To 0 Step -1 
    While (iIntegerZahl >= aZahlenArray[iCount]) 
      iIntegerZahl = iIntegerZahl - aZahlenArray[iCount] 
      sZahlZeichen = sZahlZeichen & aZeichenArray[iCount] 
    Wend 
  Next ' iCount 
 
  Return sZahlZeichen 
 
End ' ZahlToZahlzeichen → Conversion according to an approach by Carlos Alberto Longen

7.4.5.4 Example 4

Dim a2DArrayNames As New String[10, 5] 
 
Randomize 
 
For i = 0 To a2DArrayNames.Bounds[0] - 1 
  For j = 0 To a2DArrayNames.Bounds[1] - 1 
    a2DArrayNames[i, j] = ["Adam", "Bruno", "Carina", "Detlef", "Erwin"][Rnd(0, 5)]      ★★★ 
  Next ' j 
Next ' i 

The string array is the names:

[“Adam”,“ Bruno”,“Carina”,“Detlef”,“Erwin”]

From this inline array, an element is selected with a random index in the range of 0 to 4 (!) since the conversion to an integer value always truncates all decimals. The line (3*) thus assigns a random name to an element of the native multidimensional array 'a2DArrayNames' addressed by the i,j-coordinates.

Here follows the complete source code of the procedure from which the above-mentioned adapted source code section was taken:

Public Sub btnShow2D_Click() 
  Dim i, j, k As Integer 
  Dim a2DArrayNames As New String[][] 
  Dim myArray As New String[] 
 
  Randomize  
 
  a2DArray.Resize(10)     
 
  For i = 0 To 9 
    a2DArrayNames[i] = New String[5] 
    For j = 0 To 4 
      a2DArrayNames[i][j] = ["Adam", "Bruno", "Carina", "Detlef", "Erwin"][Rnd(0, 5)] 
    Next 
  Next 
 
' Structured output in the console: 
  For Each myArray In a2DArrayNames 
    For j = 0 To myArray.Max 
        If (j + 1) Mod (myArray.Max + 1) = 0 Then 
           Print myArray[j] 
        Else 
          Print myArray[j], 
        Endif 
    Next 
  Next 
 
' Alternative
  For Each myArray In a2DArrayNames
    For j = 0 To myArray.Max 
      Print myArray[j],
      If (j + 1) Mod (myArray.Max + 1) = 0 Then Print
    Next ' j
  Next ' myArray  
 
End 

Structured output in the IDE console:

Carina  Adam    Adam    Detlef  Detlef 
Adam    Erwin   Adam    Bruno   Bruno 
Erwin   Erwin   Detlef  Carina  Adam 
Carina  Detlef  Adam    Detlef  Carina 
Adam    Erwin   Detlef  Bruno   Erwin 
Detlef  Detlef  Detlef  Bruno   Erwin 
Erwin   Erwin   Bruno   Erwin   Erwin 
Erwin   Carina  Erwin   Carina  Detlef 
Bruno   Adam    Detlef  Detlef  Bruno 
Adam    Detlef  Detlef  Carina  Adam 

7.4.5.5 Example 5

The simplest way to read data from a process (–> chapter 21.3.1 Using Quick syntax) is to use the short form of the EXEC instruction - the so-called Quick syntax:

EXEC  aCommand TO (String-)Variable ' aCommand is a (String-)Array 
Public Sub btnPingOverExec_Click() 
 Dim sAusgabe As String 
 
  FMain.Mouse = Mouse.Wait 
 
  EXEC [sProgrammName, TextBox1.Text, "-c", "4"] To sAusgabe ' String array as inline array 
 
  TextArea.Insert(gb.NewLine & sAusgabe) 
  FMain.Mouse = Mouse.Default 
 
End ' btnPingOverExec_Click

7.4.5.6 Example 6

The following example shows how the use of inline arrays can considerably increase clarity in the source code. The individual variants require the German month names or the days of the week for a specific date.

1st variant

  Dim dDate as Date 
  Dim sAktuellerMonat as String 

  IF Month(dDate) = 12 THEN sAktuellerMonat = "Dezember" 
  IF Month(dDate) = 11 THEN sAktuellerMonat = "November" 
  IF Month(dDate) = 10 THEN sAktuellerMonat = "Oktober" 
  IF Month(dDate) = 9 THEN sAktuellerMonat = "September" 
  IF Month(dDate) = 8 THEN sAktuellerMonat = "August" 
  IF Month(dDate) = 7 THEN sAktuellerMonat = "Juli" 
  IF Month(dDate) = 6 THEN sAktuellerMonat = "Juni" 
  IF Month(dDate) = 5 THEN sAktuellerMonat = "Mai" 
  IF Month(dDate) = 4 THEN sAktuellerMonat = "April" 
  IF Month(dDate) = 3 THEN sAktuellerMonat = "März" 
  IF Month(dDate) = 2 THEN sAktuellerMonat = "Februar" 
  IF Month(dDate) = 1 THEN sAktuellerMonat = "Januar"

2nd variant

  Public Function GetMonth(dDate) As String 
    Select Case Month(dDate) 
      Case 1 
        Return "Januar" 
      Case 2 
        Return "Februar" 
      ... 
      Case 12 
        Return "Dezember" 
    End Select 
  End 

  sAktuellerMonat = GetMonth(Now()) 

3. variant - short and concise:

  Dim aMonate As String[] 
  
  aMonate = ["Januar", "Februar", "März", "April", ..., "Oktober", "November", "Dezember"] 
  sAktuellerMonat = aMonate[Month(dDate)-1]

The following is an analogous example of displaying the weekday in a TextBox for a date selected via the DateChooser component:

  aWochentage = ["Sonntag", "Montag", "Dienstag", …, "Donnerstag", "Freitag", "Samstag"]  
  txbDateDayOfWeek.Text = aWochentage[WeekDay(DateChooser1.Value)] ' Sonntag = 0!

7.4.5.7 Example 7

Here, an inline array is already used for array declaration:

Dim aNames As String[] = ["Adler", "Bär", "Dachs", "Fuchs", "Meise", "Uhu", "Elch"] 

7.4.5.8 Example 8

To insert data into a matrix, you can also use inline arrays, three of which are used in the following section of the source code:

  Dim hMatrix As Matrix 

  hMatrix = New Matrix(3, 5, False) ' Matrix aus 3 Zeilen mit 5 Spalten, reelle Zahlen

' Fill matrix with values 

  hMatrix.SetRow(0, [11, 12, 13, 14, 15]) ' Elements here only of type Float
  hMatrix.SetRow(1, [21, 22, 23, 24, 25]) 
  hMatrix.SetRow(2, [31, 32, 33, 34, 35]) 

7.4.5.9 Example 9

Class.New (gb) instantiates a class:

Function New ( [ Arguments As Array ] ) As Object 

This routine works exactly like the NEW operator except that the constructor arguments must be specified by an inline array.

Download

Articles

Download


7.4.5 Inline-Array

Mit der Inline-Notation eines Arrays können Sie auf kompakte Weise einerseits ein Array erzeugen und es andererseits sofort mit Daten füllen.

Syntax für ein Inline-Array:

Array = [ Expression [ , ... ] ] 

Die Anweisung erzeugt ein Array und gibt es zurück. Der Daten-Typ aller Elemente wird geprüft. Wenn diese alle vom gleichen Typ sind oder wenn sie in den gleichen nativen Datentyp konvertiert werden können, dann wird ein Array von einem speziellen Typ zurückgegeben. Zum Beispiel String[ ], wenn alle Elemente nur String-Werte sind, Float[] bei Fließkomma-Zahlen und so weiter… . Ansonsten wird ein Variant[ ]-Array zurückgegeben. Sie erzeugen ein Array innerhalb eines Ausdrucks mit dem […]-Operator.

Die nächsten 2 Zeilen sind so zu lesen:

Dim aZeichenArray As String[] 
aZeichenArray = ["I", "IV", "V", "IX", "X", "XL", "L", "XC", "C", "CD", "D", "CM", "M"] 

Dem deklarierten Array 'aZeichenArray' wird das Inline-Array [“I”, “IV”, .., “M”] zugewiesen. Es wurde anonym deklariert oder wie es in der Gambas-Dokumentation genannt wird: inline (→ http://gambaswiki.org/wiki/lang/array). Das Inline-Array [“I”, “IV”, .., “M”] ist ein vollwertiges Array – jedoch ohne Namen und kann wie ein normales Array benutzt werden.

Hinweis:

Das Array [“I”, “IV”, .., “M”] ist ein Inline-Array - aber kein eingebettetes Array, obwohl beide Begriffe sinngemäß nahezu gleich sind. Das “Inline” bezieht sich auf die Art und Weise, wie man das Array notiert. Bei “Embedded”-Arrays bezieht sich “Embedded” auf die Lage des Arrays im Speicher. Weitere Informationen finden Sie im → Kapitel 7.4.6 Embedded-Array.

7.4.5.1 Beispiel 1

Im ersten Projekt wird ein Inline-Array mit 5 Elementen angegeben, die alle einen anderen Daten-Typ besitzen:

Dim aArray As Array 
Dim vElement As Variant 
Dim iCount As Integer 

aArray = ["Adam", 44, True, Sqr(9), Year(Now)] 
Print "Typ von aArray = "; Object.Type(aArray) 

For Each vElement In aArray 
  Print vElement 
Next 

Print "Alternative Ausgabe über einen Index:" 
For iCount = 0 To aArray.Max 
  Print aArray[iCount] 
Next 

Ausgaben in der IDE-Konsole:

Typ von aArray = Variant[] 

Adam 
44 
True 
3 
2014 

Die alternative Ausgabe über einen Index liefert das gleiche Ergebnis.

7.4.5.2 Beispiel 2

Auf das Inline-Array [“A”, “B”, “C”] wird die Join(..)-Methode angewendet:

PRINT ["A", "B", "C"].Join("/") 

Ausgabe: A/B/C

7.4.5.3 Beispiel 3

Die beiden Inline-Arrays werden im folgenden Quelltext eingesetzt:

[“I”, “IV”, “V”, “IX”, “X”, “XL”, “L”, “XC”, “C”, “CD”, “D”, “CM”, “M”] [1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000]

und werden in den Zeilen ★ und ★★ den deklarierten Arrays 'aZeichenArray' und 'aZahlenArray' auf unterschiedliche Art zugewiesen:

Function IntegerZahlToZahlZeichen(iIntegerZahl As Long) As String 
  Dim aZeichenArray As String[] 
  Dim aZahlenArray As New Integer[] 
  Dim iCount As Integer 
  Dim sZahlZeichen As String 
 
' Verwendung von Inline-Arrays 
  aZeichenArray = ["I", "IV", "V", "IX", "X", "XL", "L", "XC", "C", "CD", "D", "CM", "M"]   * 
  aZahlenArray.Insert([1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000])              ** 
 
  For iCount = 12 To 0 Step -1 
    While (iIntegerZahl >= aZahlenArray[iCount]) 
      iIntegerZahl = iIntegerZahl - aZahlenArray[iCount] 
      sZahlZeichen = sZahlZeichen & aZeichenArray[iCount] 
    Wend 
  Next ' iCount 
 
  Return sZahlZeichen 
 
End ' ZahlToZahlzeichen → Konvertierung nach einem Ansatz von Carlos Alberto Longen 

7.4.5.4 Beispiel 4

Dim a2DArrayNames As New String[10, 5] 
 
Randomize 
 
For i = 0 To a2DArrayNames.Bounds[0] - 1 
  For j = 0 To a2DArrayNames.Bounds[1] - 1 
    a2DArrayNames[i, j] = ["Adam", "Bruno", "Carina", "Detlef", "Erwin"][Rnd(0, 5)]      ★★★ 
  Next ' j 
Next ' i 

Das String-Array der Namen ist:

[“Adam”, “Bruno”, “Carina”, “Detlef”, “Erwin”]

Aus diesem Inline-Array wird mit zufälligem Index im Bereich von 0 bis 4(!) ein Element ausgewählt, da die Konvertierung in einen Integer-Wert stets alle Dezimalen abschneidet (trunkiert). Die Zeile ★★★ weist so einem über die i,j-Koordinaten adressierten Element des nativen mehrdimensionalen Arrays 'a2DArrayNames' einen zufälligen Namen zu.

Hier folgt der vollständige Quelltext der Prozedur, aus dem der o.a. adaptierte Quelltext-Abschnitt entnommen wurde:

Public Sub btnShow2D_Click() 
  Dim i, j, k As Integer 
  Dim a2DArrayNames As New String[][] 
  Dim myArray As New String[] 
 
  Randomize  
 
  a2DArray.Resize(10)     
 
  For i = 0 To 9 
    a2DArrayNames[i] = New String[5] 
    For j = 0 To 4 
      a2DArrayNames[i][j] = ["Adam", "Bruno", "Carina", "Detlef", "Erwin"][Rnd(0, 5)] 
    Next 
  Next 
 
' Strukturierte Ausgabe Konsole: 
  For Each myArray In a2DArrayNames 
    For j = 0 To myArray.Max 
        If (j + 1) Mod (myArray.Max + 1) = 0 Then 
           Print myArray[j] 
        Else 
          Print myArray[j], 
        Endif 
    Next 
  Next 
 
' Alternative
  For Each myArray In a2DArrayNames
    For j = 0 To myArray.Max 
      Print myArray[j],
      If (j + 1) Mod (myArray.Max + 1) = 0 Then Print
    Next ' j
  Next ' myArray  
 
End 

Strukturierte Ausgabe in der IDE-Konsole:

Carina  Adam    Adam    Detlef  Detlef 
Adam    Erwin   Adam    Bruno   Bruno 
Erwin   Erwin   Detlef  Carina  Adam 
Carina  Detlef  Adam    Detlef  Carina 
Adam    Erwin   Detlef  Bruno   Erwin 
Detlef  Detlef  Detlef  Bruno   Erwin 
Erwin   Erwin   Bruno   Erwin   Erwin 
Erwin   Carina  Erwin   Carina  Detlef 
Bruno   Adam    Detlef  Detlef  Bruno 
Adam    Detlef  Detlef  Carina  Adam 

7.4.5.5 Beispiel 5

Die einfachste Art, um Daten aus einem Prozess zu lesen (→ Kapitel 21.3.1 Einsatz Quick-Syntax) , besteht darin, die Kurzform der EXEC-Instruktion – die sogenannte Quick-Syntax – zu verwenden:

EXEC  aCommand TO (String-)Variable ' aCommand ist ein (String-)Array 
Public Sub btnPingOverExec_Click() 
 Dim sAusgabe As String 
 
  FMain.Mouse = Mouse.Wait 
 
  EXEC [sProgrammName, TextBox1.Text, "-c", "4"] To sAusgabe ' String-Array als Inline-Array 
 
  TextArea.Insert(gb.NewLine & sAusgabe) 
  FMain.Mouse = Mouse.Default 
 
End ' btnPingOverExec_Click

7.4.5.6 Beispiel 6

Im folgenden Beispiel wird gezeigt, wie der Einsatz von Inline-Arrays die Übersichtlichkeit im Quelltext beträchtlich erhöhen kann. Benötigt werden in den einzelnen Varianten die deutschen Monatsnamen oder die Wochentage für ein bestimmtes Datum.

1. Variante

  Dim dDate as Date 
  Dim sAktuellerMonat as String 

  IF Month(dDate) = 12 THEN sAktuellerMonat = "Dezember" 
  IF Month(dDate) = 11 THEN sAktuellerMonat = "November" 
  IF Month(dDate) = 10 THEN sAktuellerMonat = "Oktober" 
  IF Month(dDate) = 9 THEN sAktuellerMonat = "September" 
  IF Month(dDate) = 8 THEN sAktuellerMonat = "August" 
  IF Month(dDate) = 7 THEN sAktuellerMonat = "Juli" 
  IF Month(dDate) = 6 THEN sAktuellerMonat = "Juni" 
  IF Month(dDate) = 5 THEN sAktuellerMonat = "Mai" 
  IF Month(dDate) = 4 THEN sAktuellerMonat = "April" 
  IF Month(dDate) = 3 THEN sAktuellerMonat = "März" 
  IF Month(dDate) = 2 THEN sAktuellerMonat = "Februar" 
  IF Month(dDate) = 1 THEN sAktuellerMonat = "Januar"

2. Variante

  Public Function GetMonth(dDate) As String 
    Select Case Month(dDate) 
      Case 1 
        Return "Januar" 
      Case 2 
        Return "Februar" 
      ... 
      Case 12 
        Return "Dezember" 
    End Select 
  End 

  sAktuellerMonat = GetMonth(Now()) 

3. Variante – kurz und bündig:

  Dim aMonate As String[] 
  
  aMonate = ["Januar", "Februar", "März", "April", ..., "Oktober", "November", "Dezember"] 
  sAktuellerMonat = aMonate[Month(dDate)-1]

Es folgt ein analoges Beispiel für die Anzeige des Wochentages in einer TextBox für ein Datum, das über die Komponente DateChooser ausgewählt wurde:

  aWochentage = ["Sonntag", "Montag", "Dienstag", …, "Donnerstag", "Freitag", "Samstag"]  
  txbDateDayOfWeek.Text = aWochentage[WeekDay(DateChooser1.Value)] ' Sonntag = 0!

7.4.5.7 Beispiel 7

Hier wird ein Inline-Array bereits bei der Array-Deklaration eingesetzt:

Dim aNames As String[] = ["Adler", "Bär", "Dachs", "Fuchs", "Meise", "Uhu", "Elch"] 

7.4.5.8 Beispiel 8

Für das Einfügen von Daten in eine Matrix können Sie auch Inline-Arrays verwenden, von denen drei im folgenden Quelltext-Ausschnitt benutzt werden:

  Dim hMatrix As Matrix 

  hMatrix = New Matrix(3, 5, False) ' Matrix aus 3 Zeilen mit 5 Spalten, reelle Zahlen

' Matrix mit Werten füllen 

  hMatrix.SetRow(0, [11, 12, 13, 14, 15]) ' Elemente hier nur vom Typ Float
  hMatrix.SetRow(1, [21, 22, 23, 24, 25]) 
  hMatrix.SetRow(2, [31, 32, 33, 34, 35]) 

7.4.5.9 Beispiel 9

Class.New (gb) instanziiert eine Klasse:

Function New ( [ Arguments As Array ] ) As Object 

Diese Routine funktioniert genau wie der NEW Operator – mit der Ausnahme – dass die Konstruktor-Argumente durch ein Inline-Array angegeben werden müssen.

Download

Artikel

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.5/start.txt · Last modified: 02.07.2018 (external edit)

Page Tools