Foreach v1 -
ipsBruno - 01.07.2012
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-informacao-inscricao-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#endifpublic 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 CallOnPlayerDisconnectforward 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 !!");
}
Re: Foreach v1 -
Juninho_Oakley - 01.07.2012
belo trabalho bruno fico bem rapido msm
Re: Foreach v1 -
Truck - 01.07.2012
Nossa muito bom, usarei ele. +rep
Re: Foreach v1 -
PawnoBrasil[xPBx] - 01.07.2012
Opa Bom trabalho
Re: Foreach v1 -
ipsBruno - 01.07.2012
Obrigado
pretendo fazer mais atualizaзхes.
Re: Foreach v1 -
Edu33 - 01.07.2012
Й mais vantagem usar esse?
Re: Foreach v1 -
PawnoBrasil[xPBx] - 01.07.2012
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?
Re: Foreach v1 -
dPlaYer_ - 01.07.2012
Boa Include DraKinS
Re: Foreach v1 -
ipsBruno - 01.07.2012
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) {
}
Re: Foreach v1 -
cJMaster_ - 01.07.2012
Boa, Provavelmente irei usб-la.