Type alternative. Dim richtig nutzen. von ??? |
Hi..... Types sind eine tolle sache. Ich selber stehe aber mehr auf altmodische Dims. Daher hir ein Code der Types zwar nicht überflüssig macht. Aber für Speed entusiasten genau das richtige. Entstammt dem 3D Space Game Tut aus dem Project Forum. [code:1:2dfa09a5dc] Graphics 800,600,16,2 SetBuffer BackBuffer() AppTitle "Indirecter zugriff (C) TFT für Basic" Global anzobj=100 Dim OBJ(anzobj) ; Handler Dim OBJi(anzobj) ; Indexliste nach Sort Dim OBJx#(anzobj) ; Orginal x Pos Dim OBJy#(anzobj) ; Orginal y Pos Dim OBJz#(anzobj) ; Orginal z Pos Dim OBJs$(anzobj) ; Daten String zum Objact(X) Dim OBJds#(anzobj) ; Dammy feld zum sortieren For i=0 To anzobj OBJ(i)=CreateImage(10,10,1) ; Object erzeugen, damit auch BB2D benutzer es nutzen können. OBJx(i)=500.0-Rnd(1000.0) ; Zufals x OBJy(i)=500.0-Rnd(1000.0) ; Zufals y OBJz(i)=500.0-Rnd(1000.0) ; Zufals z OBJs(i)="Daten String........"+Str$(i) ; Daten String Next anz=10 Text 10,10,"Das Feld OBJ() so wie es angelegt ist" Text 10,25," H X Y Z D" For i=0 To anz i1=40+i*12 Text 10,i1,"OBJ("+Str$(i)+")" Text 90,i1,Str$(obj(i)) Text 220,i1,Str$(Int(objx(i))) Text 270,i1,Str$(Int(objy(i))) Text 320,i1,Str$(Int(objz(i))) Text 370,i1,objs(i) Next ; Sortier Feld Laden For i=0 To anzobj OBJds(i)=OBJz(i) ; Zu sortierender Wert OBJi(i)=i ; Index Next a=quicksort(0,anzobj) ; Sortieren Text 10,175,"Das Feld OBJ() nach Z sortiert" look(190,anz) ; Sortier Feld Laden For i=0 To anzobj OBJds(i)=OBJx(i) ; Zu sortierender Wert OBJi(i)=i ; Index Next a=quicksort(0,anzobj) ; Sortieren Text 10,330,"Das Feld OBJ() nach X sortiert" look(345,anz) Flip Repeat Until KeyHit(1) End Function look(i3,i2) Local i,i1 For i=0 To i2 i1=i3+i*12 Text 10,i1,"OBJ("+Str$(obji(i))+")" Text 90,i1,Str$(obj(obji(i))) Text 220,i1,Str$(Int(objx(obji(i)))) Text 270,i1,Str$(Int(objy(obji(i)))) Text 320,i1,Str$(Int(objz(obji(i)))) Text 370,i1,objs(obji(i)) Next End Function Function quicksort(l,r) p=l q=r x#=objds((l+r)/2) Repeat While objds(p)<x p=p+1 Wend While x<objds(q) q=q-1 Wend If p>q Then Exit h#=objds(q) objds(q)=objds(p) objds(p)=h# h1=obji(q) obji(q)=obji(p) obji(p)=h1 p=p+1 q=q-1 If q<0 Then Exit Forever If l<q Then a=quicksort(l,q) If p<r Then a=quicksort(p,r) Return True End Function [/code:1:2dfa09a5dc] |
von ??? |
Erstens das, und zweitens ist Dim beim Löschen, Hinzufügen, Verschieben und Bearbeiten seiner Felder längst nicht so komfortabel wie Types. Ich hab nix gegen Dim, habe mich selbst auch lange Zeit darauf verlassen, aber letztendlich sind Types doch ein ziemlich mächtiges "Instrument", dessen Vorteile man insbesondere dann zu schätzen beginnt, wenn man an Programmen schreibt, wo man viele unabhängige, eigenständige, an ihrer Anzahl variierende Objekte "leben" lassen muss. Dims haben dann natürlich einen größeren Einsatzbereich als Types, wenn es um feste Gegenstände, Eigenschaften usw. geht: Du wirst z.B. niemals die einzelnen Zahlen auf einem Glücksrad durch Types definieren. Okay, da lässt sich dann wieder viel über BlitzArrays diskutieren, aber das Prinzip ist ja jetzt klar. |
von ??? |
hi, ich verwende immer beides - types und dims. kommt halt immer auf das einsatzebiet an. aber bei großen datenmengen (auch wenn sie flexibel sind) sind tyspes ungeeignet, da 1. zu langsam 2. zu speicherverbrauchend (1 MB in Dims hat glaub ich 1,4 MB in Types oder so - wegen dem zeiger auf vorheriges objekt, auf nächstes objekt, die definition des typs, usw.) cu |
von ??? |
Hi..... Types an sich sind nicht wirklich schlecht. Aber wenn du sie Sortieren must. Bis du ziemlich am ende. Vom auffinden der Position mal ganz zu schweigen. Gut geeignet sind sie für statische zustände wo immer vom ersten bis zum letzten ellement durch gearbeitet wird. Aber wie BBPro schon sagt. Es kommt auf das einsatzt gebiet an. |
von ??? |
Hi..... diese forgehensweise ist mir nicht bekannt gewesen. OK..... und wie ist es wenn du wissen wilst welches alien in z Position am nächsten ist. Wie sortierst du dann das Array? Dann sortierst du auch nur die Handler. Doch.... echt cool. Der Befehl Handler() ist mir bis jetzt noch nicht untergekommen. Wie lange gibt es dehn denn schon? Also was die Flexibilität angeht. Neme ich alles zurück. Bleibt nur noch das geschwindigkeists Argument. :lol: :lol: |
von ??? |
Jups, genau das ist der Vorteil von Types in Verbindung mit dem Befehl "Handle(...)" bzw. "Object" - wenn du hier was sortieren willst, musst du nur eine einzige Zahl, den Fake-Pointer, verschieben, anstatt alle Werte erst zwischenzuspeichern und wilde Vertauschungen vorzunehmen. "Handle" ist ein undokumentierter Befehl, genau wie "Object". Seit wann es den gibt, weiß ich nicht. |
von ??? |
hi, ich weiß zwar auch nicht seit wann es die befehle gibt - sie sinda llerdings mit sonem koischen programm entdeckt worden, welches die runtime.dll und ide.exe nach befehlen durchsucht. handle und object sind undokumentierte befehle, d.h. vermutlich nur entwicklerfunktionen für mark und die ganzen anderen funktionen. es kann gut sein dass die befehle irgendwann nicht mehr in blitzbasic vorhanden sein werden - aber das glaube ich weniger, da sowieso fast nur noch blitzmax entwickelt wird. cu |