array_sort non esiste !?!

Scripts e snippets scritti in GameMaker Language (gml)
Rispondi
Avatar utente
boxbuilder
Membro
Messaggi: 158
Iscritto il: 25/06/2015, 10:37
Specialità: programmatore
Uso: GM:Studio 1.4 HTML5
Contatta:

array_sort non esiste !?!

Messaggio da boxbuilder »

ripubblico qua sotto un post erroneamente pubblicato nella categoria "teoria"

Ciao a tutti, mi sono accorto che in GML i metodi degli array sono pochissimi. Dato che sono un programmatore pigro che usa array per qualsiasi cosa, anche la più stupida ho iniziato a ricostruirmi un po' di quei metodi che per me sono fondamentali. Inizio col scrivere qui il mio bubble sort. spero che possa essere utile agli utenti del forum:

Codice: Seleziona tutto

///bubble sort GML
//array_sort(myArray, sortingMode ["ascend", "descend"])

var myArray = argument[0];
var sortingMode = "ascend";//argument[1];

if(argument_count > 1){
    sortingMode = argument[1];
}

var flag = true;
var temp;
var numLength = array_length_1d(myArray);

if(sortingMode == "descend"){
    for(var i = 1; (i <= numLength) && flag; i++){
        flag = false;
        for (var j=0; j < (numLength -1); j++)
        {
            if (myArray[j+1] > myArray[j])      // ascending order simply changes to <
            { 
                temp = myArray[j];             // swap elements
                myArray[j] = myArray[j+1];
                myArray[j+1] = temp;
                flag = 1;               // indicates that a swap occurred.
            }
        }
    }
} else {
    for(var i = 1; (i <= numLength) && flag; i++){
        flag = false;
        for (var j=0; j < (numLength -1); j++)
        {
            if (myArray[j+1] < myArray[j])
            { 
                temp = myArray[j];
                myArray[j] = myArray[j+1];
                myArray[j+1] = temp;
                flag = 1;
            }
        }
    }
}
return myArray;
spero che questo semplice script possa essere di qualche utilità,

ciao e a presto

Avatar utente
cp94
Moderatore
Messaggi: 2789
Iscritto il: 04/07/2009, 19:18
Specialità: ddd
Località: Brescia
Contatta:

Re: array_sort non esiste !?!

Messaggio da cp94 »

Esiste ds_list_sort.
le ds_list sono praticamente degli array.
Games you should check out
Naemo
E T U S
Overgravity
Inside the Code

Immagine

Avatar utente
Tizzio
GMI Honor
Messaggi: 5836
Iscritto il: 29/06/2010, 23:43
Specialità: programmazione
Contatta:

Re: array_sort non esiste !?!

Messaggio da Tizzio »

ormai le ds list hanno raggiunto prestazioni e e l'usabilità pressoché identiche agli array, dato che anno aggiunto gli accessors

Codice: Seleziona tutto

var l = ds_list_create();
ds_list_add(l, 5, 10);
l[| 0] = 10;//modifico il primo valore
l[| 1] = 20;//modifico il secondo
 

Avatar utente
boxbuilder
Membro
Messaggi: 158
Iscritto il: 25/06/2015, 10:37
Specialità: programmatore
Uso: GM:Studio 1.4 HTML5
Contatta:

Re: array_sort non esiste !?!

Messaggio da boxbuilder »

:spat: :spat: :spat:
Benissimo!
Pensare che m'ero rifatto anche push , pop, search, tostring e forEach.

In ds_list, grids e maps c'è veramente tutto quello che m'ero perso...

Grazie per l'info, adesso me le studio un attimo,

ma non c'è un manuale?

Avatar utente
doom13
Moderatore
Messaggi: 2093
Iscritto il: 31/08/2012, 15:40
Specialità: Programmazione
Uso: GM:Studio 2
Contatta:

Re: array_sort non esiste !?!

Messaggio da doom13 »

Il manuale c'è, lo puoi aprire anche dal programma, se non sbaglio devi cliccare sul punto interrogativo -> manual
Immagine
Spoiler
Maze [sospeso]
Isom (titolo provvisorio) (Windows & Android) [sospeso]
Keep Calm & Jump (Android) [In corso]
The Graywall (Windows) [Completo]
DTB (Windows & Android) [Completo]
The Last Spell (Windows) [Completo]
Dukenstein: Return to the house (Windows) [Completo]
DMSystem (Windows) [Completo]
"Things get hard sometimes guys... But remember, dicks get hard too, but they don't stay hard forever. Don't give up!"

Avatar utente
pacmino
GMI Guru
Messaggi: 2569
Iscritto il: 03/06/2009, 16:38
Specialità: Scazzato cronico
Uso: GM:Studio 2
Località: Seconda stella a destra questo è il cammino e poi dritto, fino al mattino...
Contatta:

Re: array_sort non esiste !?!

Messaggio da pacmino »

il manuale o guida c'è come nella maggior parte dei programmi sotto la voce punto di domanda o Help (IN GMS)/open the manual oppure premendo F1

oppure online http://docs.yoyogames.com/
Immagine

Avatar utente
Tizzio
GMI Honor
Messaggi: 5836
Iscritto il: 29/06/2010, 23:43
Specialità: programmazione
Contatta:

Re: array_sort non esiste !?!

Messaggio da Tizzio »

boxbuilder ha scritto::spat: :spat: :spat:
Benissimo!
Pensare che m'ero rifatto anche push , pop, search, tostring e forEach.
Posta pure quelli se ti va, è bello discutere sull'implementazione di certe funzioni :)
Inoltre è utilizzimo per chi si avvicina alla programmazione, leggere codice da quelli con più esperienza.

Avatar utente
boxbuilder
Membro
Messaggi: 158
Iscritto il: 25/06/2015, 10:37
Specialità: programmatore
Uso: GM:Studio 1.4 HTML5
Contatta:

Re: array_sort non esiste !?!

Messaggio da boxbuilder »

Ho iniziato ad usare le ds_list, effettivamente siamo su un altro pianeta, l'unica difficoltà che sto avendo è quella nel gestire al meglio possibile gli array multidimensionali.
Mi spiego, usare delle ds_map all'interno di ds_list mi fa un po' paura a livello di gestione della memoria.

Avatar utente
Tizzio
GMI Honor
Messaggi: 5836
Iscritto il: 29/06/2010, 23:43
Specialità: programmazione
Contatta:

Re: array_sort non esiste !?!

Messaggio da Tizzio »

Puoi utilizzare ds_list di ds_list e sfruttare gli enum

esempio:

Codice: Seleziona tutto

//define only once
enum element{
    elem_id,
    pos_x,
    pos_y,
    asd
}

new_elem = ds_list_create();
new_elem[| element.pos_x] = 10;
new_elem[| element.pos_y] = 10;
new_elem[| element.elem_id] = "tldr";
new_elem[| element.asd] = "fgh";

ds_list_add(global.element_list,  new_elem);

praticamente sarà come usare delle ds_map, solo con le prestazioni delle ds_list e con delle key fisse e costanti (convertite compile time)

Avatar utente
boxbuilder
Membro
Messaggi: 158
Iscritto il: 25/06/2015, 10:37
Specialità: programmatore
Uso: GM:Studio 1.4 HTML5
Contatta:

Re: array_sort non esiste !?!

Messaggio da boxbuilder »

Tizzio ha scritto:Puoi utilizzare ds_list di ds_list e sfruttare gli enum

esempio:

Codice: Seleziona tutto

//define only once
enum element{
    elem_id,
    pos_x,
    pos_y,
    asd
}

new_elem = ds_list_create();
new_elem[| element.pos_x] = 10;
new_elem[| element.pos_y] = 10;
new_elem[| element.elem_id] = "tldr";
new_elem[| element.asd] = "fgh";

ds_list_add(global.element_list,  new_elem);

praticamente sarà come usare delle ds_map, solo con le prestazioni delle ds_list e con delle key fisse e costanti (convertite compile time)

grazie! Utilissimo!

Arcade Blues
Newbie
Messaggi: 47
Iscritto il: 09/01/2016, 12:05
Specialità: Sogno a occhi aperti
Uso: GM:Studio 1.4 Master
Località: Napoli
Contatta:

Re: array_sort non esiste !?!

Messaggio da Arcade Blues »

boxbuilder ha scritto:Ho iniziato ad usare le ds_list, effettivamente siamo su un altro pianeta, l'unica difficoltà che sto avendo è quella nel gestire al meglio possibile gli array multidimensionali.
Mi spiego, usare delle ds_map all'interno di ds_list mi fa un po' paura a livello di gestione della memoria.
Generalmente quando le prestazioni contano gli array multidimensionali nn andrebbero usati.
E' molto piu' efficiente indicizzare le coordinate x e y all' interno di un array lineare o almeno lo è in qualsiasi linguaggio che abbia mai provato.Non so dirti in gml perchè uso gli array in modo marginale preferendo a loro le grid a mani basse.
anche nelle grid uso le coordinate monodimensionali utilizzando la seconda dimensione per simulare a piacimento un array di strutture o una struttura di array con enum come da esempio di Tizzio con le ds_list tranne che con le grid dove "il doppio reindirizzamento è nativo"(lo so suona malissimo).

Come regola generale se un implementazione sfrutta una o piu' funzioni native di Game maker questa sara necessariamente piu' veloce di un elaborata implementazione in gml a meno che l'algoritmo che tu usi non sia drasticamente migliore di quello basato sulle funzioni native(possibile ,ma difficile e probabilmente ti trovi di fronte a qualcosa che nn andrebbe fatta in gml.

Un algoritmo gml puo' essere cmq piu' veloce in determinate condizioni e casi limite dove l'algoritmo nativo proposto si comporta davvero male es la cancellazione del primo elemento in una ds_list enorme comporta lo slittamento e quindi la copia di tutti gli elementi.In tal caso un algoritmo che copi solo l'ultimo elemento dll' array al posto di quello cancellato puo' battere le performance native anche in emulazione commodore 64.

E' bene ricordare che qualsiasi codice scriverai anche compilato in yyc non sarà mai a velocità native basta considerare che ycc in molti casi è piu' lento di javascript(es. gli array sono drasticamente piu' veloci in html5 che in ycc e penosi in gml interpretato) quindi le grid da quel punto di vista le preferisco in quanto offrono prestazioni comparabili su tutte le piattaforme.
In Gml tocca sfruttare al meglio cio che si ha, abbracciare i limiti senza provare ad combatterli e trovare soluzioni semplici perchè in gml più codice scrivi piu' potenziali bug e potenziali colli di bottiglia stai inserendo.

Jak
Admin
Messaggi: 12355
Iscritto il: 19/08/2009, 16:20
Specialità: Programmazione 3D
Uso: GM:Studio 2
Contatta:

Re: array_sort non esiste !?!

Messaggio da Jak »

Arcade Blues ha scritto:Generalmente quando le prestazioni contano gli array multidimensionali nn andrebbero usati.
E' molto piu' efficiente indicizzare le coordinate x e y all' interno di un array lineare o almeno lo è in qualsiasi linguaggio che abbia mai provato.Non so dirti in gml perchè uso gli array in modo marginale preferendo a loro le grid a mani basse.
Dipende molto dall'implementazione, nei linguaggi compilati classici e vecchi non cambia assolutamente nulla in quanto usano l'implementazione più ovvia ossia lo stesso calcolo matematico che faresti tu a mano.
Certo dipende anche molto da come li utilizzi e della capacità di un compilatore di ottimizzare il determinato caso.
Bisogna comunque considerare la facilità e chiarezza del codice, di rado le prestazioni servono a tal punto da fare un castrone illeggibile.
Arcade Blues ha scritto:anche nelle grid uso le coordinate monodimensionali utilizzando la seconda dimensione per simulare a piacimento un array di strutture o una struttura di array con enum come da esempio di Tizzio con le ds_list tranne che con le grid dove "il doppio reindirizzamento è nativo"(lo so suona malissimo).
Anche qui dipende dal caso, ora non ricordo esattamente il risultato dei miei infiniti test ma una list è comunque di gran lunga più veloce da leggere di una grid quindi per grid che hanno una seconda dimensione non conviene. A patto che la utilizzi per intero chiaramente e non elementi sporadici ogni tanto quindi ricade nuovamente sulla scelta in base al caso.
Inoltre le ds_list possono contenere array quindi anche quella è un'implementazione da non sottovalutare essendo gli array notevolmente più veloci delle ds.
Arcade Blues ha scritto:Come regola generale se un implementazione sfrutta una o piu' funzioni native di Game maker questa sara necessariamente piu' veloce di un elaborata implementazione in gml a meno che l'algoritmo che tu usi non sia drasticamente migliore di quello basato sulle funzioni native(possibile ,ma difficile e probabilmente ti trovi di fronte a qualcosa che nn andrebbe fatta in gml.
Le chiamate a funzione in game maker sono molto lente, anche non avendo un'algoritmo più performante molte operazioni semplici, principalmente relative alla matematica, potrebbero essere più veloci con del codice inserito manualmente piuttosto che il solo richiamo di una funzione risultando quindi più veloce anche se l'esecuzione in se della funzione è sempre più veloce come dici tu.
Arcade Blues ha scritto:E' bene ricordare che qualsiasi codice scriverai anche compilato in yyc non sarà mai a velocità native basta considerare che ycc in molti casi è piu' lento di javascript(es. gli array sono drasticamente piu' veloci in html5 che in ycc e penosi in gml interpretato) quindi le grid da quel punto di vista le preferisco in quanto offrono prestazioni comparabili su tutte le piattaforme.
Questo è interessante, non ho mai provato il modulo html5 ma ho sempre notato che il javascript è piuttosto lento in esempi e giochi vari sul web mentre i miei test di game maker senza yyc (quindi interprete) con le ultime versioni mi davano come risultato che variabili ed array erano pressochè gratuite ed infinitamente migliori rispetto alle ds, velocità neanche lontanamente paragonabili. Resta comunque il fatto che appunto non ho mai usato yyc (perchè buggo) e quindi non sono mai incappato in drastici cambiamenti di velocità che magari fanno l'esatto contrario per quanto riguarda le prestazioni (chiamate a funzione e ds veloci, array lenti e tutto ciò di cui parli).
Time to feel, time to believe
Dare to see what may come of our future
Lift your head, broaden your gaze
Speak your mind and your thoughts they will follow you

Arcade Blues
Newbie
Messaggi: 47
Iscritto il: 09/01/2016, 12:05
Specialità: Sogno a occhi aperti
Uso: GM:Studio 1.4 Master
Località: Napoli
Contatta:

Re: array_sort non esiste !?!

Messaggio da Arcade Blues »

Jak anche se è vero che tutto è relativo a modi e casi, nella mia pur breve esperienza con Game Maker ho notato che le grid sono quelle che mi danno il miglior risultato generale tra ycc, html5 e interpretato quindi diciamo che propendo per usarli in ogni caso anche perchè ho basato parti del mio "framework" su di essi e il mio codice ormai risulta piu' leggibile e facile da realizzare quando riutilizzo tale framework.

il mio resta cmq un consiglio molto opinionato da prendere con le pinze e non una strategia dominante è un metodo che io utilizzo e con cui mi trovo bene, un impostazione mentale.
Basti pensare che nell' 80% dei casi è triste verificarlo, ma la scelta di queste cose è e rimane una microottimizzazione inutile quindi ben venga la chiarezza e mantenibilità ad ogni costo, mi trovi perfettamente daccordo.

A volte bisogna fare delle scelte anche semplicemente per non starci a pensare ogni volta.

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 4 ospiti