Buchempfehlung
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Umfassend, aber leicht verständlich führt dieses Buch in die Programmierung von ATMEL AVR Mikrocontrollern ein. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Code-Beispiel

Code-Beispiele » Kleine Helferlein

Dynamische Arrays in Types

Lizenz:Erster Autor:Letzte Bearbeitung:
WTFPLRedakteurMOD 10.11.2011

Dynamische Arrays sind in Types in der aktuellen FreeBASIC Version (0.23.0) nicht möglich. Wenn man aber auf die OOP-Fähigkeiten von FB zurückgreift, ist es sehr wohl möglich, wenn auch ungemein umständlicher.


Type testtyp
    Public:
    Declare Constructor
    Declare Constructor(c As Integer)

    Declare Destructor

    Declare Property array(i As Integer) As Integer
    Declare Property array(i As Integer, a As Integer)

    Declare Function LBound() As Integer
    Declare Function UBound() As Integer

    Declare Function Pointr() As UInteger Ptr
    Declare Sub ReDim(x As Integer)

    Private:
    As Integer size
    As Integer Ptr arr
End Type

Constructor testtyp

End Constructor
Constructor testtyp(c As Integer)
    If c >= 0 Then
        arr = Callocate(c, SizeOf(Integer))
        size = c + 1
    EndIf
End Constructor

Destructor testtyp
    size = 0
    DeAllocate(arr)
End Destructor

Property testtyp.array(i As Integer) As Integer
    If i >= 0 And i < size Then Return arr[i]
End Property
Property testtyp.array(i As Integer, a As Integer)
    If i >= 0 And i < size Then arr[i] = a
End Property

Function testtyp.LBound() As Integer
    If arr <> 0 Then
        Return 0
    Else
        Return -1
    EndIf
End Function
Function testtyp.UBound() As Integer
    If arr <> 0 Then
        Return size - 1
    Else
        Return -1
    EndIf
End Function

Function testtyp.Pointr() As UInteger Ptr
    Return arr
End Function

Sub testtyp.ReDim(x As Integer)
    If x >= 0 Then
        arr = ReAllocate(arr, x * SizeOf(Integer))
        size = x
    EndIf
End Sub

'############################################################################################

Sub testsub(ByRef udt As testtyp) 'Wird standardmäßig ByRef übergeben, ByVal ist aber möglich
    Print udt.Pointr()
    udt.ReDim(5)
    udt.array(0) = 9
    udt.array(1) = 7
    udt.array(4) = 6
End Sub

Dim testvar As testtyp = 1

testsub(testvar)

Print testvar.array(0)
Print testvar.array(1)
Print
Print testvar.LBound(), testvar.UBound()
testvar.ReDim(6)
Print testvar.LBound(), testvar.UBound()
Print testvar.Pointr()
Sleep

Alternativlösung (Thread-Safe, weitere Variablentypen vorbereitet bzw. ergänzbar): Datenfelder (Arrays) mit variabler Größe in UDTs (TYPEs)


Zusätzliche Informationen und Funktionen
  • Das Code-Beispiel wurde am 11.04.2010 von RedakteurMOD angelegt.
  • Die aktuellste Version wurde am 10.11.2011 von AdministratorSebastian gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen