01.07.2012, 21:06
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);
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));
}
Foreach para Jogadores:
pawn Код:
foreach(Player, c) {
SendClientMessage(c, -1, "Vocк estб online !!");
}