Parбmetro de tipo mixto
#1

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.
Reply
#2

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;
}
Reply
#3

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

https://sampwiki.blast.hk/wiki/Getarg
Reply
#4

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]);
}
Reply
#5

Con macros
Reply
#6

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
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)