[Ayuda] foreach ...
#1

Buenas a Todos, Como hago este bucle con foreach por ke me tira error cuando lo hago de la siguiente manera :S.

ASI TENGO:
pawn Код:
for(new i = 0; i < 67; i++)
ASI COLOKE:
pawn Код:
foreach(67,i)
ERROR:
pawn Код:
: error 020: invalid symbol name ""
: error 029: invalid expression, assumed zero
: warning 215: expression has no effect
: error 001: expected token: ";", but found "]"
: fatal error 107: too many error messages on one line
Desde ya muchas Gracias .
Reply
#2

Primero que nada, foreach, no es una alternativa al for, foreach sirve especialmente para loopear jugadores, te explico mira:
pawn Код:
for(new i;i<MAX_PLAYERS;i++) if(IsPlayerConnected(i))
{
    //codigo
}
Eso lo que harнa serнa contar desde el 0 al 499, o sea desde el id 0 al id 499, y "i" serнa la id. Si la id estб conectada se ejecuta la pieza de cуdigo. Por lo tanto, este bucle lo que hace es pasar por todas las ids y chequear si estбn conectadas.
pawn Код:
foreach(Player, i)
{

}
El include foreach a diferencia de este solamente pasa por las ids conectadas, es decir, un iterador.
Lo que hace es hacer una especie de lista o mapa de los jugadores conectados y luego al hacer el bucle solamente pasarнa con ellos.
Tambien podes crear tus propias listas, se puede hacer con vehiculos, hookeando las funciones. Tiene bastante utilidad.
Reply
#3

Quote:
Originally Posted by CaptainMactavish
Посмотреть сообщение
Primero que nada, foreach, no es una alternativa al for, foreach sirve especialmente para loopear jugadores, te explico mira:
pawn Код:
for(new i;i<MAX_PLAYERS;i++) if(IsPlayerConnected(i))
{
    //codigo
}
Eso lo que harнa serнa contar desde el 0 al 499, o sea desde el id 0 al id 499, y "i" serнa la id. Si la id estб conectada se ejecuta la pieza de cуdigo. Por lo tanto, este bucle lo que hace es pasar por todas las ids y chequear si estбn conectadas.
pawn Код:
foreach(Player, i)
{

}
El include foreach a diferencia de este solamente pasa por las ids conectadas, es decir, un iterador.
Lo que hace es hacer una especie de lista o mapa de los jugadores conectados y luego al hacer el bucle solamente pasarнa con ellos.
Tambien podes crear tus propias listas, se puede hacer con vehiculos, hookeando las funciones. Tiene bastante utilidad.
ah ok hay entendi
muchas Gracias .
Reply
#4

Pero de igual forma puedes utilizar esto
pawn Код:
#define FOREACH(%0,%1)          for(new %0=0;%0<%1;%0++)

//Es lo mismo nada mбs que definido para usar
new I;
FOREACH(I, 67)
{
  //codigo
}
Reply
#5

Quote:
Originally Posted by GROVE22
Посмотреть сообщение
Pero de igual forma puedes utilizar esto
pawn Код:
#define FOREACH(%0,%1)          for(new %0=0;%0<%1;%0++)

//Es lo mismo nada mбs que definido para usar
new I;
FOREACH(I, 67)
{
  //codigo
}
ese codigo te daria un warning por la sencilla razon de que estas haciendo dos veces un new, uno en el macro y el otro antes del FOREACH lo normal seria asi

pawn Код:
#define ForEach(%0,%1) for(new %0=0;%0<%1;%0++)

ForEach(a,100) //variable y limite del arreglo
{
    SetPlayerHealth(a,100);
}
aqui te dejo un macro para los players
pawn Код:
#define ForEach(%0,%1) for(new %0 = 0; %0 != %1; %0++) if(IsPlayerConnected(%0) && !IsPlayerNPC(%0))
Reply
#6

Quote:
Originally Posted by GROVE22
Посмотреть сообщение
Pero de igual forma puedes utilizar esto
pawn Код:
#define FOREACH(%0,%1)          for(new %0=0;%0<%1;%0++)

//Es lo mismo nada mбs que definido para usar
new I;
FOREACH(I, 67)
{
  //codigo
}
No es lo mismo, por algo estб el include, їno te parece?
Hay mucha diferencia en cuanto al rendimiento de ambos.
Reply
#7

Quote:
Originally Posted by CaptainMactavish
Посмотреть сообщение
No es lo mismo, por algo estб el include, їno te parece?
Hay mucha diferencia en cuanto al rendimiento de ambos.
es verdad... podria ser tomado como alternativa al include
Reply
#8

Funcionara igual solo q foreach.inc tiene mejor optimizacion y mejor manejo
Reply
#9

foreach no funciona solo para jugadores. Es un bucle mediante iteradores, por eso es mucho mas eficiente que cualquier bucle a travez de los jugadores, pero pueden agregarse iteradores personalizados y utilizarlos.
Esto puede realizarse mediante la funcion:
pawn Код:
Iter_Add(name, value);
Donde name, representa el nombre del Iterador al cual se le asignara el elemento llamado value.

Ejemplo:
pawn Код:
//Declaracion de nuestro nuevo iterador:
new Iterator:Vehicles<MAX_VEHICLES>;

//hookeamos un par de funciones para el correcto uso del mismo
stock _AddStaticVehicle(modelid, Float:spawn_x, Float:spawn_y, Float:spawn_z, Float:angle, color1, color2)
{
    new veh = AddStaticVehicle(modelid, spawn_x, spawn_y, spawn_z, angle, color1, color2)
    if(veh != INVALID_VEHICLE_ID)
        Iter_Add(Vehicles, veh);
    return veh;
}
#define AddStaticVehicle    _AddStaticVehicle

stock _AddStaticVehicleEx(modelid, Float:spawn_x, Float:spawn_y, Float:spawn_z, Float:angle, color1, color2, respawn_delay)
{
    new veh = AddStaticVehicle(modelid, spawn_x, spawn_y, spawn_z, angle, color1, color2, respawn_delay)
    if(veh != INVALID_VEHICLE_ID)
        Iter_Add(Vehicles, veh);
    return veh;
}
#define AddStaticVehicleEx    _AddStaticVehicleEx

stock _CreateVehicle(modelid, Float:x, Float:y, Float:z, Float:angle, color1, color2, respawn_delay)
{
    new veh = CreateVehicle(modelid, x, y, z, angle, color1, color2, respawn_delay);
    if(veh != INVALID_VEHICLE_ID)
        Iter_Add(Vehicles, veh);
    return veh;
}
#define CreateVehicle    _CreateVehicle

stock _DestroyVehicle(vehicleid)
{
    if(DestroyVehicle(vehicleid))
    {
        Iter_Remove(Vehicles, vehicleid);
        return 1;
    }
    return 0;
}
#define DestroyVehicle    _DestroyVehicle

//1є posible uso:
new Float:heath;
foreach(new i : Vehicles)
{
    GetVehicleHealth(i, health);
    printf("La vida del vehiculo %i es: %.3f", i, health);
}

//2є posible uso:
printf("Hay %i vehiculos creados", Iter_Count(Vehicles));
Para mas informacion sobre foreach lean el topico de su lanzamiento, que comprenderan mucho mejor su gran capacidad.

Nota: Para que el script ejemplo que deje, funcione correctamente, deberian agregarse las funciones en cada script y se deberia definir el iterador de forma tal que el mismo sea comun a todos los scripts (Deberia editarse el include para utilizar CallRemoteFunction y acceder a una funcion declarada en el GM para acceder al iterador correspondiente, algo no muy sensillo).
Reply
#10

Quote:
Originally Posted by CaptainMactavish
Посмотреть сообщение
No es lo mismo, por algo estб el include, їno te parece?
Hay mucha diferencia en cuanto al rendimiento de ambos.
la rre flashaste mal -.-

es lo mismo usar el macro y el for(new i;i<MAX_PLAYERS;i++)

a eso me referнa no que es lo mismo que usar el include -.-
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)