Speicherverletzung???
Verfasst: 20.12.2015 23:41
konzept:
die funktion erlaubt einen speicherbereich zu allokieren, in diesen speicherbereich per nummern, die zum beispiel per konstanten geregelt werden können, daten abzulegen und diese wieder bei bedarf auszulesen.
es gibt auch pendants für string und double. aber die grundfunktion ist dieser:
Beispiel:
Bei solchen Debug-Tests funktioniert das Ganze einwandfrei. Beim eigentlichen Projekt, das nun umfangreich ist, sind Objekte mittels Interfaces angelegt.
Der eine oder andere Objekt hat nun extra-Eigenschaften, die nun mittels dieser Lösung in die Objekt-Instanz hineingeladen werden können sollen, wenn sie benötigt werden.
Das Problem ist sowas von seltsam, das ich das gar nicht wirklich beschreiben kann. Derselbe Code läuft mal und mal nicht. Ab 4 Attributen gibt es immer Fehlermeldung, das der MemoryID nicht gültig sei. Vielleicht habe ich im Code ein fehler, aber ich kann keine entdecken. vielleicht übersehe ich was.
Ich kann mir darauf keinen Reim machen. Hat jemand eine Idee?
die funktion erlaubt einen speicherbereich zu allokieren, in diesen speicherbereich per nummern, die zum beispiel per konstanten geregelt werden können, daten abzulegen und diese wieder bei bedarf auszulesen.
es gibt auch pendants für string und double. aber die grundfunktion ist dieser:
Code: Alles auswählen
Procedure.l object_attr( *attr, name.a, value.l = #void_number )
Define m.l, sz.l, edit.a = #False, pos.l
; ***
If value = #void_number
If *attr
sz = MemorySize(*attr) / 5
; ***
For m = 0 To sz
If PeekA( *attr + (5 * m) + 0 ) = name
ProcedureReturn PeekL( *attr + (5 * m) + 1 )
; ***
Break
EndIf
Next
EndIf
Else
If *attr = 0
*tmp = AllocateMemory( 5 ) ; 1st Byte = Name, 2nd Long = Value
; ***
PokeA( *tmp + 0, name )
PokeL( *tmp + 1, value )
; ***
ProcedureReturn *tmp
Else
sz = MemorySize(*attr) / 5
; ***
For m = 0 To sz
If PeekA( *attr + (5 * m) + 0 ) = name
edit = #True
; ***
pos = m
; ***
Break
EndIf
Next
; ***
Select edit
Case #False ; Add an new entry
*tmp = AllocateMemory( MemorySize( *attr ) + 5 )
; ***
For m = 0 To MemorySize(*attr)
PokeA( *tmp + m, PeekA( *attr + m ) )
Next
; ***
m = MemorySize(*attr)
; ***
PokeA( *tmp + m + 0, name )
PokeL( *tmp + m + 1, value )
Case #True ; Edit an existing entry
*tmp = AllocateMemory( MemorySize( *attr ) )
; ***
For m = 0 To MemorySize(*attr)
PokeA( *tmp + m, PeekA( *attr + m ) )
Next
; ***
PokeL( *tmp + (pos * 5) + 1, value )
EndSelect
; ***
FreeMemory( *attr )
; ***
ProcedureReturn *tmp
EndIf
EndIf
EndProcedure
Code: Alles auswählen
Enumeration
#farbe
#typ
#position
EndEnumeration
*eigenschaften = object_attr( *eigenschaften, #farbe, RGB(123,88,219) )
*eigenschaften = object_attr( *eigenschaften, #typ, 20 )
*eigenschaften = object_attr( *eigenschaften, #position, 112 )
Debug object_attr( *eigenschaften, #farbe )
Debug object_attr( *eigenschaften, #typ )
Debug object_attr( *eigenschaften, #position )
Der eine oder andere Objekt hat nun extra-Eigenschaften, die nun mittels dieser Lösung in die Objekt-Instanz hineingeladen werden können sollen, wenn sie benötigt werden.
Das Problem ist sowas von seltsam, das ich das gar nicht wirklich beschreiben kann. Derselbe Code läuft mal und mal nicht. Ab 4 Attributen gibt es immer Fehlermeldung, das der MemoryID nicht gültig sei. Vielleicht habe ich im Code ein fehler, aber ich kann keine entdecken. vielleicht übersehe ich was.
Ich kann mir darauf keinen Reim machen. Hat jemand eine Idee?