Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Eine Liste mit "Any Ptr" erstellen?

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Weazle25



Anmeldungsdatum: 04.11.2007
Beiträge: 18
Wohnort: Stralsund (Mecklenburg-Vorpommern)

BeitragVerfasst am: 13.03.2009, 15:24    Titel: Eine Liste mit "Any Ptr" erstellen? Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 13.03.2009, 15:30    Titel: Antworten mit Zitat

Hallo,

so könnte man das z.B. machen:
Code:
Dim Buffer(1 to 3) As Any Ptr

Dim As UByte A = 123
Dim As UShort B = 12345
Dim As UInteger C = 1234567

Buffer(1) = @A
Buffer(2) = @B
Buffer(3) = @C

PRINT *CAST(UByte Ptr, Buffer(1))
PRINT *CAST(UShort Ptr, Buffer(2))
PRINT *CAST(UInteger Ptr, Buffer(3))

SLEEP

Viele Grüße!
Sebastian
_________________

Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 13.03.2009, 16:06    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Weazle25



Anmeldungsdatum: 04.11.2007
Beiträge: 18
Wohnort: Stralsund (Mecklenburg-Vorpommern)

BeitragVerfasst am: 13.03.2009, 17:17    Titel: Antworten mit Zitat

@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
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 13.03.2009, 19:10    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Weazle25



Anmeldungsdatum: 04.11.2007
Beiträge: 18
Wohnort: Stralsund (Mecklenburg-Vorpommern)

BeitragVerfasst am: 13.03.2009, 20:19    Titel: Antworten mit Zitat

@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
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 13.03.2009, 20:39    Titel: Antworten mit Zitat

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? durchgeknallt

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 16.03.2009, 11:21    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 16.03.2009, 12:00    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz