їNo usar un parametro dependiendo de la circunstancia?
#1

Buenas, quisiera que me respondieran una duda, ya que estoy haciendo un comando y no sй como hacer para no usar un parбmetro dependiendo de la opciуn que elija, les dejo un ejemplo para que lo entiendan mejor.
Desde ya muchas gracias.

PHP код:
CMD:asd(playeridparams[])
{
    if(
sscanf(params,"iis[32]",params[0],params[1],params[2])) return 0;
    switch(
params[1])
    {
        case 
0:
        {
            
// ACБ USO TODOS LOS PARБMETROS.
        
}
        case 
1:
        {
            
// ACБ TAMBIЙN.
        
}
        case 
2:
        {
            
// PERO ACБ QUIERO QUE EL PARAMS[2] NO SEA USADO, ES DECIR, SI EL JUGADOR PONE LA OPCIУN 2, QUE NO SEA NECESARIO PONER ALGO EN PARAMS[2].
        
}
    }
    return 
1;

Reply
#2

A ver no te entiendo muy bien, que es lo que quieres hacer con eso exactamente?
Reply
#3

PHP код:
CMD:editarpuerta(playeridparams[])
{
    if(
EsAlex(playerid))
    {
        if(
sscanf(params,"iis[32]",params[0],params[1],params[2]))
        {
            
MensajeInfo("/EditarPuerta [Puerta ID] [Opciуn] [Valor(Opcional)]");
            
SendClientMessage(playerid, -1"Opciones: 0 - Exterior | 1 - Interior | 2 - Nombre | 3 - Interior ID | 4 - VirtualWorld");
        }
        if(
InformacionPuerta[params[0]][P_EXISTE] == false) return MensajeError(playerid"Esa puerta no existe!");
        new 
Float:PlayerP[3];
        switch(
params[1])
        {
            case 
0:
            {
                
GetPlayerPos(playeridPlayerP[0], PlayerP[1], PlayerP[2]);
                
InformacionPuerta[params[1]][P_EXT][0] = PlayerP[0];
                
InformacionPuerta[params[1]][P_EXT][1] = PlayerP[1];
                
InformacionPuerta[params[1]][P_EXT][2] = PlayerP[2];
                
DestroyDynamic3DTextLabel(P_TEXT[params[1]]);
                
DestroyDynamicPickup(PickupPuerta[params[1]]);
                
P_TEXT[params[1]] = CreateDynamic3DTextLabel(asd,-1InformacionPuerta[params[1]][P_EXT][0], InformacionPuerta[params[1]][P_EXT][1], InformacionPuerta[params[1]][P_EXT][2], 20.0INVALID_PLAYER_IDINVALID_VEHICLE_ID0, -1, -1, -110.0);
                
PickupPuerta[params[1]] = CreateDynamicPickup(13181InformacionPuerta[params[1]][P_EXT][0], InformacionPuerta[params[1]][P_EXT][1], InformacionPuerta[params[1]][P_EXT][2], -1, -1, -1100.0);
                
SendClientMessage(playerid, -1"Exterior actualizado correctamente.");
            }
            case 
1:
            {
                
GetPlayerPos(playeridPlayerP[0], PlayerP[1], PlayerP[2]);
                
InformacionPuerta[params[1]][P_INT][0] = PlayerP[0];
                
InformacionPuerta[params[1]][P_INT][1] = PlayerP[1];
                
InformacionPuerta[params[1]][P_INT][2] = PlayerP[2];
                
SendClientMessage(playerid, -1"Interior actualizado correctamente.");
            }
                        
// ACБ SIGUE EL SCRIPT 
Quiero que no sea necesario escribir algo en el params[2] mientras que el case sea 0 y 1
Reply
#4

Primeramente, no hagas esto:
pawn Код:
if(sscanf(params, "iis[32]", params[0], params[1], params[2]))
Estas asignando datos tipo NUMERO a un CARACTER y luego suscribiendolo 3 veces, y eso puede causar confusiones y datos corruptos en algunas ocasiones, no siempre.

Uso correcto:
pawn Код:
new puerta_id, opcion, valor[32];
if(sscanf(params, "iis[32]", puerta_id, opcion, valor))
Y yendo al idea general, esto es lo que buscas:
pawn Код:
new puerta_id, opcion, valor[32];
if(sscanf(params, "ii", puerta_id, opcion))
{
    MensajeInfo("/EditarPuerta [Puerta ID] [Opciуn] [Valor(Opcional)]");
    return SendClientMessage(playerid, -1, "Opciones: 0 - Exterior | 1 - Interior | 2 - Nombre | 3 - Interior ID | 4 - VirtualWorld");
}

sscanf(params, "{i}{i}s[32]", valor); // No es obligada y es ignorable.
Reply
#5

Quote:
Originally Posted by SickAttack
Посмотреть сообщение
Estas asignando datos tipo NUMERO a un CARACTER y luego suscribiendolo 3 veces, y eso puede causar confusiones y datos corruptos en algunas ocasiones, no siempre.
Estas equivocado. En pawn no hay otros tipos de datos como caracteres y nъmeros. En primer lugar, los caracteres tienen valores numйricos dependiendo de la codificaciуn (sea unicode, ASCII, etc). En segundo lugar, pawn maneja un tipo de dato, que se llama cell. Asignarle valores directamente al params No estoy seguro que sea peligroso, depende de como funcione sscanf internamente. Quiza sea mejor escribirle variables para que el cуdigo se vea mas limpio.

Con respecto a la pregunta, sscanf tiene la opcion de pasar parбmetros como opcionales, dбndoles un valor por defecto. Se hace poniendo la letra en mayъscula y el valor por defecto entre parйntesis, Ejemplo

pawn Код:
sscanf("dD(5)", params[0], params[1]);
Con eso, sin el tipo pone solo el primer parбmetro, el segundo valdrб 5 ya que es su valor por defecto. Si pone otra cosa, valdrб lo que el puso.

Para ver si el puso algo o no en el segundo parametro, comprobas asн

if (params[1] == 5)

Ya que sabemos que 5 es el valor por defecto del params[1]
Reply
#6

Quote:
Originally Posted by spell
Посмотреть сообщение
Estas equivocado. En pawn no hay otros tipos de datos como caracteres y nъmeros. En primer lugar, los caracteres tienen valores numйricos dependiendo de la codificaciуn (sea unicode, ASCII, etc). En segundo lugar, pawn maneja un tipo de dato, que se llama cell. Asignarle valores directamente al params No estoy seguro que sea peligroso, depende de como funcione sscanf internamente. Quiza sea mejor escribirle variables para que el cуdigo se vea mas limpio.

Con respecto a la pregunta, sscanf tiene la opcion de pasar parбmetros como opcionales, dбndoles un valor por defecto. Se hace poniendo la letra en mayъscula y el valor por defecto entre parйntesis, Ejemplo

pawn Код:
sscanf("dD(5)", params[0], params[1]);
Con eso, sin el tipo pone solo el primer parбmetro, el segundo valdrб 5 ya que es su valor por defecto. Si pone otra cosa, valdrб lo que el puso.

Para ver si el puso algo o no en el segundo parametro, comprobas asн

if (params[1] == 5)

Ya que sabemos que 5 es el valor por defecto del params[1]
Tu estas mal, asignбndole ids a cosas usando este metodo, genera complicaciones en donde usando el id del mismo ya no tiene efecto alguno en ocasiones indefinidas.
Reply
#7

Quote:
Originally Posted by SickAttack
Посмотреть сообщение
Tu estas mal, asignбndole ids a cosas usando este metodo, genera complicaciones en donde usando el id del mismo ya no tiene efecto alguno en ocasiones indefinidas.
Estoy seguro que ni siquiera tu entiendes lo que escribiste. Seria bueno que no postres ni discutas acerca de temas que ni conoces. Deberнas leer como funciona antes de dar fundamentos incorrectos por tus suposiciones.
Reply
#8

PHP код:
COMMAND:asdad(playerid,params[])
{
    if (
sscanf(params"dd()"params[0], params[1]))
        return 
1;
    if (
params[0] < || params[0] >= 3)
        return 
1;
        
    switch(
params[0])
    {
        case 
01:
        {
            if(
isnull(params[1])
                return 
SendClientMessage(playerid, -1"No agregaste el 2do parametro");
        }
        case 
2:
        {
            
// asd
        
}
    }
    return 
1;

Se me ocurre un error en la comprobaciуn de isnull del segundo parбmetro.
Reply
#9

Sinceramente, no entiendo nada :/
їAlguna otra explicaciуn por favor?
Reply
#10

Quote:
Originally Posted by spell
Посмотреть сообщение
Estoy seguro que ni siquiera tu entiendes lo que escribiste. Seria bueno que no postres ni discutas acerca de temas que ni conoces. Deberнas leer como funciona antes de dar fundamentos incorrectos por tus suposiciones.
Si, el unico tipo de dato en pawn es cell, pero he visto complicaciones con sistemas en el foro cuando se asigna valores asi.

Quote:

The meaning of a value in a cell depends on the particular application
—it need not always be a signed integer value. pawn allows to attach
a “meaning” to a cell with its “tag” mechanism.

Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)