[DUDA] Sobre funcionamiento de comandos
#1

Bueno muchachos, hace dнas que estoy aprendiendo pawn y realizando pruebas en un gm bбsico.
Ya me he familiarizado con este foro utilizando la cuenta de mi hermano, he leнdo bastantes tutoriales e incluso los temas de ayuda, tambiґnn me he bajado algunos FS y GM's para poder ampliar mis conocimientos. Entonces decidн crear mi cuenta propia.


Esta vez, tengo muchas dudas sobre el funcionamiento de srtok, y quiero que me ayuden a entender como funciona.

Analizando un comando comъn que recibe como parametro un texto, como por ejemplo el comando "/admin <texto>"
que envia el chat desde la administracion al servidor, me encuentro con las siguientes sentencias:



Код:
new idx;
new cmd[256];               
cmd = strtok(cmdtext, idx);
En idx se almacena la posicion desde la cual comienza la siguiente palabra (token).



Код:
new length = strlen(cmdtext);
Obtiene el largo de todo el texto ingresado y lo guarda en la variable "length".



Quote:

while ((idx < length) && (cmdtext[idx] <= ' '))
{
idx++;
}

new offset = idx;
new result[64];

while ((idx < length) && ((idx - offset) < (sizeof(result) - 1)))
{
result[idx - offset] = cmdtext[idx];
idx++;
}

result[idx - offset] = EOS;
Aquн es donde surgen mis dudas.

1. El primer ciclo while incrementa idx en uno mientras que se cumpla la condiciуn que idx sea menor al largo total del texto recibido(en este caso con el comando /admin, vale 6). Y la parte roja їfija el limite desde la posicion que se guarda en idx hasta que encuentre el siguiente espacio? Supongamos en el texto "/admin cielo azul", їel ciclo sуlo abarcarб la palabra "cielo"?.


2. Se supone que el valor de la variable idx fue incrementando por lo que cambiу, entonces al asignar a offset el valor de idx, ambos valen lo mismo. Entonces en la parte azul, їno tendria validez restarlos? ya que daria 0 como resultado y obviamente es menor al tamaсo de la variable "resultado". Lo considero como relleno.

3. No entiendo lo que significa EOS, estuve echando un vistazo a los archivos INC y no sй que diablos es.



Bueno muchachos, en conclusiуn. Quiero aprender que hacen realmente los ciclos while's. Conozco otras formas como sscanf o strmid para extraer el texto, pero esta me llamу la atenciуn porque realmente esta enredada y deseo entenderla. No me gusta poner cуdigo si no lo entiendo.
Si pudiesen explicarme lнnea por lнnea el funcionamiento, lo agradecerнa. Muchas gracias de antemano.



EDIT:

Este es el comando completo, se los dejo para mayor detalle.

pawn Код:
//----------------------------------[AdminChat]-----------------------------------------------
    if(strcmp(cmd, "/admin", true) == 0 || strcmp(cmd, "/a", true) == 0)
    {
      if(IsPlayerConnected(playerid))
      {
            GetPlayerName(playerid, sendername, sizeof(sendername));
            new length = strlen(cmdtext);
            while ((idx < length) && (cmdtext[idx] <= ' '))
            {
                idx++;
            }
            new offset = idx;
            new result[64];
            while ((idx < length) && ((idx - offset) < (sizeof(result) - 1)))
            {
                result[idx - offset] = cmdtext[idx];
                idx++;
            }
            result[idx - offset] = EOS;
            if(!strlen(result))
            {
                SendClientMessage(playerid, COLOR_GRAD2, "USAGE: (/a)dmin [admin chat]");
                return 1;
            }
            format(string, sizeof(string), "*%d Admin %s: %s", PlayerInfo[playerid][pAdmin], sendername, result);
            if (PlayerInfo[playerid][pAdmin] >= 1)
            {
                SendAdminMessage(COLOR_YELLOW, string);
            }
            printf("Admin %s: %s", sendername, result);
        }
        return 1;
    }

EDIT 2: Buscando, he logrado encontrar que EOS significa End Of String.
Reply
#2

q dudoso de tu parte :S
Reply
#3

Bueno por lo del comando, no es sabido responder a tus dudas.
El ciclo while, lo que hace es hacer un bucle, por ejemplo que cada vez que "idx" esa inferior a "lenght", a idx le suma 1.
Cuando ya no se cumple esa condiciуn, pues ya no le suma uno.
Reply
#4

Dandole vuelta al coco he logrado entender como funciona realmente.
Favor de cerrar.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)