Detectar parбmetros usados, de una manera mejor
#1

Se me ocurriу hacer una funciуn con 3 parбmetros opcionales, ademas que checkee cuantos parбmetros se uso en totales. Asi que hice el siguiente cуdigo:

PHP код:
CMD:comando(playerid,params[])
{
    
Parametros_Locos(playerid,20,10);
    return 
1;
}
stock Parametros_Locos(playeridvalor=0,valor2=0,valor3=0)
{
    new 
parametros_usados;
    if(
valor >= 1parametros_usados += 1;
    if(
valor2 >= 1parametros_usados += 1;    
    if(
valor3 >= 1parametros_usados += 1;
    
    if(
parametros_usados == 1)
    {
        
SendClientMessage(playerid, -1"usaste 1 parametro");
    }
    else if(
parametros_usados == 2)
    {
        
SendClientMessage(playerid, -1"Usastes 2 parametros");
    }
    else if(
parametros_usados == 3)
    {
        
SendClientMessage(playerid, -1"Usastes 3 parametros");
    }
    else
    {
        
SendClientMessage(playerid, -1"no usaste ningun parametro");
    }
    return -
1;

El cуdigo funciona de puta madre, la cuestiуn es que me parece que estoy usando muchas sentencias "if", por lo cual va paso a paso, y eso es bбsicamente lento. Podria usar switch (no lo he intentado) pero creo que solo se puede usar con constantes y no lo pillo. їQuй otra forma lo harнan ustedes?.
Reply
#2

Usa ternarios C:
Reply
#3

Quote:
Originally Posted by dannypanda05
Посмотреть сообщение
Usa ternarios C:
No lo habнa pensado, no he usado eso mucho.

Код:
        valor = (valor >= 1) ? parametros_usados ++ : 0;
	valor2 = (valor2 >= 1) ? parametros_usados ++ : 0;
	valor3 = (valor3 >= 1) ? parametros_usados ++ : 0;
Gracias
Reply
#4

Quizб:

pawn Код:
stock funcion(arg1, ...)
{
    new argumentos = numargs()-1;

    /*switch(argumentos)
    {
        case 0:
        {

        }
        case 1:
        {

        }
        case 2:
        {

        }
    }*/


    printf("Se encontraron %d argumentos en la funciуn.", argumentos);

    return argumentos;
}
Dependiendo lo que quieres lograr.
Reply
#5

Quote:
Originally Posted by GranaT3
Посмотреть сообщение
No lo habнa pensado, no he usado eso mucho.

Код:
        valor = (valor >= 1) ? parametros_usados ++ : 0;
	valor2 = (valor2 >= 1) ? parametros_usados ++ : 0;
	valor3 = (valor3 >= 1) ? parametros_usados ++ : 0;
Gracias
Eso no funciona.

Por lo que quieres, sera mejor:
pawn Код:
#define plural_singular(%0,%1,%2) ((%0) == 1) ? ((#%1)) : ((#%2))

CMD:comando(playerid, params[])
{
    Parametros_Locos(playerid, 20, 10);
    return 1;
}

stock Parametros_Locos(playerid, valor_1 = 0, valor_2 = 0, valor_3 = 0)
{
    new parametros_usados;
    if(valor_1) parametros_usados ++;
    if(valor_2) parametros_usados ++;
    if(valor_3) parametros_usados ++;

    if(!parametros_usados)
    {
        SendClientMessage(playerid, -1, "No usaste ningun parametro.");
    }
    else
    {
        new string[128];
        format(string, sizeof(string), "Usaste %d %s.", parametros_usados, plural_singular(parametros_usados, "parametro", "parametros"));
        SendClientMessage(playerid, -1, string);
    }
    return 1;
}
Pero la verdad no se por que quieres hacer esto.
Reply
#6

En realidad si funciona, lo habнa testeado antes. Aun no me manejo con los macros.

No tiene un objetivo en concreto, son solo experimentos, prбcticas.
Reply
#7

Quote:
Originally Posted by GranaT3
Посмотреть сообщение
En realidad si funciona, lo habнa testeado antes. Aun no me manejo con los macros.

No tiene un objetivo en concreto, son solo experimentos, prбcticas.
Prueba esto:
pawn Код:
main()
{
    Parametros_Locos(20, 50);
}

stock Parametros_Locos(valor_1 = 0, valor_2 = 0, valor_3 = 0)
{
    new parametros_usados;
    valor_1 = (valor_1 >= 1) ? parametros_usados ++ : 0;
    valor_2 = (valor_2 >= 1) ? parametros_usados ++ : 0;
    valor_3 = (valor_3 >= 1) ? parametros_usados ++ : 0;

    printf("%d %d %d", valor_1, valor_2, parametros_usados);
    return 1;
}
Imprime:
Quote:

0 1 2

No creo que quisieras que esos valores sean inutilizables. Aunque lo podrias usar despues de usar sus valores. Pero bueno, no veo el punto en hacer eso, podrias utilizar condiciones, tiene mas sentido.
Reply
#8

Quote:
Originally Posted by Kevln
Посмотреть сообщение
Prueba esto:
pawn Код:
main()
{
    Parametros_Locos(20, 50);
}

stock Parametros_Locos(valor_1 = 0, valor_2 = 0, valor_3 = 0)
{
    new parametros_usados;
    valor_1 = (valor_1 >= 1) ? parametros_usados ++ : 0;
    valor_2 = (valor_2 >= 1) ? parametros_usados ++ : 0;
    valor_3 = (valor_3 >= 1) ? parametros_usados ++ : 0;

    printf("%d %d %d", valor_1, valor_2, parametros_usados);
    return 1;
}
Imprime:


No creo que quisieras que esos valores sean inutilizables. Aunque lo podrias usar despues de usar sus valores. Pero bueno, no veo el punto en hacer eso, podrias utilizar condiciones, tiene mas sentido.
Veamos, yo no sй para donde te has saltado tu, pero lo que colocas no es lo que intento. Bбsicamente estoy contando los parбmetros que estoy usando, para ello uso

Код:
// 3 parametros opcionales (valor defecto 0)

stock Parametros_Locos(playerid, valor=0,valor2=0,valor3=0)
{
	new parametros_usados; // valor de la variable 0

       // luego checkeo que el valor del primer parametro de la funcion sea igual o mayor a 1
       // en caso de ser asi, le suma a la variable "parametro_usados", asi sucesivamente por todos los parametros
	valor = (valor >= 1) ? parametros_usados ++ : 0;
	valor2 = (valor2 >= 1) ? parametros_usados ++ : 0;
	valor3 = (valor3 >= 1) ? parametros_usados ++ : 0;
	
        // luego checkeo el valor que tenga la variable parametro_usado, eso determinara cuantos parбmetros use 
	if(parametros_usados == 1)
	{
		SendClientMessage(playerid, -1, "usaste 1 parametro");
	}
	else if(parametros_usados == 2)
	{
		SendClientMessage(playerid, -1, "Usastes 2 parametros");
	}
	else if(parametros_usados == 3)
	{
		SendClientMessage(playerid, -1, "Usastes 3 parametros");
	}
	else
	{
		SendClientMessage(playerid, -1, "no usaste ningun parametro");
	}

	return -1;
}
Que funciona perfectamente.
Reply
#9

Quote:
Originally Posted by GranaT3
Посмотреть сообщение
Veamos, yo no sй para donde te has saltado tu, pero lo que colocas no es lo que intento. Bбsicamente estoy contando los parбmetros que estoy usando, para ello uso

Код:
// 3 parametros opcionales (valor defecto 0)

stock Parametros_Locos(playerid, valor=0,valor2=0,valor3=0)
{
	new parametros_usados; // valor de la variable 0

       // luego checkeo que el valor del primer parametro de la funcion sea igual o mayor a 1
       // en caso de ser asi, le suma a la variable "parametro_usados", asi sucesivamente por todos los parametros
	valor = (valor >= 1) ? parametros_usados ++ : 0;
	valor2 = (valor2 >= 1) ? parametros_usados ++ : 0;
	valor3 = (valor3 >= 1) ? parametros_usados ++ : 0;
	
        // luego checkeo el valor que tenga la variable parametro_usado, eso determinara cuantos parбmetros use 
	if(parametros_usados == 1)
	{
		SendClientMessage(playerid, -1, "usaste 1 parametro");
	}
	else if(parametros_usados == 2)
	{
		SendClientMessage(playerid, -1, "Usastes 2 parametros");
	}
	else if(parametros_usados == 3)
	{
		SendClientMessage(playerid, -1, "Usastes 3 parametros");
	}
	else
	{
		SendClientMessage(playerid, -1, "no usaste ningun parametro");
	}

	return -1;
}
Que funciona perfectamente.
Yo solo te enseсe las deficiencias de lo que publicaste; estas asignando valores a las variables, luego haces que los variables sean inutiles si cuentas los parametros antes de usar los valores en los variables, y para que? No es necesario. En todo caso, si solamente quieres contar los parametros utilizados, fijate en el codigo de DesingMyCry, y puedes ver https://sampforum.blast.hk/showthread.php?tid=573744 para mas informacion sobre el tema. Solo te di el codigo que publique primeramente para apoyarte en la forma en que lo querias lograr.

pawn Код:
#define plural_singular(%0,%1,%2) ((%0) == 1) ? ((#%1)) : ((#%2))

stock Parametros_Locos(playerid, ...)
{
    new arguments = numargs() - 1;
    if(!arguments)
    {
        SendClientMessage(playerid, -1, "No usaste ningun parametro.");
    }
    else
    {
        new string[128];
        format(string, sizeof(string), "Usaste %d %s.", arguments, plural_singular(arguments, "parametro", "parametros"));
        SendClientMessage(playerid, -1, string);
    }
    return 1;
}
Reply
#10

Quote:
Originally Posted by DesingMyCry
Посмотреть сообщение
Quizб:

pawn Код:
stock funcion(arg1, ...)
{
    new argumentos = numargs()-1;

    /*switch(argumentos)
    {
        case 0:
        {

        }
        case 1:
        {

        }
        case 2:
        {

        }
    }*/


    printf("Se encontraron %d argumentos en la funciуn.", argumentos);

    return argumentos;
}
Dependiendo lo que quieres lograr.
El problema es que si hago eso (segъn lo que he probado) si coloco por ejemplo:

Код:
Parametros_Locos(20);

// imprimira que tengo 2 parametros (3 si contamos desde el 0)
La cosa es que quiero saber cuantos parбmetros use, y no cuantos parбmetros tiene la funciуn. Por eso yo creу una variable aparte, que se va sumando si el valor de los parбmetros supera el 0.
Reply


Forum Jump:


Users browsing this thread: 4 Guest(s)