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:

externer Zugriff auf die Einträge einer "Klasse"

 
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
Muttonhead



Anmeldungsdatum: 26.08.2008
Beiträge: 565
Wohnort: Jüterbog

BeitragVerfasst am: 21.06.2009, 18:00    Titel: externer Zugriff auf die Einträge einer "Klasse" Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 22.06.2009, 03:36    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 20.06.2007
Beiträge: 249

BeitragVerfasst am: 22.06.2009, 17:32    Titel: Antworten mit Zitat

...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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Muttonhead



Anmeldungsdatum: 26.08.2008
Beiträge: 565
Wohnort: Jüterbog

BeitragVerfasst am: 22.06.2009, 20:15    Titel: Antworten mit Zitat

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!!! Daumen rauf! Das hat ja prima geklappt.
Ich bedanke mich bei Euch beiden lächeln

Mutton
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Cherry



Anmeldungsdatum: 20.06.2007
Beiträge: 249

BeitragVerfasst am: 22.06.2009, 20:50    Titel: Antworten mit Zitat

Wieso nicht direkt "Sub ExterneSub(ins As k Ptr)"?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Muttonhead



Anmeldungsdatum: 26.08.2008
Beiträge: 565
Wohnort: Jüterbog

BeitragVerfasst am: 22.06.2009, 21:12    Titel: Antworten mit Zitat

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 grinsen

Mutton
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 22.06.2009, 21:26    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 26.08.2008
Beiträge: 565
Wohnort: Jüterbog

BeitragVerfasst am: 22.06.2009, 21:52    Titel: Antworten mit Zitat

Wie jetzt...
Eine _Wildcard ?
Ist ja raffiniert!!!

Komme ja ausm Bedanken nicht mehr raus @TPM
Mutton
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 22.06.2009, 23:32    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 23.06.2009, 08:55    Titel: Antworten mit Zitat

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 peinlich
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ThePuppetMaster



Anmeldungsdatum: 18.02.2007
Beiträge: 1839
Wohnort: [JN58JR]

BeitragVerfasst am: 23.06.2009, 09:04    Titel: Antworten mit Zitat

@OneCypher ein ähnliches verfahren findet bei der pluginprogrammierung verwendung -> http://www.freebasic-portal.de/index.php?s=tutorials&id=55&seite=1


MfG
TPM
_________________
[ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ]
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