[Guía] Variables.

Aprende lo que no sabes de este lenguaje y encuentra herramientas y códigos útiles.

Moderador: Ayudantes

Reglas del Foro
  • Si tu código es corto, no crees un tema nuevo para liberarlo, publica un mensaje en el tema [Funciones] ¡Publica tu código aquí!.
  • Si creas una guía, debes explicar el código claramente. Evita poner la explicación en forma de comentarios dentro del mismo y no olvides utilizar el BBCode correspondiente: [Pawn]Código aquí[/Pawn].
  • No postear códigos sin probar. Publicar códigos con errores (que impidan compilar el script para el cual está destinado) en este apartado es motivo de sanción.
  • Si tu código necesita plugins, includes u otros códigos adicionales para funcionar, debes mencionarlo en el mensaje.
  • Si has utilizado códigos de otros autores, recuerda colocar los créditos correspondientes. (El plagio es motivo de sanción).
  • Si tu aporte es para un GameMode en específico, debes publicar el tema en el apartado "Guías y Aportes para GameModes específicos".
Responder
Avatar de Usuario
MattHudson
Moderador Global
Moderador Global
Mensajes: 1666
Registrado: 31 Oct 2015 18:16
Ubicación: Argentina, Buenos Aires, San Miguel.
Contactar:
Reputación: 89

01 Feb 2017 01:45

Guía
Variables



Básicamente, una variable es un bit de memoria, donde datos son almacenados y pueden sen modificados o leídos si se lo precisa. Las variables son una o mas celdas, una celda vale 32 bits (4 bytes) y son limitadas por defecto, pueden almacenar entre -2147483648 y 2147483647 (aunque -2147483648 esta mal definido en PAWN y otorga resultados extraños(números randoms)). Una variable hecha con mas de una celda es llamada un "Array", los "Strings" son tipos especiales de "Arrays" donde cada celda almacena un carácter del "String" enteros.
Variables

Declaración de variables

Para crear una nueva variable, debes declararla:
 Codigo Pawno:
1

new MiVariable;
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 1
Esto le ordena al sistema que cree una nueva variable llamada "MiVariable", el valor iniciar de la misma va a ser 0.


Configuración de variables

 Codigo Pawno:
1

new MiVariable = 7;
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 1
Esto declara una nueva variable, y modifica su valor inicial a 7, entonces al imprimir la variable en la consola, nos dará un valor de 7. Para mostrar una variable que no es un string, debemos usar la función "printf()" y hacer:
 Codigo Pawno:
1
2

new MiVariable = 7;
printf("%d", MiVariable);
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 2
De momento todo lo que debes saber es que esto va a imprimir el valor de MiVariable (el cual declaramos como "7") a la consola del servidor.
 Codigo Pawno:
1
2
3
4

new MiVariable = 7;
printf("%d", MiVariable);
MiVariable = 8;
printf("%d", MiVariable);
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 4
Este codigo va a declarar que el valor inicial de MiVariable sea 7. En un momento lo imprimimos, y luego le modificamos el valor a 8. Lo imprimimos nuevamente, y el valor sera 8.
Hay otras cosas que puedes hacer con las variables, entre ellas:
 Codigo Pawno:
1
2
3
4
5
6
7
8

MiVariable = MiVariable + 4; // A MiVariable le das el valor de MiVariable sumándole 4.
MiVariable += 4; // También puede ser escrito así, ya que aquí sumas 4 al valor de MiVariable.

MiVariable -= 4; //Aquí lo mismo, pero le reduces 4 valores.

myVariable *= 4; //Aquí lo mismo, pero le multiplicaras el valor por 4.

MiVariable /= 4; //Aquí lo mismo, pero le dividirás el valor por 4.
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 8

Arrays


Declaración de Arrays

Un array es una variable en la cual almacenas múltiples piezas de datos en una misma, y accedes a ellas dinamicamente. Un array es declarado a un tamaño al compilar, por lo tanto, debes saber cuantas piezas de datos debes tener para almacenarlas, un ejemplo es el famoso array de "MAX_PLAYERS", este va a tener un slot para cada jugador conectado, entonces los datos de un jugador conectado, no interfiera con los de otro.
 Codigo Pawno:
1

new MiArray[5];
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 1
Este código declara un array con 5 slots máximos, entonces puedes almacenar 5 piezas de datos en una misma variable. No puedes hacer algo como lo siguiente:
 Codigo Pawno:
1
2
3

new
    MiVariable = 5,
    MiArray[MiVariable];
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 3
Este código aparenta que crea un array según el tamaño del numero almacenado en MiVariable (Aquí es 5, pero es solo un ejemplo), pero no puedes hacer esto. En PAWN, la memoria para las variables es asignada cuando compilas el código, esto significa que los arrays siempre tiene un valor, no puedes aplicarlos cuando tu quieras.


Acceder a Arrays.

Para darle un valor a un array, debes aclararle al gamemode que parte del array quieres modificar, esto puede ser hecho con otra variable incluso.
 Codigo Pawno:
1
2

new MiArray[5];
MiArray[2] = 7;
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 2
Esto declara un array de 5 slots, y modifica el valor del slot 2 del mismo, a 7.
Los slots de los array se cuentan desde el 0, por lo tanto, en este ejemplo, no hay slot 5.
Como se menciono antes, el slot del array puede ser cualquier cosa, un numero, una variable, o incluso una función que retome un valor.
 Codigo Pawno:
1
2

new MiArray[5], MiSlot = 2;
MiArray[MiSlot] = 7;
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 2
Cuando tengas un array y el slot del mismo, puedes modificar el valor del mismo como si fuera cualquier otra variable.
 Codigo Pawno:
1
2
3

MiArray[2] = MiArray[2] + 1;
MiArray[2] += 1;
MiArray[2]++;
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 3

Strings

Uso básico

Un string es un tipo especial de array, uno que solo puede ser usado para almacenar múltiples caracteres para crear una palabra/oración/etcétera. Un carácter tiene el tamaño de un byte (Aunque hay modificaciones extendidas donde un carácter vale múltiples bytes, pero SA-MP no lo tiene bien definido) y por defecto un carácter toma una celda (una variable normal o un slot de array). Los caracteres son codificados en un sistema llamado "ASCII".
 Codigo Pawno:
1

new MiString[16] = "Hola Mundo!";
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 1
Este código declara que "MiString" soporta 15 caracteres(Como detalle en los arrays anteriormente, se cuenta desde el 0) y le da el valor de un string que contenga "Hola Mundo!", las comillas entre las cuales se ubica el texto, indica que lo que esta dentro de ellas, es el string.

Los strings pueden ser manipulados como arrays comunes, ejemplo:
 Codigo Pawno:
1
2

new MiString[16] = "Hola Mundo!";
MiString[1] = 97;
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 2
El de arriba, cambia el carácter en el slot 1 por el carácter representado por el numero 97(a), dado como resultado que diga "Halo". Puede ser mas fácil de editar, ejemplo:
 Codigo Pawno:
1
2

new MiString[16] = "Hola Mundo!";
MiString[1] = 'a';
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 2
La comilla simple entre la "a" significa que es un carácter, no un string, los caracteres no necesitan ser terminados nulamente ya que solo tienen una celda de tamaño, estos también pueden ser intercambiados por números si sabes lo que representan.
 Codigo Pawno:
1
2

new MiString[16] = "Hola Mundo!";
MiString[1] = '\0';
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 2
'\0' son dos caracteres, pero el \ es un símbolo especial que modifica el siguiente carácter. \0 significa un carácter nulo, es lo mismo que hacer:
 Codigo Pawno:
1
2

new MiString[16] = "Hola Mundo!";
MiString[1] = 0;
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 2
Pero no es lo mismo que hacer:
 Codigo Pawno:
1
2

new MiString[16] = "Hola Mundo!";
MiString[1] = '0';
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 2
La primera y la segunda versión van a resultar en el string siendo simplemente:
H
La tercera versión hará que el string resulte así:
H0la


Carácter "\"

Esta barra es un carácter especial.
Haciendo:
 Codigo Pawno:
1

'\'
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 1
O:
 Codigo Pawno:
1

"\"
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 1
Va a dar un error del compilador, porque el \ modifica el siguiente carácter, entonces esos constantes no van a terminar correctamente, esto puede ser usado para crear caracteres que no pueden ser creados normalmente. Ejemplo:
 Codigo Pawno:
1

new MiString[4] = "\"";
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 1
Este código va a insertar una comilla, cosa que no se puede hacer sin el mismo \. Otros caracteres especiales son:

Código: Seleccionar todo

\0  Caracter nulo    Termina un string.
EOS	Caracter nulo    (Lo mismo que el anterior)
\n	Nueva linea      Termina una linea y comienza otra nueva.
\r	Nueva linea      Usado en Windows cuando \n no se podía usar en el mismo.
\\	Símbolo \        Coloca el símbolo \
\'	Comilla          Inserta una comilla.
\"	Doble comilla    Lo mismo que el anterior, pero con dobles comillas.
Hay mas, pero esos son los mas usados.


Tags

Un tag es algo adicional a la información de una variable declarada, estos definen como pueden ser usadas. Ejemplo:
 Codigo Pawno:
1

new Float:a = 6.0;
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 1
El "Float" es el tag, esto define que la variable "a" es un numero real(Float) y determina como puede ser usado.
 Codigo Pawno:
1

native SetGravity(Float:gravity);
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 1
Esto significa que la función SetGrafity toma un solo parámetro que tiene que ser un numero real. Ejemplo:
 Codigo Pawno:
1
2
3

SetGravity(6.0);
new Float:fGrav = 5.0;
SetGravity(fGrav);
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 3
Esto va a darle un valor de 6(6.0 como un numero real), luego 5(5.0 como un numero real). Usando el tag equivocado va a dar la advertencia de Tag Mismatch(En la mayoría de ocaciones):
 Codigo Pawno:
1

SetGravity(MiTag:7);
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 1
Esto va a tratar de modificar la gravedad a 7 con el tag "MiTag", eso no es un numero entero, entonces es erróneo.

Tags personalizados pueden ser definidos por los usuarios:
 Codigo Pawno:
1
2

new MiTag: Variable = 0,
Tag1: Otro = 1;
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 2
Esto es valido, de todos modos, al añadir estas dos variables directamente, debes usar '_:' para "des-tagearlos", de todas formas el compilador va a producir una advertencia de Tag Mismatch -_-



Scope

Un scope es donde una variable puede ser usada. Hay 4 scopes principales: loca, local static, global y global static. Todas las variables pueden ser usadas luego de que son declaradas, entonces esto es lo correcto:
 Codigo Pawno:
1
2

new var = 4;
printf("%d", var);
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 2
Esto esta mal:
 Codigo Pawno:
1
2
3

printf("%d", var);
new
    var = 4;
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 3



local

Una variable "local" es declarada nuevamente dentro de una parte de una función:
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10
11
12

MiFuncion()
{
    new var1 = 4;
    printf("%d", var1);
    {
        // var1 sigue existiendo ya que es un nivel inferior.
        new var2 = 8;
        printf("%d %d", var1, var2);
    }
    // Dejo de existir var2.
}
// Aca dejo de existir var1.
  Cantidad de llaves: Abiertas(2)-Cerradas(2) | Lineas Totales: 12
Las variables locales son reseteadas todo el tiempo, ejemplo:
 Codigo Pawno:
1
2
3
4
5
6

for (new i = 0; i < 3; i++)
{
    new j = 1;
    printf("%d", j);
    j++;
}
  Cantidad de llaves: Abiertas(1)-Cerradas(1) | Lineas Totales: 6
Va a imprimir:

Código: Seleccionar todo

1
1
1
Porque j es creada, imprimida, incrementada y destruida, luego el código buclea.


static local

Un static local puede ser usado en el mismo lugar que un local, pero no hay que olvidar que es un valor viejo. Ejemplo:
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10
11
12
13

MiFuncion()
{
    static var1 = 4;
    printf("%d", var1);
    {
        // var1 existe aun ya que es un nivel inferior.
        static
            var2 = 8;
        printf("%d %d", var1, var2);
    }
    // var2 no existe mas ya que es un nivel superior.
}
// var1 no existe mas.
  Cantidad de llaves: Abiertas(2)-Cerradas(2) | Lineas Totales: 13
Ese código hará lo mismo que el anterior ejemplo, mientras que esto:
 Codigo Pawno:
1
2
3
4
5
6

for (new i = 0; i < 3; i++)
{
    static j = 1;
    printf("%d", j);
    j++;
}
  Cantidad de llaves: Abiertas(1)-Cerradas(1) | Lineas Totales: 6
Imprimira:

Código: Seleccionar todo

1
2
3
Porque j es static, entonces esto recuerda su antiguo valor.


global

Las variable globales son declaradas fuera de las funciones y pueden ser usadas en cualquiera de las mismas.
 Codigo Pawno:
1
2
3
4
5
6

new
    gMiVar = 4;
MiFuncion()
{
    printf("%d", gMiVar);
}
  Cantidad de llaves: Abiertas(1)-Cerradas(1) | Lineas Totales: 6
No son reseteadas o perdidas nunca.


global static

Las variables globales y estáticas son como globals normales pero solo pueden ser usadas en el archivo donde son declaradas:
 Codigo Pawno:
1
2
3
4
5
6

//Archivo1:
static gsMiVar = 4;
MiFuncion1()
{
    printf("%d", gsMiVar);
}
  Cantidad de llaves: Abiertas(1)-Cerradas(1) | Lineas Totales: 6
 Codigo Pawno:
1
2
3
4
5
6
7

//Archivo2:
#include "Archivo2"
MiFuncion2()
{
    // Esto esta mal ya que gsMiVar no existe aquí.
    printf("%d", gsMiVar);
}
  Cantidad de llaves: Abiertas(1)-Cerradas(1) | Lineas Totales: 7
statics pueden ser aplicados a funciones en la misma forma.

Creditos:
Ejemplos:Wiki inglesa.
Traducción del post "Variables" de la wiki: Yo.
40% del post son oraciones mías para facilitar la comprensión del usuario lector de la guía.
Tiempo de realización: No se, solo se que hubiese podido jugar varias partidas de Paladins si no hacia esta guía :(


¡Gracias por leer!



EDIT 1:
-Corregi un error en un bbcode.
Última edición por MattHudson el 01 Feb 2017 01:52, editado 1 vez en total.
SALAS
Aprendiz
Aprendiz
Mensajes: 656
Registrado: 03 Jul 2016 19:57
Reputación: 4

01 Feb 2017 01:47

Oh MattHudson, Oh!!Que placer leer tus guias!!Siempre tan detalladas y tan completas!
Felicitaciones!
Avatar de Usuario
MattHudson
Moderador Global
Moderador Global
Mensajes: 1666
Registrado: 31 Oct 2015 18:16
Ubicación: Argentina, Buenos Aires, San Miguel.
Contactar:
Reputación: 89

01 Feb 2017 01:53

Paulo Arce escribió:Oh MattHudson, Oh!!Que placer leer tus guias!!Siempre tan detalladas y tan completas!
Felicitaciones!
Cabe destacar que la poca falta de detalles es gracias al tema de la Wiki. Yo solo saco información para no olvidar de ponerla, la traduzco, y facilito su comprensión lectora si es posible y necesario.

Gracias por comentar.
Avatar de Usuario
scriptnoob
Junior
Junior
Mensajes: 646
Registrado: 21 Feb 2014 10:41
Ubicación: Argentina - Santa Fe - Rosario
Contactar:
Reputación: 22

01 Feb 2017 13:19

Muy buena guía, les servirá mucho a los que recién empiezan en pawn y mas a las personas que copian y pegan variables y les surgen errores. Esta bien explicado y bien plasmado.

Ojala aportes mas publicaciones así y mejores la comunidad.
Saludos.
Portfolio: Youtube.

Medio retirado de la programación pawn.
Estudiante de Ingenieria en Sistemas de Información.

Avatar de Usuario
MattHudson
Moderador Global
Moderador Global
Mensajes: 1666
Registrado: 31 Oct 2015 18:16
Ubicación: Argentina, Buenos Aires, San Miguel.
Contactar:
Reputación: 89

01 Feb 2017 13:40

scriptnoob escribió:Muy buena guía, les servirá mucho a los que recién empiezan en pawn y mas a las personas que copian y pegan variables y les surgen errores. Esta bien explicado y bien plasmado.

Ojala aportes mas publicaciones así y mejores la comunidad.
Saludos.
¡Gracias!

Eres uno de mis ejemplos a seguir con respecto a PawnScript -grin. Un honor para mi que me hayas comentado una guía -hi
Hago las guías con fin de que el nivel de los usuarios del foro aumente considerablemente, tanto para usuarios nuevos en programación en Pawn(ya que trato de enfocarme mas en el Pawn y no en las áreas que SA-MP brinda a el mismo), y para los que tienen dudas de lo explicado en mis guías.

Posdata:
Si me aburro, quizás añada una nueva parte con respecto a errores comunes, aunque la mayoría son explicados a lo largo de la guía, pero algo complicado de distinguirlos si no esta estructurado.
PedroMojica!
Aprendiz
Aprendiz
Mensajes: 17
Registrado: 22 Ene 2017 20:56
Ubicación: En el corazon de Nietzsche.
Reputación: 2

22 Ago 2017 02:27

Muy buena, ya sabía el tema pero por ejemplo no sabia la mielda esa de insertar las nuevas lineas osea me conocia muchas cosas de esas, pero no todas las que dices ahi. Sin duda buena guia, hubiera querido una asi apenas empezaba a jugar con pawn xD
Aspirante a MSc.
quiang_lee
Aprendiz
Aprendiz
Mensajes: 41
Registrado: 26 Mar 2018 00:33
Reputación: 0

04 Jul 2019 12:14

oye men a que te refieres con imprimir mi variable?
Responder