Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Weazle25
Anmeldungsdatum: 04.11.2007 Beiträge: 18 Wohnort: Stralsund (Mecklenburg-Vorpommern)
|
Verfasst am: 13.03.2009, 15:24 Titel: Eine Liste mit "Any Ptr" erstellen? |
|
|
Code: |
Dim Buffer As Any Ptr
Buffer = Callocate( 3 * Len(ULong), 1)
Dim Var1 As UInteger = 123456789
Dim Var2 As UShort = 12345
Dim Var3 As Byte = 123
Buffer[0] = pVar1 ' Fehler: Incomplete type, before '=' in 'Buffer[0] = @Var1'
Buffer[1] = pVar2 ' Fehler: Incomplete type, before '=' in 'Buffer[1] = @Var2'
Buffer[2] = pVar3 ' Fehler: Incomplete type, before '=' in 'Buffer[2] = @Var3'
Screen 17
Print Str( *Buffer[0] ) ' Fehler: Incomplete type, before ')' in 'Print Str( *Buffer[0] )'
Print Str( *Buffer[1] ) ' Fehler: Incomplete type, before ')' in 'Print Str( *Buffer[1] )'
Print Str( *Buffer[2] ) ' Fehler: Incomplete type, before ')' in 'Print Str( *Buffer[2] )'
PRINT "Drücken Sie 'q', um zu beenden"
Do
Sleep 1
LOOP UNTIL INKEY = "q"
|
Wie an dem Code zu sehen ist hole ich mir mit Callocate etwas Speicher für Buffer und will nun in Buffer eine Liste aus "Any Ptr" speichern.
Ich kann Buffer mit allen möglichen Datentypen deklarieren und dann auch alle möglichen Daten darin speichern.
Nur mit "Any Ptr" klappt das nicht (siehe Fehlermeldungen).
Kann es sein das "Any Ptr" nur eine Klausel ist und kein "echter" Datentyp?
Gruss
Weazle |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 13.03.2009, 16:06 Titel: |
|
|
hmm ne mit any ptr geht das so nicht.. du müsstest den Buffer mit einem selbstdefinierten datentyp initialisieren, den man auf die verschiedenen datentypen überlädt die er entgegen nehmen soll.... also eine type mit überladenen propertys... das ist schon wieder etwas mehr programmieraufwand.. (ginge in etwa richtung OOP) |
|
Nach oben |
|
 |
Weazle25
Anmeldungsdatum: 04.11.2007 Beiträge: 18 Wohnort: Stralsund (Mecklenburg-Vorpommern)
|
Verfasst am: 13.03.2009, 17:17 Titel: |
|
|
@Sebastian
Deine Idee funktioniert so leider nicht denn mein dynamisches Array (Buffer) soll ja in ein UDT eingebaut werden und da kann ich nur mit Allocate() bzw. Callocate() arbeiten.
@OneCypher
Du hast mich auf die rettende Idee gebracht.
Ich habe meinen "Any Ptr" einfach in ein UDT gepackt und siehe da es funktioniert.
Code: |
Type TPointer
Value As Any Ptr
End Type
Dim Buffer As TPointer Ptr
Buffer = Callocate( 3 * Len(TPointer), 1)
Dim Var1 As UInteger = 123456789
Dim Var2 As UShort = 12345
Dim Var3 As Byte = 123
Dim pVar1 As UInteger Ptr
Dim pVar2 As UShort Ptr
Dim pVar3 As Byte Ptr
Buffer[0].Value = @Var1
Buffer[1].Value = @Var2
Buffer[2].Value = @Var3
Screen 17
pVar1 = Buffer[0].Value
pVar2 = Buffer[1].Value
pVar3 = Buffer[2].Value
Print Str( *pVar1 )
Print Str( *pVar2 )
Print Str( *pVar3 )
PRINT "Druecken Sie 'q', um zu beenden"
Do
Sleep 1
LOOP UNTIL InKey = "q"
DeAllocate Buffer
|
Danke für Eure Hilfe.
Gruss
Weazle |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 13.03.2009, 19:10 Titel: |
|
|
Hi,
das kannst du wesentlich einfacher erreichen:
Code: | Dim Buffer(2) As Any Ptr
Dim Var1 As UInteger = 123456789
Dim Var2 As UShort = 12345
Dim Var3 As Byte = 123
Buffer(0) = @Var1
Buffer(1) = @Var2
Buffer(2) = @Var3
Screen 17
Print *(Cast(UInteger Ptr,Buffer(0)))
Print *(Cast(UShort Ptr,Buffer(1)))
Print *(Cast(Byte Ptr,Buffer(2)))
Print "Druecken Sie 'q', um zu beenden"
Do
Sleep 1
Loop Until InKey = "q" |
_________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
Weazle25
Anmeldungsdatum: 04.11.2007 Beiträge: 18 Wohnort: Stralsund (Mecklenburg-Vorpommern)
|
Verfasst am: 13.03.2009, 20:19 Titel: |
|
|
@volta
Ja aber es funktioniert nicht wenn sich "Buffer" in einem UDT befindet.
Hier ein funktionierendes Beispiel:
Code: |
Type TPointer
Value As Any Ptr
End Type
Type TBuffer
Buffer As TPointer Ptr
Declare Constructor()
Declare Destructor()
End Type
Constructor TBuffer()
This.Buffer = Callocate( 3 * Len(TPointer), 1 )
End Constructor
Destructor TBuffer()
DeAllocate This.Buffer
End Destructor
Dim Buffer As TBuffer Ptr = New TBuffer
Dim Var1 As UInteger = 123456789
Dim Var2 As UShort = 12345
Dim Var3 As Byte = 123
Dim pVar1 As UInteger Ptr
Dim pVar2 As UShort Ptr
Dim pVar3 As Byte Ptr
Buffer->Buffer[0].Value = @Var1
Buffer->Buffer[1].Value = @Var2
Buffer->Buffer[2].Value = @Var3
Screen 17
pVar1 = Buffer->Buffer[0].Value
pVar2 = Buffer->Buffer[1].Value
pVar3 = Buffer->Buffer[2].Value
Print Str( *pVar1 )
Print Str( *pVar2 )
Print Str( *pVar3 )
PRINT "Druecken Sie 'q', um zu beenden"
Do
Sleep 1
LOOP UNTIL InKey = "q"
Delete Buffer
|
Da der Code jetzt fuktioniert wäre damit auch das Problem gelöst.
Danke für die Hilfe
Gruss
Weazle |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 13.03.2009, 20:39 Titel: |
|
|
Weazle25 hat Folgendes geschrieben: | @volta
Ja aber es funktioniert nicht wenn sich "Buffer" in einem UDT befindet. |
Es gibt keinen Grund warum es in einem UDT nicht ebenso funktioniert?
Aber OK, welche Lösung du anwendest ist natürlich deine Sache. _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 16.03.2009, 11:21 Titel: |
|
|
Das kann aber eleganter gehen, wenn ich mir vorstelle das man eine property in eine type einbaut die für die jeweiligen datentypen überladen wird...
vor allem muss man dann nicht explizit "rumCASTen" ... dann wäre es so universell wie man die property überlädt.. der rückgabewert der property kann man auch so gestalten das sie direkt den richtigen datentyp zurückliefert.... |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 16.03.2009, 12:00 Titel: |
|
|
So meinte ich das:
Code: |
type numvariant
declare property value as uinteger
declare property value (vp as uinteger ptr)
declare property value overload (vp as ushort ptr)
declare property value overload (vp as ubyte ptr)
content_ptr as any ptr
ptype as ubyte
end type
property numvariant.value as uinteger
select case ptype
case 1
return *CAST(uinteger ptr,content_ptr)
case 2
return *CAST(ushort ptr,content_ptr)
case 3
return *CAST(ubyte ptr,content_ptr)
end select
end property
property numvariant.value(vp as uinteger ptr)
ptype = 1
content_ptr = vp
end property
property numvariant.value(vp as ushort ptr)
ptype = 2
content_ptr = vp
end property
property numvariant.value(vp as ubyte ptr)
ptype = 3
content_ptr = vp
end property
cls
DIM AS UBYTE A = 123
DIM AS USHORT B = 12345
DIM AS UINTEGER C = 1234567
dim d(1 to 3) as numvariant
d(1).value = @A
d(2).value = @B
d(3).value = @C
print d(1).value
print d(2).value
print d(3).value
sleep
|
die TYPE "numvariant" sollte sowas sein wie "numeric-variant" .. man kann das natürlich beliebig erweitern! man muss nur darauf achten das man als "container" für den rückgabewert einen möglichst großen datentyp verwendet der alle bereiche der daten zurückgeben kann auf die die gespeicherten pointer zeigen... |
|
Nach oben |
|
 |
|