[Duda]Sobre el static y new
#1

Hola, quiero saber, їcuбndo va un static o new?.
Reply
#2

El static va cuando quieres que una variable sea global pero solo se pueda usar dentro de cierto lugar. Por ejemplo, una variable que quieres que mantenga su valor pero no quieres que sea accesible fuera de OnPlayerConnect
pawn Код:
public OnPlayerConnect(playerid)
{
    static conexiones_totales;
    conexiones_totales += 1;
    return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
    conexiones_totales += 1;
    // El compilador mostrarб un error porque esta variable global solo se puede manipular dentro de OnPlayerConnect.
    return 1;
}
Se podrнa decir que es un truco de visibilidad que ayuda en ciertos casos donde quieres tener un script mбs ordenado, yo recomendarнa no usarlo solo porque se ve bien o porque otros programados lo usan; usarlo solo cuando de verdad sepas que lo necesitas.

La palabra new, en cambio, hace que la variable exista dentro del bloque donde se creу. Si la comparamos con static podremos observar que las static son globales restringidas a un бmbito (ellas existen fuera del бmbito aunque no son accesibles a niveles superiores) y las new son locales y por lo tanto NO EXISTEN fuera de su бmbito (pierden su valor cuando la ejecuciуn del script va a un bloque de cуdigo superior).

Esto suena bastante complicado pero en realidad no lo es, solo requiere leer un poco sobre que es un бmbito y que significa local y global.

pawn Код:
if (x)
{
    static st_a;
    new a;

// PRIMER БMBITO, EL NIVEL SUPERIOR

    if (y) {
        static st_b;
        new b;

// SEGUNDO БMBITO, SUPERIOR A if (z) e INFERIOR A if (x)
        if (z)
        {
            static st_c;
            new c;

// TERCER Y ULTIMO БMBITO (EN ESTE CASO), INFERIOR A TODOS LOS БMBITOS (if (x) e if (y))
        }
    }
}
їPuedes decir en donde se puede acceder cada variable?
Reply
#3

https://sampwiki.blast.hk/wiki/Scripting...s#static_local
https://sampwiki.blast.hk/wiki/Scripting...#global_static
Reply
#4

Quote:
Originally Posted by Miguel
Посмотреть сообщение
El static va cuando quieres que una variable sea global pero solo se pueda usar dentro de cierto lugar. Por ejemplo, una variable que quieres que mantenga su valor pero no quieres que sea accesible fuera de OnPlayerConnect
pawn Код:
public OnPlayerConnect(playerid)
{
    static conexiones_totales;
    conexiones_totales += 1;
    return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
    conexiones_totales += 1;
    // El compilador mostrarб un error porque esta variable global solo se puede manipular dentro de OnPlayerConnect.
    return 1;
}
Se podrнa decir que es un truco de visibilidad que ayuda en ciertos casos donde quieres tener un script mбs ordenado, yo recomendarнa no usarlo solo porque se ve bien o porque otros programados lo usan; usarlo solo cuando de verdad sepas que lo necesitas.

La palabra new, en cambio, hace que la variable exista dentro del bloque donde se creу. Si la comparamos con static podremos observar que las static son globales restringidas a un бmbito (ellas existen fuera del бmbito aunque no son accesibles a niveles superiores) y las new son locales y por lo tanto NO EXISTEN fuera de su бmbito (pierden su valor cuando la ejecuciуn del script va a un bloque de cуdigo superior).

Esto suena bastante complicado pero en realidad no lo es, solo requiere leer un poco sobre que es un бmbito y que significa local y global.

pawn Код:
if (x)
{
    static st_a;
    new a;

// PRIMER БMBITO, EL NIVEL SUPERIOR

    if (y) {
        static st_b;
        new b;

// SEGUNDO БMBITO, SUPERIOR A if (z) e INFERIOR A if (x)
        if (z)
        {
            static st_c;
            new c;

// TERCER Y ULTIMO БMBITO (EN ESTE CASO), INFERIOR A TODOS LOS БMBITOS (if (x) e if (y))
        }
    }
}
їPuedes decir en donde se puede acceder cada variable?
Hola, їcуmo andas?, bueno, casi, no entendн nada, їpodrнas ser mбs explicativo? :/.
Reply
#5

Quote:
Originally Posted by Fornew
Посмотреть сообщение
Hola, їcуmo andas?, bueno, casi, no entendн nada, їpodrнas ser mбs explicativo? :/.
static mantiene su valor anterior. Por ejemplo:
pawn Код:
public OnPlayerConnect(playerid)
{
    static string[128];
    if(playerid == 0)
    {
        format(string, sizeof string, "Hola jugador id %d", playerid);
    }
    SendClientMessage(playerid, 0xFF0000FF, string);
    return 1;
}
Como dije anteriormente las static mantienen el valor anterior.
Supongamos que entra el jugador id 0, se cumple la condiciуn y le mandarнa el mensaje "Hola jugador id 0".
Luego entra el jugador id 1, el jugador id 1, tambiйn va a recibir el mensaje "Hola jugador id 0" porque el contenido de la variable string no se borro ya que es una static. Si string fuera una variable new, no almacena su valor y se borra al terminar la ejecuciуn de OnPlayerConnect, al llamarse de nuevo la variable se crearнa de nuevo y su valor se reiniciaria, por lo que enviarнa un mensaje en vacнo. Esto sucede porque las variables new se almacenan en stack/heap, es decir, es memoria dinбmica, se crea, se usa y se libera, en cambio las static se utiliza memoria estбtica ya que no se borran y permanecen durante toda la ejecuciуn del script.
Las static globales, es decir, que no estбn dentro de ninguna callback o funciуn, solo pueden usarse en ese archivo que fue declarada y no en los includes.
Reply
#6

Quote:
Originally Posted by MugiwaraNoLuffy
Посмотреть сообщение
static mantiene su valor anterior. Por ejemplo:
pawn Код:
public OnPlayerConnect(playerid)
{
    static string[128];
    if(playerid == 0)
    {
        format(string, sizeof string, "Hola jugador id %d", playerid);
    }
    SendClientMessage(playerid, 0xFF0000FF, string);
    return 1;
}
Como dije anteriormente las static mantienen el valor anterior.
Supongamos que entra el jugador id 0, se cumple la condiciуn y le mandarнa el mensaje "Hola jugador id 0".
Luego entra el jugador id 1, el jugador id 1, tambiйn va a recibir el mensaje "Hola jugador id 0" porque el contenido de la variable string no se borro ya que es una static. Si string fuera una variable new, no almacena su valor y se borra al terminar la ejecuciуn de OnPlayerConnect, al llamarse de nuevo la variable se crearнa de nuevo y su valor se reiniciaria, por lo que enviarнa un mensaje en vacнo. Esto sucede porque las variables new se almacenan en stack/heap, es decir, es memoria dinбmica, se crea, se usa y se libera, en cambio las static se utiliza memoria estбtica ya que no se borran y permanecen durante toda la ejecuciуn del script.
Las static globales, es decir, que no estбn dentro de ninguna callback o funciуn, solo pueden usarse en ese archivo que fue declarada y no en los includes.
Muchнsimas gracнas amigo, me aclarastes la duda.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)