Array
Übersicht

SevenBetreff: Array |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Abend.
Ich brauche eine Array für eine map, die nicht Konstante Werte zulässt. Im Grunde war das auch schon meine Frage. Dim ![]() lassen leider nur Konstante Werte zu und ich dagegen will, dass man die Werte im Programm zwischendurch ändern kann. |
||
![]() |
Tankbuster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du meinst eine erweiterbare Liste?
Dim(x,y) willst du zu Dim(x,y+z) "erweitern" ? Dafür empfehle ich dir Types. Arrays haben nunmal vorgegebene Größen. Types sind da viel flexibler, da man immer wieder einen Listen-Eintrag entfernen oder hinzufügen kann. Type ![]() |
||
Twitter
Download Jewel Snake! Windows|Android |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Alternativ wäre das mit einer Bank und ein paar selbst geschriebenen Funktionen zu lösen. | ||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
Hubsi |
![]() Antworten mit Zitat ![]() |
---|---|---|
Kannst Du nicht das Array einfach von vornherein so groß dimensionieren wie es maximal benötigt wird? Du kannst ein Array auch neu dimensionieren, dabei gehen allerdings die Werte darin verloren. Wenn das nicht akzeptabel für Dein Projekt ist würde ich auf eine Bank ausweichen. Diese läßt sich in der Größe verlustfrei verändern und die Kollisionskontrolle (da Du von einer Map sprachst unterstelle ich das jetzt einfach mal) ist noch relativ simpel zu gestalten. Types sind in meinen Augen für eine Map das letzte Mittel.
Interessant für mich wäre zu wissen warum die Map im laufenden Spiel ihre Größe ändert? ![]() |
||
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn... |
Inso |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Oder gar eine 3. Dimension erhält O.o
Ich versteh das Problem, welches du mit Dim hast, nicht so ganz. |
||
Seven |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Wieso eine 3. Dimension? Davon sprach ich doch gar nicht.
Zu meinem Vorhaben; Ich will einfach einen Mapeditor im Spiel haben und der soll möglichst flexibel sein:) Eine Array von vornherein möglichst groß zu gestalten und dann zu ändern ist ein interessanter Weg ![]() Ich denke ich nehme aber doch lieber eine bank. |
||
Inso |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Seven hat Folgendes geschrieben: Wieso eine 3. Dimension? Davon sprach ich doch gar nicht.
Zu meinem Vorhaben; Ich will einfach einen Mapeditor im Spiel haben und der soll möglichst flexibel sein:) Eine Array von vornherein möglichst groß zu gestalten und dann zu ändern ist ein interessanter Weg ![]() Ich denke ich nehme aber doch lieber eine bank. Wie wärs mit Dim map(mapxgroesse,mapygroesse) und beim erstellen der map die beiden werte vom benutzer verlangen. Ich versteh nicht so recht wo dein Problem liegt. Aber naja wenn du jetzt ne Lösung hast ist ja alles gut..^^ |
||
Seven |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Weil die Dim Wert Konstant sein müssen. Im nachhinein festlegen
ist nicht:) Deswegen auch mein Problem. |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nein, dass stimmt nicht. BlitzArrays müssen Konstant sein. Was du mit Dim erstellst, kannst du ihm nachhinein vergrößern und verkleinern.
BlitzBasic: [AUSKLAPPEN] Dim Array(0,0) ;Zwei Dimensionen festlegen, später in einer Funktion vergrößern |
||
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
Seven |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ahhh, danke ![]() Dann muss ich auch keine großen Änderungen vornehmen. |
||
BBPro2 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
du könntest dir auch eine art arraylist implementieren.
funktioniert folgendermaßen: du erstellst ein array mit x werten (z.b. 32) wenn es irgendwann voll ist (33. wert soll geschrieben werden) machst du ein neues, doppelt so großes array (64) und kopierst die alten 32 werte an die stellen 1-32 und den neuen 33. wert an die stelle 33. das alte gibst du frei. wenn dieses array voll ist (65. wert soll geschrieben werden) machst du das erneut. ist eine möglichkeit dynamische arrays zu benutzen mit einer venünftigen armotisierten laufzeit. es gibt andere, aber nicht unbedingt bessere alternativen. der punkt ist für arrays muss der computer vorher wissen wie groß sie sein sollen, da sie im speicher an einem stück hängen. das ist in jeder programmiersprache und auf jedem system so und das lässt sich auch nicht umgehen. alternativen wären halt z.b. types (stichwort linked list) welche aber andere nachteile mit sich bringen |
||
Seven |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Types bei bekannten Größen der Liste halte ich für eine Verschwendung.
Wozu verdoppeln? Ansonsten klingt das nach der Idee von Xeres. Gut das du das kopieren der alten Liste erwähnst. Das hätte ich vorerst vergessen. |
||
BBPro2 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
types bei bekannten größen sind verschwendung, da hast du vollkommen recht. der zugriff
auf arrays ist wesentlich schneller und wenn man die größe kennt spricht nichts gegen arrays. im grunde ist das auch die idee von xeres nur detaillierter beschrieben (verdoppeln, kopieren), auch da liegst du vollkommen richtig. ich bin gerade zu faul zu beweisen warum man verdoppeln sollte und nicht z.b. um 1 erhöhen oder 10 erhöhen oder sonstwas grundsätzlich ist es aber so dass du vernünftige amortisierte (d.h. gemittelte) laufzeiten bekommst wenn du auf das verdopplungsschema zurückggreifst statt auf ein anderes. funktionieren würde das zwar auch aber dann wären die laufzeiten deutlich schlechter, das lässt sich mathematisch beweisen. hoffe du glaubst mir das einfach mal oder wenn nicht musst du google bemühen ![]() |
||
Seven |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Erlich? Das klingt interessant ![]() Ist das auch der Grund, wieso B3D lieber texturen im 2^X Format haben will? Ansonsten werde ich das nach googlen ![]() EDIT: Wonach genau soll ich googlen? xD |
||
![]() |
Tankbuster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Vielleicht nach "Warum quadratische Texturen" oder sowas.
Es wird sicher an der Prozessorarchitektur der GPU, oder irgendwie sowas liegen. Die Grafikkarten heute sind ja alle darauf ausgelegt, sehr schnell zu sein, und irgendjemand hat dann sichermal einen Algo aufgestellt, der quadratische mit 2^n-Kantenlänge Texturen unglaublich schnell berechnen kann, auch wenn diese größer sind, als nicht-quadratische. Weil alle Grafikkarten-Hersteller natürlich nach immer mehr Speed und Performance suchen, haben sie den Algorythmus übernommen. Ich habe Google nicht benutzt, weil ich da auch nichts konkretes auf anhieb gefunden habe. Aber es kann ja kein Zufall sein, dass die Grafikkarte bei einer Kantenlänge von 1111,11111111,usw... gut klar kommt. Fazit: Dahinter steckt höhere Mathematik ![]() |
||
Twitter
Download Jewel Snake! Windows|Android |
BBPro2 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
hallo,
also zunächst zu den arrays: nein, das hat nichts mit der texturen-problematik etc. zu tun, das sind 2 paar schuhe. man muss hier auch nicht unbedingt 2er potenzen verwenden um eine gute laufzeit zu erreichen sondern einfach irgendwelche potenzen. es reicht auch die arrays zu verdreifachen, vervierfachen oder auch zu 1.253-fachen - hauptsache man verwendet eine exponentialfunktion. in der praxis funktioniert verdoppeln ziemlich gut, daher ist das der standard für diese implementierung. kurz angeschnitten warum man eine exponentialfunktion verwenden sollte: frühstens alle n schritte (n elemente eingefügt, nie welche gelöscht) muss man das array neu erstellen und die alten werte kopieren. das kopieren dauert dann exakt 2*n "einheiten" (man hatte z.b. ein array mit 8 einträgen, fügt 8 weitere hinzu - jetzt muss man 16 = 2*8 elemente in das neue (32 einheiten große) array kopieren) das führt dazu dass man in n-1 schritten eine laufzeit von 1 = konstant hat und in einem schritt eine laufzeit von 2n = linear hat. amortisiert (~ on average) erhält man eine konstante laufzeit pro zugriff unabhängig von der größe der späteren liste (der schritt ist jetzt etwas komplizierter und ich lasse ihn daher auch mal weg, das würde den rahmen sprengen) würde man das array beispielsweise immer um 5 weitere elemente vergrößen hätte man eine schlechtere laufzeit (je größer die liste desto schlechter die durchschnittliche laufzeit) soviel zu dem thema, hoffe es hilft/war wenigstens halbwegs interessant. was die texturen angeht: (kann nur von opengl reden, direct x dürfte aber analog sein) viele grafikkarten unterstützen nur 2er potenzen bei texturen da der algorithmus darauf spezialisiert ist (wie tankbuster richtig vermutete) diese grafikkarten können also nur solche texturen auf der hardwareebene verarbeiten. das ist im übrigen immer genau dann der fall wenn die erweiterung GL_ARB_texture_non_power_of_two nicht unterstützt wird. im falle andere seitenlängen springt die grafikkarte meistens in den software-modus und die grafikkarte wird komplett von der cpu simuliert. das ist performancetechnisch absolut fatal und sollte daher unter allen umständen vermieden werden (abgesehen davon dass es in manchen fällen nicht nur bei einem performanceverlust bleibt sondern sogar zu abstürzen kommen kann) immer wieder finden sich personen die sich damit rühmen auf diese 2er potenz regel "zu scheißen" weil es ja auch anders funktioniert. das ist aber schlichtweg unwissenheit und ignoranz. gerade neuere grafikkarten sind um einen unbeschreiblichen faktor schneller als die entsprechende cpu-emulation. |
||
Seven |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke für die Mühe,
aber ich denke den ersten Teil habe ich nicht ganz verstanden. Zitat: (je größer die liste desto schlechter die durchschnittliche laufzeit)
Wenn wir mal annehmen ich habe eine Array, die 512 x 512 groß ist und ich würde 10 weitere Elemente brauchen, dann würde eine Verdopplung zu deutlich langsameren Laufzeiten führen, oder nicht? Und wenn ich das ganze nicht verdoppeln will, dann könnte ich ja einfach das 1,01953125 fache von 512 nehmen. So käme ich ebenfalls auf 522, nur dass 512 * 1,01953125 länger brauchen würde, als 512 + 10. |
||
![]() |
Dottakopf |
![]() Antworten mit Zitat ![]() |
---|---|---|
Meine Idee:
Mach ein Auswahlmenü im Editor bei dem der Benutzer selbst definiert wie groß die Map wird. Das sollte man ja schon wissen wenn man etwas plant... nun brauchst du nur noch eine Funktion die beim speichern der map ermittelt wie groß deine Map wirklich ist. Die größe schreibst du mit in deine Map Datei rein. Beim lader der Map dimensionierst du dann einfach ein neues Map Arry mit diesen größen. Das wäre eine simple möglichkeit ohne größeren Aufwand. Gruß Dottakopf |
||
Rechtschreibfehler gelten der allgemeinen Belustigung! |
BBPro2 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo,
wenn dein Array 512 Elemente groß ist (ich bleib jetzt mal bei eindimensionalen Arrays da es einfacher zu erklären ist und es sich für n-dimensionale Arrays analog verhält) und du in den kommenden n zyklen 20 elemente hinzufügen würdest hättest du entweder den Aufwand a) Verdoppeln - wir erstellen ein 1024er Array - wir kopieren 512 Elemente in das 1024er Array - wir löschen das 512er Array - wir fügen ein Element dem 1024er Array hinzu (20 mal) insgesamt also 534 elementare Befehle b) um 10 erhöhen - wir erstellen ein 522er Array - kopieren 512 Elemente - löschen das alte - fügen 10x ein Element hinzu - erstellen ein 532er Array - usw. insgesamt hätten wir hier 1058 elementare Befehle würdest du in den nächsten n Zyklen nur 10 Elemente hinzufügen und nie wieder mehr einfügen (weil 522 dein Maximum ist) hätten beide Vorgänge die gleiche Laufzeit, nur dass das "Verdoppeln" mehr Speicherplatz verbrauchen würde (mit der Laufzeit hat das nichts zu tun) Arrays haben - egal wie groß sie sind - immer die gleiche Zugriffszeit. Der Punkt ist aber dass du nicht WEIßT ob du in den nächsten n Zyklen 10, 20 , 0, n oder sonstwieviele Elemente hinzufügst. Daher ist nur die Betrachtung des Falls "was ist wenn ich 10 hinzufüge" schon vom Ansatz her falsch - das ist nur einer und vielen Fällen und interessiert uns kaum. zur 1,01953125: 1) funktioniert wie gesagt * 2 in der Praxis ganz gut, für 1,01953125 gilt das normalerweise nicht, da es zu langsam ansteigt 2) theoretisch funktioniert aber auch 1,01953125 besser als "+ 10" du musst dabei beachten, dass ein Array nicht einfach "512" groß ist - es ist mal so groß, mal so groß und für nur endlich viele Werte ist "+10" schneller (alle Werte unter 512) für einen Wert verhalten sie sich gleich (512) und für alle Werte größer als 512 ist * 1,01953125 schneller. das ist eben die Eigenschaft von Exponentialfunktionen. Egal wie klein du die Potenz wählst - irgendwann steigt sie schneller als jede andere Funktion |
||
Seven |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ahh, jetzt verstehe ich es. Vielen Dank für deine Mühe ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group