MemoryBlock
Ein MemoryBlock ist ein Speicherbereich im Arbeitsspeicher (SRAM), genauer ein Speicher-Objekt im dynamisch verwalteten Speicherbereich von LunaAVR. Beim Erzeugen eines MemoryBlock wird die gewünschte Anzahl Bytes im Arbeitsspeicher reserviert und kann dann zur Speicherung von beliebigen Daten verwendet werden.
Der Zugriff auf den MemoryBlock bzw. dessen Daten darf ausschließlich nur über die Objekt-Methoden erfolgen, da ein MemoryBlock dynamisch im Speicher verwaltet wird.
Um einen MemoryBlock zu erzeugen, dimensioniert man eine Variable vom Typ MemoryBlock und ruft die „New“-Methode mit der gewünschten anzahl Bytes als Parameter auf. Die maximale Größe eines MemoryBlocks beträgt 65 kb.
Erzeugen eines neuen MemoryBlock
ACHTUNG! Ab Version 2013.r6 korrekte objektorientierte Notation:
dim myvar as MemoryBlock myvar = New MemoryBlock(numBytes)
Freigabe eines MemoryBlock
Die Freigabe eines Speicherblocks erfolgt automatisch bei Zuweisung eines neuen Speicherblocks, sowie beim Verlassen einer Methode, außer es handelt sich um eine globale Variable, eine Referenz („byRef“-Parameter) oder eine statische Variable („dim x as static …“). Code-Beispiele zur Erläuertung siehe unten.
Methoden/Eigenschaften
Methoden (aufrufen) | |
---|---|
Name | Beschreibung |
.New(length)1) | Neuen MemoryBlock allozieren und zuweisen, ein vorhandener Block wird freigegeben. |
.Free2) | Ein vorhandener Block wird freigegeben. |
- length: zu allozierende Anzahl Bytes
Methoden (nur lesen) | ||
---|---|---|
Name | Beschreibung | Rückgabetyp |
.Addr | Adresse der Variable im Arbeitsspeicher | word |
.Ptr | Adresse des zugewiesenen Speicherblocks im Arbeitsspeicher | word |
.Size3) | Gesamtanzahl Bytes (Größe) des allozierten Speicherblocks. | word |
Methoden (lesen und schreiben) | ||
Name | Beschreibung | Rückgabetyp |
.ByteValue(offset) | Byte lesen/schreiben | byte |
.WordValue(offset) | Word lesen/schreiben | word |
.IntegerValue(offset) | Integer lesen/schreiben | integer |
.Int24Value(offset)4) | int24 lesen/schreiben | int24 |
.Uint24Value(offset)5) | uint24 lesen/schreiben | uint24 |
.LongValue(offset) | Long lesen/schreiben | long |
.LongIntValue(offset)6) | LongInt lesen/schreiben | longint |
.SingleValue(offset) | Single lesen/schreiben | single |
.StringValue(offset,bytes) | String lesen/schreiben mit Längenvorgabe | string |
.PString(offset) | Pascal-String lesen/schreiben (Start-Byte ist Länge) | string |
.CString(offset) | C-String lesen/schreiben (Nullterminiert) | string |
- offset: Byte-Position innerhalb der Struktur mit Basis Null.
- bytes: Anzahl zu lesender Bytes.
Hinweis
- Der Zugriff über die Objektgrenzen hinaus ist ohne deklarierte Exception möglich und wird nicht geprüft (schneller).
Siehe auch: Speicherverwaltung, Sram, Dump
Beispiele
dim a as byte dim s as string dim m as MemoryBlock m = New MemoryBlock(100) ' MemoryBlock erzeugen und zuweisen, Ggf. vorhandener Block wird freigeben if m <> nil then ' prüfen ob der Speicherblock alloziert wurde m.ByteValue(0)=7 ' Byte schreiben m.CString(1)="Ich bin ein String" ' String schreiben a=m.ByteValue(0) ' Byte lesen, Ergebnis: 7 s=m.CString(1) ' C-String lesen, Ergebnis: "Ich bin ein String" m=nil ' Objekt und belegten Speicher freigeben end if
Beispiele zur automatischen Freigabe
procedure test(m as MemoryBlock) 'm ist byVal und wird nach Verlassen zerstört endproc
procedure test() dim m as MemoryBlock 'm ist byVal und wird nach Verlassen zerstört endproc
procedure test(byRef m as MemoryBlock) 'm ist byRef und bleibt unangetastet endproc
dim m as MemoryBlock procedure test() 'm gehört nicht der Methode und bleibt unangetastet 'Grund: 'Sichtbarkeit von globalen Variablen in Methoden solange keine eigene 'Variable gleichen Namens in der Methode erzeugt wurde endproc
function test(byRef m as MemoryBlock) as MemoryBlock 'm ist byRef und bleibt unangetastet return m 'es wird eine Instanz von m erzeugt endfunc
function test() as MemoryBlock dim m as MemoryBlock return m 'der Speicherblock wird von "m" dereferenziert (losgelöst) und zurückgegeben endfunc