aumento de pamametros en una macro
#1

Buenas, les cuento mi duda es que si hay alguna manera de aumentar los parбmetros de una macro, pues yo tengo entendido que el numero maximo de parametros para una macro son entotal "10", "%0...%9" por ejemplo:

voy hacer una operaciуn matemбtico que sera este:

(34,2 / 5) / 12,6) / 4) + 25 + 30 - 56 - (12 * 48 * 61) = -35 136,8643

pawn Код:
#define MI_MACRO(%0,%1,%2,%3,%4,%5,%6,%7,%8,%9)         %0 / %1 / %2 / %3 + %4 + %5 - %6 - %7 * %8 * %9

printf("%f", MI_MACRO(34.2,5,12.6,4,25,30,56,12,48,61));
pues mi pregunta si quisiera agregar otra operaciуn matemбtico como lo tendrнa que hacer, pues me gustarнa saber si hay alguna manera para aumentar el parбmetro de la macro, aunque no creo que se puede ya que como tengo en tendido el mбximo de parбmetros para una macro son 10

Saludos
Reply
#2

es mejor preguntarte lo siguiente, realmente necesitas mas de 10 parametros en una macro? que intentas hacer?

Y en respuesta a tu pregunta por lo que recuerdo el maximo es 10. Y por las dudas te aviso que cada parametro de una macro no significa que solo pueda ir un valor allн.
Reply
#3

aahh ya entendн, solo preguntaba por curiosidad aparte querнa saber si existia algъn mйtodo para aumentar los paramentos pero veo que no se puede :P, gracias por contestar mi tema y por aclararme lo del parбmetro.

Saludos y perdуn por hacer preguntas muy estъpidas.
Reply
#4

Ninguna pregunta es estupida.

PD: si te interesa se pueden crear funciones sin limites de parametros (cada uno utilizable)
Reply
#5

si, si me explicaras como consiste te agradecerнa mucho.

Saludos
Reply
#6

si bien x ahi te resulte raro, no es tan complejo.

inicialmente debes declarar el parametro como array de los mismos, para lo que usaras los caracteres '...' quedando el header de la funcion de la siguiente manera:

pawn Код:
funcion(...)
ahora bien, para trabajar con los parametros puedes usar las siguientes funciones:
pawn Код:
native numargs();
native getarg(arg, index=0);
native setarg(arg, index=0, value);
un ejemplo:
pawn Код:
//Declaracion:
SetPlayerRandomColor(playerid, ...)
{
    new rnd, count;
    count = numargs()-1;//numeramos los argumentos.
    rnd = random(count);
    if(!count)return SetPlayerColor(playerid, GetPlayerColor(playerid));//
    return SetPlayerColor(playerid, getarg((rnd==0) ? ( 1) : (rnd)));
}

//Uso:
SetPlayerColor(playerid, 0xFF0000FF, 0xFFFF00FF, 0x0000FF66, 0x66FFA8FF);
Reply
#7

mm Gracias por la explicaciуn,pues bien leyendo y traduciendo con el traductor de ****** (muy malo) un tutorial explicando las 3 funciones que me diste, salia ejemplos usando Float,Menu,Text.

pero en verdad no entendн casi nada si podrнas explicarme un poco mas te agradecerнa mucho y el el funcionamiento de
getarg setarg

lo que entendi es que setarg establece un argumento y getarg obtiene un argumento y no estoy seguro si estoy en lo sierto
Saludos
Reply
#8

si, estas en lo correcto.
La funcion 'numargs' cuenta todos los argumentos de la funcion en la que se utilize (no solo los indefinidos).
La funcion 'getarg' obtiene un argumento (utilizas el parametro index de la misma para indicar cual).
La funcion 'setarg' setea el valor de un argumento (al igual que con getarg utilizas el parametro index para indicar cual, solo que esta vez tienes otros 2 parametros (el segundo dejalo en 0 y no te compliques) y el 3є indica el valor).

Aun asi depende lo que quieras hacer puede que debas leer mucho o que con esto te alcanze.
Reply
#9

Si voy a tener que leer mucho y repasar todo de nuevo.

lo que estaba intentando hacer es hacer una funcion que establesca el angulo (float) del jugador (playerid) y enviarle un mensaje

en el tutorial salia la estructura de la funcion:

pawn Код:
stock FunctionName(playerid, {Float,_}:...)
{
   
}
pero no da un ejemplo del funcionamiento con float y lo unico que se me ocurre es esto (no lo e probado ya que estoy en mi pc que esta malo)

pawn Код:
Angulo(playerid, {Float}:...)
{
    new numero = numargs();
    for(new i=0; i<numero; i++)
    {
    new Float:angulo = Float:getarg(i, 0);
    new string[128];
    SetPlayerFacingAngle(playerid,angulo);
    for(new o; getarg(i,o); ++o)
    {
        string[o] = getarg(i, o);
    }
    SendClientMessage(playerid, -1, string);
    }
}

Angulo(playerid,Float:180,"Hola");
si me pudieras dar un ejemplo usando float te lo agradecerнa o explicar lo que hago mal.

Saludos
Reply
#10

si quieres enviarle un mensaje al jugador y cambiar su angulo no necesitas parametros variables (aun que es una opcion)

pawn Код:
SetPlayerFacingAngleEx(playerid, Float:angle, messge[], color=-1)//color es opcional, por defecto sera blanco.
{
    SetPlayerFacingAngle(playerid, angle);
    return SendClientMessage(playerid, color, message);
}
Reply
#11

aaahh ok, de esa forma si se, pero me podrнas dar un ejemplo cuando utilizar parametros sin limites?
ya que en verdad no se en que pueda utilizarlo.

Saludos y muchas gracias por aclararme varias cosas
Reply
#12

aca te dejo algunos ejemplos faciles:
pawn Code:
Sumar(...)
{
    new res;
    for(new i, j=numargs(); i<j; i++)
        res += getarg(i);
    return res;
}

//By RyDeR`
RemovePlayerWeapon(playerid, ...) {
    new
        iArgs = numargs()
    ;
    while(--iArgs) {
        SetPlayerAmmo(playerid, getarg(iArgs), 0);
    }
}
//ahora algo q no sean solo numeros:
SetPlayerRandomFacingAngle(playerid, {Float, _}:...)
{
    new rnd , count;
    count = numargs() -1;//el -1 es ya que no contamos el parametro playerid
    if(!count)return 0;
    rnd = random(count);
    return SetPlayerFacingAngle(playerid, Float:getarg((rnd==0) ? (1) : (rnd)));
}
espero que te hayan sido de utilidad, si no decime.
Reply
#13

Te pasaste gracias por los ejemplos

si deseas puedes cerrar tema.

y muchas gracias por aclararme varias cosas y responder mis dudas

Saludos
Reply
#14

no hay problema, para eso estoy. y el tema queda abierto por si otros tienen dudas o cualquier cosa q se necesite.
Reply
#15

Quote:
Originally Posted by the_chaoz
View Post
no hay problema, para eso estoy. y el tema queda abierto por si otros tienen dudas o cualquier cosa q se necesite.
Siii

Yo tengo una DUDA!!!

pawn Code:
((rnd==0) ? (1) : (rnd)))
Para que es el '?' y el ':'

Esa es mi duda!!
Reply
#16

Quote:
Originally Posted by Treyfus
View Post
Siii

Yo tengo una DUDA!!!

pawn Code:
((rnd==0) ? (1) : (rnd)))
Para que es el '?' y el ':'

Esa es mi duda!!
Se lo denomina operador ternario. Y se utiliza para comparar y devolver un valor u otro.
El equivalente a ese codigo (completo) seria:
pawn Code:
if(rnd == 0)
{
    return SetPlayerFacingAngle(playerid, Float:getarg(1));
}
else
{
    return SetPlayerFacingAngle(playerid, Float:getarg(rnd));
}
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)