[Include] Foreach v1
#1

Foreach


Porque Foreach?
Porque este sim, SIMULA o foreach do PHP.

Como funciona?
Este sistema usa um algorнtimo de lista encadeada para percorrer dados de uma array (similar ao foreach do ******)

pawn Код:
///////////////////////////////////////////////////////////////////////////////
//
//
//        #### ########   ######     ######## ########    ###    ##     ##
//         ##  ##     ## ##    ##       ##    ##         ## ##   ###   ###
//         ##  ##     ## ##             ##    ##        ##   ##  #### ####
//         ##  ########   ######        ##    ######   ##     ## ## ### ##
//         ##  ##              ##       ##    ##       ######### ##     ##
//         ##  ##        ##    ##       ##    ##       ##     ## ##     ##
//        #### ##         ######        ##    ######## ##     ## ##     ##
//
//
//                    Criado por Bruno da Silva (Antigo pseudфnimo DraKiNs)
//
//          Acesse meu blog sobre programaзгo http://www.brunodasilva.com.br
//
//              Seja membro da melhor equipe de programaзгo
//         http://ips-team.forumeiros.com/t2-inform...cao-na-ips

//                    [iPs]TeaM soluзхes de programaзгo em geral
//
//
//                           [Foreach 1] (ultra rбpido)
//
//
/////////////////////////////////////////////////////////////////////////////////


#define iterArr:%0<%1>        ipsValue%0[%1], ipsSwap%0[%1] = {-1, ...}, ipsArray%0[%1] = {-1, ...}, ipsInit%0 = -1, ipsFinal%0 = 0

#define addItem(%0,%1)      add_item(ipsArray%0, %1, ipsFinal%0,ipsInit%0, ipsSwap%0)
#define delItem(%0,%1)      del_item(ipsArray%0, %1, ipsFinal%0,ipsInit%0,  ipsSwap%0)
#define setItem(%0,%1,%2)   set_item(ipsValue%0, %1, %2)

#define getChain(%0,%1)     ipsArray%0[%1]
#define getValue(%0,%1)     ipsValue%0[%1]

#define foreach(%0,%1)      for(new %1 = ipsInit%0; %1 != -1; %1 = getChain(%0,%1))
// #define foreachex(%0,%1) for(new %1_ = ipsInit%0, %1; %1_ != -1; %1 = getValue(%0,%1_),%1_ = getChain(%0,%1))

new iterArr:Player<MAX_PLAYERS>;

del_item(array[], valor, &ultimo, &inicio, issetArr[], size = sizeof array) {

    if(valor < 0 || valor > size)
        return false;
       
    if(-1 == issetArr[valor] || ultimo == -1 || inicio == -1)
        return false;
       
    if(array[valor] == -1) {
        if(ultimo != valor) {
            return false;
        }
        else {
            ultimo = issetArr[valor];
            array[ultimo] = array[valor];
            issetArr[valor] = -1;
        }
    }
    else {
        if(inicio == valor) {
            inicio = array[valor];
            issetArr[valor] = -1;
            array[valor] = -1;
        }
        else {
            array[issetArr[valor]] = array[valor];
            array[valor] = -1;
            issetArr[valor] = -1;
        }
    }
    return true;
   
}

set_item(array[], item, valor) {
    return array[item] = valor;
}

add_item(array[], valor, &ultimo, &inicio, issetArr[], size = sizeof array) {

    if(valor < 0 || valor > size)
        return false;
   
    if(array[valor] != -1 || issetArr[valor] != -1)
        return false;

    if(ultimo == -1 || inicio == -1)
        return issetArr[valor] = valor, ultimo = valor, inicio = valor;
   
    if(array[ultimo] == -1)
        return issetArr[valor] = ultimo, array[ultimo] = valor, ultimo = valor, array[valor] = -1;

    return printf("[ERROR VALUE] %d", valor);
}


public OnPlayerConnect(playerid)
{
    addItem(Player, playerid);
    return CallLocalFunction("CallOnPlayerConnect", "i", playerid);
}


#if defined _ALS_OnPlayerConnect
    #undef OnPlayerConnect
#else
    #define _ALS_OnPlayerConnect
#endif


public OnPlayerDisconnect(playerid, reason)
{
    delItem(Player,playerid);
    return CallLocalFunction("CallOnPlayerDisconnect", "ii", playerid, reason);
}
#if defined _ALS_OnPlayerDisconnect
    #undef OnPlayerDisconnect
#else
    #define _ALS_OnPlayerDisconnect
#endif


#define OnPlayerConnect     CallOnPlayerConnect
#define OnPlayerDisconnect  CallOnPlayerDisconnect

forward OnPlayerConnect(playerid);
forward OnPlayerDisconnect(playerid, reason);
Qual diferenзa deste foreach para o outro foreach?
Este sistema simula um foreach de VERDADE. Desta maneira ele percorre os dados da array independente de qual valor. Й uso й similar do do ******, porйm o dele apenas abriga os dados de forma booleana, isto й. Ele apenas checa se o item da array estб liberado ou nгo e dб ele ao usuбrio. O meu verifica se o item estб disponнvel, dб o item ao usuбrio e se o usuбrio quiser poderб pegar o valor do item

Exemplo:
pawn Код:
new iterArr:VALORES<MAX_PLAYERS>;
   
    // liberando itens
    addItem(VALORES, 1);
    addItem(VALORES, 3);
    addItem(VALORES, 5);
    addItem(VALORES, 7);
    addItem(VALORES, 9);
   
    // atribuir valor aos itens
    setItem(VALORES, 1, 100);
    setItem(VALORES, 3, 300);
    setItem(VALORES, 5, 500);
    setItem(VALORES, 7, 700);
    setItem(VALORES, 9, 900);

    // checar itens liberados
    foreach(VALORES, c) {
        printf("VALORES[%i] liberado", c);
    }
   
    // checar valores atribuidos
    foreach(VALORES, j) {
        printf("VALORES[%i] = %i", j, getValue(VALORES, j));
    }
A velocidade й bastante rбpida, comparando com qualquer outro sistema de loop й extremamente rбpido. A desvantagem й que ocupa muitas memуrias na array, mas a velocidade й boa.

Foreach para Jogadores:
pawn Код:
foreach(Player, c) {
    SendClientMessage(c, -1, "Vocк estб online !!");
}
Reply
#2

belo trabalho bruno fico bem rapido msm
Reply
#3

Nossa muito bom, usarei ele. +rep
Reply
#4

Opa Bom trabalho
Reply
#5

Obrigado pretendo fazer mais atualizaзхes.
Reply
#6

Й mais vantagem usar esse?
Reply
#7

Como usar ela para exercer a funзгo do loop com MAX_VEHICLES?
Exemplo:
pawn Код:
for(new i = 0; i < MAX_VEHICLES; i++)
Tem como?
Reply
#8

Boa Include DraKinS
Reply
#9

Ao criar veнculo:
pawn Код:
addItem(vehiclesID, o id do veiculo aqui);
Ao deletar:
pawn Код:
addItem(vehiclesID,  o id do veiculo aqui);
Topo GM:
pawn Код:
new iterArr:vehiclesID<MAX_VEHICLES>;
-
pawn Код:
foreach(vehiclesID, v) {
}
Reply
#10

Boa, Provavelmente irei usб-la.

Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)