Objekte/Types übergeben

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Ana

Betreff: Objekte/Types übergeben

BeitragFr, Apr 16, 2010 12:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo zusammen,

ich frage mich gerade ob es eine schönere möglichkeit gibt als Type über ein feld mit durchlaufender Nummer zu erreichen.
Zum Beispiel das ich keinen int übergebe und dann alles nochmal in jeder funktion durchlaufen muss sondern das objekt bzw einen pointer oder vergleichbares übergebe?

Bisher hab ich das immer so gemacht, aber es erscheint mir viel verschwendete leistung wenn man es auch anders lösen könnten.
t\ID ist ein Type feld von ype das fortlaufend nummerid sein soll damit jeder type zweifelsfrei daran identifiziert werden kann.

Code: [AUSKLAPPEN]

For t.ype = each ype
    if t\ID = gesuchter_Typ then
; tu irgendwas
     funktion_die_was_mit_dem_Type_macht(gesuchter_Typ)
   endif
next

Function funktion_die_was_mit_dem_Type_macht (x)
       For t.ype = each ype
           if t \ID= x then .....

Megamag

BeitragFr, Apr 16, 2010 13:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaube nicht, jedenfalls mache ich es auch immer so Wink
Mein DeviantArt Profil
Gewinner des BAC #136

NightPhoenix

BeitragFr, Apr 16, 2010 13:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich auch. Ich finde die Methode übrigens auch gar nicht mal so langsam. Da kannst du ruhig Types mit 50-80 Fields ausstatten und 200-1000 von denen erstellen. Geht immer noch ohne nennenswerten Zeitaufwand für den Computer. Weiß auch gar nicht ob das überhaupt mit unseren MilliSecs() messbar wäre.
Ich bin damit immer super ausgekommen. Solange es keine Verschachtelung von 2 Types dieser Sorte ist, denn da wird der Aufwand ja bekanntlich quadratisch. Wink

Eingeproggt

BeitragFr, Apr 16, 2010 14:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn ID einzigartig sein soll, warum dann nicht mit Object / Handle arbeiten?
Wenn es allerdings ein "zusammenfassender Typ" ist muss mans so machen wie du es hast.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

Silver_Knee

BeitragFr, Apr 16, 2010 15:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Evtl hilft dir mein Beitrag zum optimierungsthread. Sonst ist Handle und object das Höchste der Gefühle
https://www.blitzforum.de/foru...246#260246

Ana

BeitragFr, Apr 16, 2010 20:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die antworten Smile

Also ist es eigentlich sinnvoller nicht wie folgt

Code: [AUSKLAPPEN]

For t.ype = each ype
   if t\ID = gesuchrter_Type
     Funktion1(gesuchrter_Type)
     funktion2(gesuchrter_Type)
     funktion3(gesuchrter_Type)
  endif
next

function function1 (gesuchrter_Type)
For t.ype = each ype
   if t\ID = gesuchrter_Type
   [tue a]
   endif
next
end function

function function2 (gesuchrter_Type)
For t.ype = each ype
   if t\ID = gesuchrter_Type
   [tue b]
   endif
next
end function

function function3 (gesuchrter_Type)
For t.ype = each ype
   if t\ID = gesuchrter_Type
   [tue c]
   endif
next
end function


sondern so

Code: [AUSKLAPPEN]

For t.ype = each ype
   if t\ID = gesuchrter_Type
     [tue a]
     [tue b]
     [tue c]
  endif
next


das problem löst ohne die einzelnen prozeduren in functions auszulagern, wobei das ja eigentlich schöner und übersichtlicher ist. Aber den Funktionen kann ich das nicht gleich mitgeben welcher der gesuchte ist oder ginge das mit Object und handle so ganz schlau bin ich noch nicht aus den beiden geworden? die ersetzen nur das Field Id in den types?

Xeres

Moderator

BeitragFr, Apr 16, 2010 22:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Suche den Type 1x heraus und übergib die Instanz direkt an die Unterfunktionen, so dass die nicht mehr die Liste durchsuchen müssen.

BlitzBasic: [AUSKLAPPEN]
Type TTest
Field wert
End Type

For t.TTest = Each TTest
If t\ID = gesuchrter_Type
Funktion1(t)
;[...]
EndIf
Next

Function function1 (gesuchrter_Type.TTest)
gesuchrter_Type.wert = XYZ
End Function
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Ana

BeitragSa, Apr 17, 2010 14:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Also kann man doch objekte übergeben?

Sau gut Wink

Kann ich auch ein Array mit diesen pointern machen?

sowas wie
Code: [AUSKLAPPEN]

Dim Array (5,5)

For t.test = each test
   if t\id = gesucht then
       array (x,0) = t
       x = x + 1
  endif
next


Eine Nullreferenz kann man denen ja z.b nicht übergeben, aber dann sind sie ja bei der initalizierung int werte oder? Gibs dafür evenetulle was wie das # oder $ ?

Und gleich noch eine Frage kann ein Type so auch auf einen anderen verweisen?

Also eventuell so

Code: [AUSKLAPPEN]

Type erster
field referenz
end type

For r.zweiter = each zweiter
if r\id = gesucht then
t.erster = new erster
t\referenz = r
endif
next



Und zu guter letzt geht das auch bei B3D?
Da ist die Notation wenn ich das richtig sehe variable.typename\field ansonsten geht es nicht oder?
Danke

Xeres

Moderator

BeitragMo, Apr 19, 2010 19:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Kann ich auch ein Array mit diesen pointern machen?
Ja.
Code: [AUSKLAPPEN]
Dim Array.TTest(5,5)
Neben den Datentypen %, #, $ kann man auch Types verwenden.
Wenn kein Type für ein Feld erstellt oder verlinkt wurde, ist das Feld NULL.

Und gleich noch eine Frage kann ein Type so auch auf einen anderen verweisen?
Ja.
Code: [AUSKLAPPEN]
Type Terster
   Field meinzweiter.Tzweiter
End Type

Type Tzweiter
   Field wert%
End Type

Auch hier gilt: ist der Variable "meinzweiter" kein Eintrag zugewiesen, ist sie NULL.

Aber nicht vergessen: Type-Listen sind Global.
Wenn du für dein Array 36 Einträge erzeugst, sind sie Sowohl in der Liste als auch im Array verlinkt.
Wenn du mehr als einen Type in "meinzweiter" erstellst, ist der Ursprüngliche noch in der Liste, aber du kann nicht für eine Instanz von Terster zugehörige Tzweiter Instanzen durchgehen: Es gibt nur 2 Globale listen, in denen alle Instanzen liegen. Die dürfen nur beliebig oft verlinkt werden.
Nach der Deklaration verwende ich nur noch variable\field - der Type sollte sich aus dem Variablennamen ergeben.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Silver_Knee

BeitragDi, Apr 20, 2010 13:15
Antworten mit Zitat
Benutzer-Profile anzeigen
übrigens: um eine Liste von mehreren Objekten die zu einem Objekt gehören zu erstellen kan man bei fixer länge einen blitzarray:
BlitzBasic: [AUSKLAPPEN]
Field liste.TWasAnderes[15]

und bei variabler länge eine Bank mit Handle und Object verwenden:
BlitzBasic: [AUSKLAPPEN]
...
Field bankListe
...

Const INTEGER_LENGTH=4

;Objekt erstellen
t.ype=New ype
t\bankListe=CreateBank(0*INTEGER_LENGTH)

;Liste vergrößern
ResizeBank t\bankList,1*INTEGER_LENGTH

;Eintrag machen
position=0;0 bis BankSize(..)-INTEGER_LENGTH in INTEGER_LENGTH schritten
w.TWasAnderes=New TWasAnderes
PokeInt t\BankList,position*INTEGER_LENGTH

;Einträge Auslesen
For position=0 To BankSize(t\BankList)-INTEGER_LENGTH Step INTEGER_LENGTH
w=Object.TWasAnderes(PeekInt(t\BankList))
...
Next


ist aber eher kompliziert.

Ana

BeitragDi, Apr 20, 2010 19:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Jungs ihr seid großartig vielen dank Smile

Ana

BeitragMi, Apr 21, 2010 19:25
Antworten mit Zitat
Benutzer-Profile anzeigen
So nochmal eine weiter Frage, hier soll jede Figur "unendlich" viele Fähigkeiten bekommen.
Damit die nur ein Feld bekommt dachte ich mir, ich verweise jeweils auf die erste Fähigkeit und von jeder Fähigkeit auf die jeweils folgende. Damit das nun funktioniert wollte ich folgendes Konstrukt verwenden, da hab ich allerdings eine illegale type convertion

Code: [AUSKLAPPEN]
;Wird weiter oben im Funktionsrumpf übergeben: objekt.figur

If objekt.figur\naechste.faehigkeit = Null Then
            objekt.figur\naechste.faehigkeit = fae
         Else
            objekt2.faehigkeit = objekt.figur\naechste.faehigkeit
            While objekt2.faehigkeit\naechste <> Null ; Hier liegt das Problem soweit zumindest
               objekt2.faehigkeit = objekt2.faehigkeit\naechste
            Wend
            fae\naechste = objekt2.faehigkeit
         EndIf


Edit oh sorry gerade gemerkt das ist ein doppelpost ....

Xeres

Moderator

BeitragMi, Apr 21, 2010 20:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Damit dieser Ansatz funktioniert, wäre es für mehrere Figuren nötig, die entsprechenden Fähigkeiten zu duplizieren; ansonsten zerstört die neuste Figur automatisch die Reihenfolge des "nächste" Felds.
Ich würde da eher zu Silver_Knees Idee mit der Bank im letztem Beitrag greifen; die kann man wenn nötig vergrößern um mehr Platz für Fähigkeiten zu machen.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group