SA-MP Forums Archive
Parбmetro de tipo mixto - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: Non-English (https://sampforum.blast.hk/forumdisplay.php?fid=9)
+--- Forum: Languages (https://sampforum.blast.hk/forumdisplay.php?fid=33)
+---- Forum: Español/Spanish (https://sampforum.blast.hk/forumdisplay.php?fid=29)
+---- Thread: Parбmetro de tipo mixto (/showthread.php?tid=558034)



Parбmetro de tipo mixto - hotspicytaco - 15.01.2015

Hola.

їAlguien tiene idea de como podrнa crear un parбmetro de "tipo mixto"? Estoy tratando de hacer una funciуn que le establezca un valor a una variable y el valor puede ser string, int, float, bool. Lo que quiero es saber de que tipo es el parбmetro "value".

e.j:

pawn Код:
SetPlayerStat(playerid, stat, value)
{
    // Si el valor "pasado" es una cadena de texto...
    if(value == string)
    {
        // Usar format (o algo mбs eficaz) para asignarle el valor en vez de asignarselo con "="
        format(var, sizeof(var), "%s", value);
    }
    // El valor pasado es un entero/float/bool
    else
    {
        // Asignar el valor directamente usando "="
        var = value;
    }
    return true;
}

//Uso:
SetPlayerStat(playerid, DINERO, 20);
SetPlayerStat(playerid, PASS, "45712");
SetPlayerStat(playerid, VIDA_INFINITA, true);
SetPlayerStat(playerid, VIDA, 99.0);
Tambiйn me gustarнa saber alguna manera mejor de hacer esto en caso de que eso no fuera posible.

Gracias.


Respuesta: Parбmetro de tipo mixto - Fluid016 - 15.01.2015

Podrнas usar la funciуn
IsNumeric e IsFloat

pawn Код:
stock IsFloat(buf[])
{
    new l = strlen(buf);
    new dcount = 0;
    for(new i=0; i<l; i++)
    {
        if(buf[i] == '.')
        {
            if(i == 0 || i == l-1) return 0;
            else
            {
                dcount++;
            }
        }
        if((buf[i] > '9' || buf[i] < '0') && buf[i] != '+' && buf[i] != '-' && buf[i] != '.') return 0;
        if(buf[i] == '+' || buf[i] == '-')
        {
            if(i != 0 || l == 1) return 0;
        }
    }
    if(dcount == 0 || dcount > 1) return 0;
    return 1;
}



Respuesta: Parбmetro de tipo mixto - Jovazxc - 15.01.2015

Dado que en PAWN no puedes sobrecargar una funciуn, utiliza getarg

https://sampwiki.blast.hk/wiki/Getarg


Respuesta: Parбmetro de tipo mixto - Zume - 17.01.2015

podrнas intentar con el plugin de Expresiones Regulares, o obtener su tipo de esta manera:

pawn Код:
#define FLOAT_TYPE      1
#define INT_TYPE        2
#define HEX_TYPE        3
#define BOOL_TYPE       4
#define UNKNOWN_TYPE    0

stock getVarType({_, Float, bool, hex}:value, type = tagof( value ))
{
    static _t = 0;
    if(type == tagof( bool: )){
        _t = BOOL_TYPE;
    }
    else if(type == tagof( hex: )){
        _t = HEX_TYPE;
    }
    else if(type == tagof( Float: )){
        _t = FLOAT_TYPE;
    }
    else{
        _t = ((value > (0x2F) && value < 0x3A) ? (INT_TYPE): (UNKNOWN_TYPE));
    }
    return (_t);
}
pero no logro pensar en como poder comprobar antes de la ejecuciуn si es un array o un entero para comprobar si es un string sin algъn loop (me refiero a crear su definiciуn en el mismo argumento 1).. falta el string, ya que creo que no tiene tag por defecto, en caso de ternerlo ya estarнa sуlo aсadirle el tag xD

pawn Код:
main()
{
    new bool:str = true;
    static v[][] = {
        {"Unknown"},
        {"FLOAT"},
        {"INT"},
        {"HEX"},
        {"BOOL"}
    };
    printf("ES %s", v[getVarType(str)][0]);
}



Respuesta: Parбmetro de tipo mixto - Swedky - 17.01.2015

Con macros


Respuesta: Parбmetro de tipo mixto - Zume - 17.01.2015

Quote:
Originally Posted by EnzoMetlc
Посмотреть сообщение
Con macros
lo dices por que los macros son sin formato? lo son verdad? xD, tienes razуn en verdad