[Tutorial] Uso de celdas en strings (simple)
#1

Voy a explicar un poco la forma en que deben utilizar celdas en strings.
Ejemplo mal:
pawn Код:
//OnPlayerCommandText
if(strcmp(cmdtext, "/yosoynoob", true) == 0)
{
   new string[128], J[MAX_PLAYER_NAME];
   GetPlayerName(playerid, J, sizeof(J));
   format(string, sizeof(string), "Jugador %s es mucho noob", J);
   return SendClientMessageToAll(0xFFF000AA, string);
}
Utilizando 128 celdas:
Код:
Jugador es mucho noob = +22
%s = (+24) Nombre del jugador
22 + 24 = 46
46 + 1 (Caracter Nъlo (Null(\0))) = 47

De 128 celdas sуlo fueron utilizadas 47 celdas.
128 - 47 = 81 celdas que nу fueron necesarios.
Ejemplo cierto:
pawn Код:
//OnPlayerCommandText
if(strcmp(cmdtext, "/yosoynoob", true) == 0)
{
   new string[47], J[MAX_PLAYER_NAME];
   GetPlayerName(playerid, J, sizeof(J));
   format(string, sizeof(string), "Jugador %s es mucho noob", J);
   return SendClientMessageToAll(0xFFF000AA, string);
}
Debido a que yу use 47 celdas?
Код:
Jugador es mucho noob = +22
%s = (+24) Nombre del jugador
22 + 24 = 46
46 + 1 (Caracter Nъlo (Null(\0))) = 47
Код:
 Jugador es mucho noob = +22
Sу lo tien 21, mas la frase completa con %s tiйn mбs uno espacio.
Reply
#2

Felicidades....



Muy bueno
Reply
#3

ya hay un post sobre esto. y mucho mejor explicado, creado por ****** y con traduccion al espaсol por MrDeath.
Reply
#4

Para los nombres, puedes usar de menor tamaсo, ya que SA-MP siempre limitarб los caracteteres del nick a 16 (creo) y no te dejarб entrar con mбs.
Reply
#5

Quote:
Originally Posted by SuperMarioRol
Посмотреть сообщение
Para los nombres, puedes usar de menor tamaсo, ya que SA-MP siempre limitarб los caracteteres del nick a 16 (creo) y no te dejarб entrar con mбs.
Puede ir atй 22, pero normal es 20.
Reply
#6

Esta bien el tutorial, pero no me gusta como te diriges a terceros.

pawn Код:
if(strcmp(cmdtext, "/yosoynoob", true) == 0)
{
   new string[128], J[MAX_PLAYER_NAME];
   GetPlayerName(playerid, J, sizeof(J));
   format(string, sizeof(string), "Jugador %s es mucho noob", J);
   return SendClientMessageToAll(0xFFF000AA, string);
}
Tu llegaste a ser noob, no? O naciste con todos los conocimientos?

En fin, cada quien.

Buen tutorial.
Reply
#7

Todo depende del caso, cuando trabajas con strings dinбmicos lo normal es crear una constante con el mбximo de celdillas permitidas, estas celdillas para los que no lo sepan se guardan en la memoria ram, y el carбcter nulo es usado para que una funciуn que lea en la memoria pueda determinar el fin de cadena, por que sino, funciones como printf seguirнan aumentando celdillas y imprimiendo "basura". Para comprender todo esto recomiendo la lectura de libros de C/C++. El manejo de punteros y la asignaciуn dinбmica de memoria a "bajo nivel" que ofrece estos lenguajes te darб una experiencia inolvidable. Volviendo a lo anterior, funciones como "realloc" en C/C++ permiten realojar el tamaсo de un bloque de memoria y crear strings dinбmicos. Creo que explicas mal la situaciуn, ya que tu estбs usando un tamaсo semi-estбtico, lo del semi estбtico es por que lo ъnico que variarб sera el tamaсo del nick, que aunque sabemos que es < que MAX_PLAYER_NAME no sabes el tamaсo exacto que tendrбn los nicks al momento de compilar.

Quote:

if(strcmp(cmdtext, "/yosoynoob", true) == 0)
{
new string[128], J[MAX_PLAYER_NAME];
GetPlayerName(playerid, J, sizeof(J));
format(string, sizeof(string), "Jugador %s es mucho noob", J);
return SendClientMessageToAll(0xFFF000AA, string);
}

En ese caso si, es 21 + MAX_PLAYER_NAME + Null Char, pero en el caso de que sea una cadena introducida por ejemplo, en un Diбlogo, simplemente marcas un mбximo, #define MAX_INPUT_TEXT 124 por ejemplo, creo que pawn tiene librerнas estбndar para alojamiento dinбmico de memoria, de todos modos, y como bien explica ******, si el SA-MP tiene un input y un output que no puede superar las 128 celdillas ( 512 bytes, cada carбcter en memoria ocupa 4 bytes, 4 * 128 = 512) todo se reduce a eso, asignar 128 celdillas a las cadenas y ya fuй
Reply
#8

[pawn ] [/pawn ] para los cуdigos en PAWN
Reply
#9

Quote:
Originally Posted by Lunnatiicz
Посмотреть сообщение
Esta bien el tutorial, pero no me gusta como te diriges a terceros.

pawn Код:
if(strcmp(cmdtext, "/yosoynoob", true) == 0)
{
   new string[128], J[MAX_PLAYER_NAME];
   GetPlayerName(playerid, J, sizeof(J));
   format(string, sizeof(string), "Jugador %s es mucho noob", J);
   return SendClientMessageToAll(0xFFF000AA, string);
}
Tu llegaste a ser noob, no? O naciste con todos los conocimientos?

En fin, cada quien.

Buen tutorial.
No me dirigi a terceros, pero foi la unica cosa que me lembrou no mumento.
Gracias
Reply
#10

en que afecta si yo uso memoria extra?
pawn Код:
if(strcmp(cmdtext, "/yosoynoob", true) == 0)
{
   new string[1024], J[MAX_PLAYER_NAME];
   GetPlayerName(playerid, J, sizeof(J));

   format(string, sizeof(string), "Jugador %s es mucho noob", J);
   return SendClientMessageToAll(0xFFF000AA, string);
}
Quote:
pawn Код:
"/yosoynoob"
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)