Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Muttonhead

Anmeldungsdatum: 26.08.2008 Beiträge: 565 Wohnort: Jüterbog
|
Verfasst am: 21.06.2009, 18:00 Titel: externer Zugriff auf die Einträge einer "Klasse" |
|
|
Code: |
declare sub ExterneSub(ins as integer ptr)
'****************************
type K
entryA as integer
entryB as integer
declare constructor()
declare sub methode
end type
constructor K ()
end constructor
sub K.methode
dim as integer ptr instanz=@entryA'<--geht das auch anders?
ExterneSub (instanz)
end sub
'****************************
sub ExterneSub(ins as integer ptr)
dim as K ptr instanz=cast(K ptr,ins)
print @(instanz->entryA)
'print @(instanz->entryB)
end sub
dim as K ptr myK
myK=new K
myK->methode
print myK
delete myK
sleep
end
|
Ich möchte einer Sub(die auch noch innerhalb einer Methode aufgerufen wird) den
Zugriff auf die Einträge der Instanz von K ermöglichen
Will aber auch nicht alle Einträge als Parameter übergeben, darum dachte ich statt
dessen an einen Zeiger. Doch wie komme ich an den Zeiger der aktuellen Instanz innerhalb
der Methode heran. Das es gleichzeitig die Addresse des ersten Eintrages ist, war naheliegend.
Aber gibts auch noch nen anderen Weg?
Mutton |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 22.06.2009, 03:36 Titel: |
|
|
ja
Code: |
type bla
a as uinteger
b as uinteger
foo as sub()
end type
sub bla.foo()
print this.a
end sub
|
mit "this" kannst du auf das type zugreifen, in welchem sich die funktion befindet.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
Cherry
Anmeldungsdatum: 20.06.2007 Beiträge: 249
|
Verfasst am: 22.06.2009, 17:32 Titel: |
|
|
...der Pointer wäre also @This.
Beim Zugriff auf Elemente kann man sich das This aber sparen, im obigen Beispiel würde "Print a" es auch tun. |
|
Nach oben |
|
 |
Muttonhead

Anmeldungsdatum: 26.08.2008 Beiträge: 565 Wohnort: Jüterbog
|
Verfasst am: 22.06.2009, 20:15 Titel: |
|
|
Code: | declare sub ExterneSub(ins as integer ptr)
'****************************
type K
entryA as integer
entryB as integer
declare constructor()
declare sub methode
end type
constructor K ()
entryA=1234
end constructor
sub K.methode
dim as integer ptr instanz=cast(integer ptr,@this)
ExterneSub (instanz)
end sub
'****************************
sub ExterneSub(ins as integer ptr)
dim as k ptr instanz=cast(k ptr,ins)
print instanz->entryA
end sub
dim as K ptr myK
myK=new K
myK->methode
delete myK
sleep
end |
Super!!! Das hat ja prima geklappt.
Ich bedanke mich bei Euch beiden
Mutton |
|
Nach oben |
|
 |
Cherry
Anmeldungsdatum: 20.06.2007 Beiträge: 249
|
Verfasst am: 22.06.2009, 20:50 Titel: |
|
|
Wieso nicht direkt "Sub ExterneSub(ins As k Ptr)"? |
|
Nach oben |
|
 |
Muttonhead

Anmeldungsdatum: 26.08.2008 Beiträge: 565 Wohnort: Jüterbog
|
Verfasst am: 22.06.2009, 21:12 Titel: |
|
|
Ich glaub das Problem nennt sich hier "Forward Referencing" oder so.
Davon hab ich (noch)keine Ahnung
in der Methode rufe ich die externe Sub auf, die noch garnicht deklariert ist.
Also schnell mal oben deklarieren...
Na super, der Parameter der externen Sub ist wiederum von Typ her ein UDT, das zum Zeitpunkt der Deklaration auch noch nicht definiert ist.
Da beisst sich die Katze in den Schwanz.
Darum das derbe Casting und der Schritt über einen Integer Pointer.
Das geht bestimmt auch noch eleganter
Mutton |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 22.06.2009, 21:26 Titel: |
|
|
Code: |
type _bla as bla '<---- forward ref
declare sub foo(param as _bla)
type bla
a as uinteger
end type
sub foo(param as _bla)
print param.a
end sub
|
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
Muttonhead

Anmeldungsdatum: 26.08.2008 Beiträge: 565 Wohnort: Jüterbog
|
Verfasst am: 22.06.2009, 21:52 Titel: |
|
|
Wie jetzt...
Eine _Wildcard ?
Ist ja raffiniert!!!
Komme ja ausm Bedanken nicht mehr raus @TPM
Mutton |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 22.06.2009, 23:32 Titel: |
|
|
naja .. eher eine art alias
als aliasname kannst du wählen was du willst ... ich nutze dafür nur gerne ein vorrangestelltes _ um mir selbst bewust zu sein, das es sich hierbei um eine forwardreferenzierung handelt .. kannst aber auch sonstwie nennen.
MG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 23.06.2009, 08:55 Titel: |
|
|
Machts euch doch noch einfach komplizierter:
Code: |
TYPE _bla as bla
declare sub original(param AS _bla ptr)
declare sub foo(param AS _bla ptr)
declare sub bar(param AS _bla ptr)
TYPE bla
titel AS string = "Hallo Welt!"
subpointer as sub(param as _bla ptr) = @original
declare sub methode ()
END TYPE
sub bla.methode()
subpointer(@this)
end sub
SUB original(param as _bla ptr)
PRINT "Normal: " & param->titel
end sub
SUB foo(param AS _bla ptr)
PRINT "Klein: " & lcase(param->titel)
END SUB
SUB bar(param AS _bla ptr)
PRINT "Gross: " & ucase(param->titel)
END SUB
dim b1 as bla
b1.methode
b1.subpointer = @foo
b1.methode
b1.subpointer = @bar
b1.methode
sleep
|
Ich mag dieses Vorgehen indem man Funktionen "austauschen" kann XD .. sorry fürs kurze offtopic  |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
|
Nach oben |
|
 |
|