Buenos dias-tardes-noches. Hoy les tengo un tutorial de entender al lenguaje pawn. Este tutorial esta dividido por niveles de dificultad (basico, medio, avanzado). Bueno pawn es un lenguaje muy amplio, pero vamos a ir conociéndolo paso a paso. Bueno empezemos:
Nivel: Basico.
Variables y Arrays:
¿Qué es una variable?
La respuesta es muy simple:
Una variable es un pedacito de memoria que se reserva para el programa durante la ejecución del mismo, para almacenar información, que luego usara.
Para definir una variable en pawn, la forma más simple es utilizar "new" y se utiliza de la siguiente forma.
Esa sentencia define "MiVariable" como una variable de tipo entero (en ingles integer).
¿Qué es un tag, y cuáles de variables existen?
Un tag es un pedacito de código, que asignación la hora de compilar, brinda información extra sobre la variable que definimos.
Tags:
Float => almacena números enteros y números con coma.
File => almacena el handle de un archivo abierto. (no se preocupen de que es un handle, luego lo explicare).
Bool => almacena true o false, verdadero o falso.
Integer => almacena números enteros.
¿Cómo definimos una variable con un tag?
Para definir una variable de tag float o file, lo vamos a hacer de la siguiente forma:
Ejemplos:
•float:
•file:
•bool:
•integer:
Tipos de variables:
Integers: Sirven para almacenar numeros SIN decimales, Ejemplo:
Flotantes: Sirven para almacenar numeros con decimales, Ejemplo:
String: Más bien dicho son "arrays" pero se les llaman string por que string proviene del ingles y en español significa cadena, les llaman string por que se estan refiriendo a que almanecaran una "cadena de texto" Ejemplo:
Ahora, posiblemente se estén preguntando "¿Por qué no se utiliza integer:nombre?", esto es porque pawn por defecto, si no se le especifica, define las variables como integers.
¿Qué es un array?
Para simplificarlo, un array es lo mismo que una variable, pero puede contener una mayor cantidad de datos, en vez de solo 1.
¿Cuales son los tags de los arrays?
Los mismos tags que tienen las variables, y se los especifica de igual forma. "tag:nombre".
¿Cómo defino un array?
La forma de definir un array es muy sencilla, de hecho es = que definir una variable, excepto que tiene una diferencia.
Como pueden ver, solo varia [n]; en este caso, n=4.¿Qué representa "n"? n representa el tamaño de ese array.
!Importante: A la hora de definir un array, debemos tener en cuenta, que este nunca puede tomar el valor de la definición.
Ejemplo:
Ahora que más o menos tenemos idea de cómo se declara una variable y un array, veremos otras formas de declararlos.
Tipos de variables/arrays:
Estos métodos se aplican tanto para variables como para arrays, así q los mezclare para variar un poco.
Existen 4 tipos, de los cuales ahora veremos los dos más fáciles de aprender.
Local
Definición:
Solo puede ser utilizada dentro del entorno en el cual es declarada(ej.: Callbacks, funciones, etc.). Para declarar una variable/array de este tipo, la declaración debe ser realizada dentro del entorno en el que se desea usar la variable/array.
Ejemplificación:
Global
Definición:
Puede ser utilizada en todo el proyecto. Para declarar una variable/array de este tipo, debe declararse fuera de cualquier función o callback.
Ejemplificación:
!Importante: Tenemos que tener en cuenta, que cuando declaramos una variable/array tanto local, la variable existe dentro de los espacios inferiores, pero no en los superiores.
Operadores:
¿Qué es un operador?
Un operador es un símbolo que se utiliza en expresiones, o bien para realizar una acción.
¿Cuáles son los Operadores?
Aritméticos:
•A + B => Retorna la suma de A y B.
•A - B => Retorna la resta de A y B.
•A * B => Retorna la multiplicación de A y B.
•A / B => Retorna la división de A y B.
•A % B => Retorna el resto de la división de A y B.
Asignación:
•A = B => Asigna a A el valor de B.
•A ++ => Asigna a A el resultado de A+1.
•A -- => Asigna a A el resultado de A-1.
•A += B => Asigna a A el resultado de A+B.
•A -= B => Asigna a A el resultado de A-B.
•A *= B => Asigna a A el resultado de A*B.
•A /= B => Asigna a A el resultado de A/B.
•A %= B => Asigna a A el resto de A/B.
Racionales(numéricos):
•A == B => Retorna "true" si A=B, de lo contrario retorna "false".
•A != B => Retorna "false" si A=B, de lo contrario retorna "true".
•A < B => Retorna "true" si A<B, de lo contrario retorna "false".
•A > B => Retorna "true" si A>B, de lo contrario retorna "false".
•A <= B => Retorna "true" si A<=B, de lo contrario retorna "false".
•A >= B => Retorna "true" si A>=B, de lo contrario retorna "false".
Racionales(booleanas):
•!B => Retorna "true" si B=false, de lo contrario retorna "false".
•A || B => Retorna "true" si A=true o B=true, de lo contrario retorna "false".
•A && B => Retorna "true" si A=true y B=true, de lo contrario retorna "false".
Misceláneos:
•([]) => Se utiliza para la declaración de arrays.
Expresiones:
¿Qué es una expresión?
Una expresión es una combinación de variables/arrays, funciones, que son evaluadas según los parámetros indicados. (si no entienden, no se preocupen, luego entenderán)
¿Cuáles son las expresiones que existen y cómo se utilizan?
Existen 16 expresiones, pero ahora solo veremos algunas. Más adelante veremos las demás.
if
Es una de las expresiones más importantes, se utiliza para comparar, y según el resultado de la comparación, se realiza o no una determinada acción.
Ejemplo:
!Importante: Cuando el código a ejecutar si la comparación es verdadera es de 1 línea o 1 sentencia (ejemplo1), no es necesario usar brackets, de lo contrario estos se deben colocar(ejemplo2).
else
Es al igual que if una de las expresiones más importantes, y también una de las más utilizadas. Su uso consiste en el opuesto de
Ejemplo:
assert
Es similar a if, pero si es falso, entonces retorna(fin del callback/función)
Ejemplo:
En el ejemplo dado, si la variable num es > 0 entonces escribirá el valor de num en la consola, de lo contrario retornan.
return
Se utiliza para retornar un valor de una función/callback, o bien para salir (de la)/(del) misma/o
Ejemplo:
Caracteres Especiales
•( \ ) => Indica que la línea actual, sigue en la de abajo.
•( ; ) => Fin de sentencia.
Nivel: Medio.
Inicializadores:
Bueno ahora vamos a avanzar un poco más allá de las clásicas definiciones y vamos a comprender un poco más sobre este lenguaje de programación de scripts.
Ahora vamos a aprender un poco sobre:
new, enum, forward y publica.
new
¿Cómo se usa new?
bueno esto no lo vamos a ver, ya que es realmente algo muy básico, y lo explique anteriormente.
Lo que realmente vamos a ver es porque usar new y no otros, es decir vamos a ver el correcto uso de esta sentencia.
La verdad es que no es muy complicado el uso de esta sentencia.
Cuando usar new
•Si necesitamos declarar una variable/array a nivel local, cuyo contenido pueda cambiar.
•Si necesitamos declarar una variable/array a nivel global, cuyo contenido pueda cambiar.
Cuando no usar new
•Para declarar una función.
•Para declarar un callback.
•Para declarar un array que no cambiara su contenido.
Enums
¿Qué es un enum?
Básicamente un enum, consiste en una lista.
¿Cómo se define un enum?
Un enum como tal, se define de la siguiente forma:
llevado a la práctica y para más fácil lectura, podemos crear algo así:
¿Qué utilidad tienen los enums?
Generalmente los enums se suelen utilizar para listar datos. El más usado de ellos similar al anterior, para luego obtener los datos y asignarlos en un array
Ejemplo:
public
¿Qué es y para qué sirve public?
Sirve para la declaración de funciones/callbacks o bien variables.
¿Cuándo usar publica?
•Se utiliza para la declaración de funciones/callbacks que deben ser accesibles desde todos los documentos.
•También se puede utilizar para la declaración de variables que necesitamos que el host pueda modificar, ya que el host no puede modificar variables declaradas con new.(siempre variables globales)
forward
¿Qué es y para qué sirve forward?
forward le "dice" de cierta forma que la función que se declara luego del mismo, "viene después". Esto es así ya que las funciones estándar declaradas en pawn, no son declaradas hasta su uso.
pero las funciones declaradas como publica, no son estándar y pawn exige la declaración de las mismas antes de su uso. Por eso se usa "forward función(parámetros);"
¿Cuándo usar forward?
Siempre que se declare una función/callback del tipo public.
Definiciones
Dimensiones de un array
Ese array es unidimensional, ¿Qué quiere decir eso? Que solo tiene una dimensión.
¿Puede un array tener más de una dimensión?
Si, puede y pawn soporta hasta tres dimensiones.
Acá les dejo unos "gráficos" simples para que lo puedan entender mejor.
Unidimensional:
Cada una de esas x, puede contener un valor diferente.
Bidimensional:
Cada una de esas x, puede tener un valor diferente, que a su vez contiene otro valor. (Si no lo entienden no se preocupen. luego lo explicare de otra forma)
Tridimensional:
Ahora bien, supongamos que tengo declarado un array así:
y luego le agrego un valor.
Gráficamente:
Ahora, posiblemente, se estén preguntando por qué en la 3 posición? cuando en el índex del array(numero q indica la posición del array a utilizar) es "2".
eso es porque todos los arrays empiezan con el índex 0 y no con el 1.
Gráficamente:
Otro ejemplo.
Gráficamente:
Del mismo modo con un array tridimensional. dado que no se puede representar en un plano, les dejo el link a un grafico. para los 3 tipos de arrays (principalmente miren la estructura del tridimensional). Link
Inicialización
El concepto de inicialización hace referencia al valor que se le da a una variable/array al crearlo.
por defecto en una variable su valor es "", mientras q en un array cada uno de los valores q puede contener es 0.
¿Cómo inicializar una variable?
La inicialización de una variable es realmente muy simple, consiste en setear el valor correspondiente.
La variable se inicia en 5.
¿Cómo inicializar un array?
Es un poco más complicado que una variable, pero aun así sigue siendo algo simple.
En los ejemplos dados anteriormente se inicializan los arrays definidos ya con los valores seteados.
Esta forma de inicializar un array es = que hacer:
Es decir que ... llena los espacios en blanco con el valor de la sucesión que sigue.
en el ejemplo anterior el Array sería igual a
Operadores
Operadores misceláneos:
•({}) => Se utiliza para la declaración del contenido de arrays.
•defined => Retorna "true" si la variable indicada fue definida mediante "#define".
•sizeof() => Retorna el tamaño de un array.
•tagof() => Retorna el tag de una variable/array.
•char => Retorna el numero de cells que se necesitan para contener un string compactado.
Expresiones
switch, case(simple) y default:
Estas expresiones, van siempre juntas y se utilizan para realizar comparaciones en las cuales se quiere que según el valor, se realice una acción. Puede ser reemplazada por if, else if, else if, else, pero usando if sería más lenta y menos efectiva.
Ejemplo:
!Importante: cuando luego de la expresión "case" sigue una sola línea, o un if(sin else/else if) la expresión puede ir libre de brakets, de lo contrario es necesario colocarlos.
for
Es un loop o bucle que consiste en tres pasos. El 1º consiste en la iniciación, el 2º es la comparación y el 3º es la renovación. Cada paso se separa por ";".
En el código anterior, creamos un bucle que recorre la id de todos los jugadores. luego chequea si estos están conectados, y finalmente si lo están, lo escribe en la consola.
!Importante: Funciona = que el if, respeto de los brackets y las sentencias.
do
Es otro tipo de bucle, pero a diferencia del for, solo consta de 1 paso. El chequeo.
Ejemplo:
Este ejemplo es = al ejemplo dado con el for, pero con la sentencia do.
while
Esta expresión, también es utilizada para realizar un bucle, y la forma es muy similar a la de la expresión "do".
Loops(infinitos)
Bueno, en esta pequeña parte de este tutorial, explicare como crear loops infinitos de diferentes formas.
Método 1:
Método 2:(tira 1 warning, pero funciona perfecto)
Método 3:(tira 1 warning, pero funciona perfecto)
Esas son 3 formas de hacer un loop infinito. Hay mas formas pero son todas similares, así que decidí poner solo esas.
Directivas
#if, #elseif, #else, #endif
Definición:
Se utiliza para comparar una sentencia.
Ejemplo:
#error
Definición:
Se utiliza para enviar un error durante la compilación.
Ejemplo:
#assert
Definición:
Chequea si una comparación devuelve true o false. En caso de ser false, detiene la compilación.
Ejemplo:
Ese ejemplo enviara un error fatal con el texto "assertion failed: 6<4"
#include
Definición:
Inserta el texto del archivo a incluir en la línea en la que se ubica.
Ejemplo:
#tryinclude
Definición:
Funciona igual que #include, con la diferencia de que si no puede incluir el archivo, no envía un error.
Ejemplo:
#define
Definición:
Crea una macro.
Ejemplo:
Caracteres Especiales (Strings)
•( \a ) => Beep
•( \b ) => Backspace
•( \e ) => Escape
•( \n ) => Nueva Línea
•( \r ) => Retorno de Carro (se utiliza en Windows para una línea nueva "/r/n")
•( \t ) => Tabulación Horizontal
•( \v ) => Tabulación Vertical
•( \\ ) => Inserta literalmente el símbolo '\'
•( \’’ ) => Inserta literalmente el símbolo "'"
•( \" ) => Inserta literalmente el símbolo '"'
•( \% ) => Inserta literalmente el símbolo '%'
•( \ddd; ) => código de caracteres, con el código en decimal "ddd"
•( \xhhh; ) => código de caracteres, con el código en hexadecimal "hhh"
Creación de funciones
¿Qué es una función?
Podemos definir a una función como un conjunto de acciones que se realizan cuando llamamos a la función.
¿Cómo crear una función?
por ahora veremos solo estas 3 formas de definir una función:
Forma 1:
Pero esta función si no se utiliza, nos dará 1 advertencia diciendo que no estamos usando ese símbolo
Forma 2:
Forma 3:
Funciones sin parámetros
Estas son las funciones más simples de hacer, dado que solo ejecutan el código dado. Generalmente se crean funciones así para cargar configuraciones de un sistema, o para realizar varias cosas.
Ejemplo:
Esa es una función muy simple que solo kickea a todos los jugadores conectados.
Funciones con parámetros
Estas funciones aun son simples de hacer, pero le agregamos una complicación más. Los parámetros de una función funcionan = que variables/arrays, y hay veces que se les debe asignar un tag en su declaración
Ejemplo:
Funciones con retorno de valores
Las funciones pueden retornar valores, pero el tipo de valor retornado debe ser siempre igual.
Existen dos formas de retornar valores:
Ahora voy a mostrar una forma errónea de retornar valores.
La función Suma, va a generar un error a la hora de compilar, dado que el primer valor que retorna es un string o array, mientras que el segundo es un numero entero.
Nivel: Avanzado.
Inicializadores (avanzado)
Ahora ya con un mayor conocimiento, vamos a ver stock, static, const y operator.
stock
Vamos a ir directo al grano, dado que entender stock es lo más fácil de esta sección.
¿Cómo se utiliza?
stock se utiliza para la declaración de variables o funciones que no estamos seguros si vamos a utilizar o no. Utilizando stock, el compilador si no se utiliza, no la define.
static
Se puede declarar una variable/array local estática o global estática.
Local estática
Definición:
Tiene la misma función que la variable/array local, pero a diferencia de la anterior, esta guarda la información.
Ejemplificación:
Ese código va a escribir en la consola:
Mientras que si la variable no fuera local estática, escribiría en la consola:
Global estática
Definición:
Tiene la misma función que la variable/array global, pero solo puede utilizarse en el archivo que se declara.
Ejemplificación:
const
Cuando declaramos una variable como constante, significa que la misma no podrá ser modificada.
¿Cómo se declara una variable const?
eso es muy sencillo:
¿Cuándo se declara una variable const?
Existen 3 opciones comunes:
•Para crear un array constante.
•Para una variable pública(publica) que debe ser seteada obligatoriamente por el host y solo por el host.
•En los parámetros de una función.
operator
Se utiliza para declarar un tag propio.
¿Cómo se utiliza?
Es un poco complejo.
ejemplo:
Este ejemplo es realmente simple y no justificaría crear un nuevo tag. Pero es para que sea más fácil de entender.
Operadores (operadores misceláneos)
•(A) ? (B) : (C) => Es muy similar a if. Si A="true" retorna B, de lo contrario retorna C.
ejemplo:
Si Sinfo[Admin] = true, entonces en la consola aparecerá "Admin: ON", de lo contrario aparecerá "Admin: OFF".
Operadores de Bits(manipulación)
•~A => Retorna el complemento de A.
•A >> B => Retorna el shift aritmético de B (hacia la izquierda) sobe A.
•A >>> B => Retorna el shift lógico de B (hacia la izquierda) sobre A.
•A << B => Retorna el shift de B (hacia la derecha) sobre A.
•A & B => Retorna A "and" B.
•A | B => Retorna A "or" B.
•A ^ B => Retorna A "exclusive or" B.
Operadores de Bits(Asignación)
Esos operadores son iguales a los de asignación común, y a estos se les suman los de manipulación de bits (siempre con el signo = después del signo de manipulación).
Expresiones(Loops(avanzado), saltos, sleep y state)
break
Se utiliza para terminar con un bucle.
Ejemplo:
continue
Se utiliza para saltar un valor en un bucle.
Este ejemplo dará como resultado en la consola:
goto
Esta expresión se utiliza para realizar un sato, para ir a x lugar del código, previamente definido.
Ejemplo:
El ejemplo por ahí no sea muy claro, pero lo que ese código hace es:
1º definir la variable(tipo boolean).
2º empieza con el bucle, y asigna un valor a la variable según sea 0 o 1 el número obtenido en el if.
3º compara el contenido de la variable y si es false, vuelve a empezar, de lo contrario termina.
sleep
Se utiliza para parar la aplicación durante x milisegundos. Aun que esta expresión figura en el manual de pawn, dudo que funcione.
Ejemplo:
En este caso, la consola quedaría detenida durante 1 segundo.
Si la función no funciona, acá dejo una para aquellos a los que les interese:
state
Se utiliza para cambiar el estado de un autómata. Su uso es:
Directivas
#define
Definición:
Crea una macro. puede ser una función o solo una constante.
Ejemplo:
Constante:
Función:
Dado que el tema de las macros es muy amplio, y ya ha sido explicado por Y_Less les dejo el Link
#endinput
Definición:
Deja de incluir el archivo que estaba siendo leído.
Ejemplo:
#pragma
Definición:
Esta directiva, puede tomar muchos valores:
amxlimit (valor):
Setea el valor máximo del tamaño que puede alcanzar el archivo .amx del script.
amxram (valor):
Setea el valor máximo de memoria ram que puede utilizar el archivo .amx del script.
codepage (nombre/valor):
Setea el formato en el que deben codificarse los strings.
ctrlchar (carácter):
Setea el símbolo que indica la continuación una nueva línea (por defecto"\").
deprecated (valor):
Setea un símbolo que no se puede usar. Si el compilado lo encuentra en el script, sale un warning.
dynamic (valor):
Setea el tamaño en cells de la memoria asignada para los datos dinámicos.
Library (nombre):
Especifica el archivo (.dll o .so) del cual obtener las funciones nativas.
pack (0/1):
Cambia el modo de uso de los strings comprimidos y descomprimidos.
tabsize (value):
Setea el valor asignado a cada tabulación. (defecto: .
unused (symbol):
Especifica que no se usara ese símbolo.
#undef
Definición:
Elimina una macro declarada o una variable/array declarada con const.
Ejemplo:
Si luego de ese código, intentáramos usar COLOR_X, tendríamos que definirlo nuevamente, o el compilador, no compilaría.
Creación de funciones
Pasar parámetros como opcionales
¿Cómo hacer esto? muy sencillo.
Debemos agregar =valordefault a la variable q queramos que sea opcional y listo.
Ejemplo:
Pasar parámetros como valor y como referencia
Bueno ustedes por el momento con este tutorial solo sabían pasar archivos por valor. Ahora bien, ¿Qué significa que pasamos un archivo por valor?
Significa, que aun que nosotros editemos ese valor, el valor pasado no cambiara.
Ejemplo:
Como pueden observar Func edita los valores que se le asignan, pero los valores iniciales (val, val2, val3), siguen siendo los mismos.
Ahora bien, existe una forma de editar los valores que se le asignan a una función. Esto es lo que se conoce como "por referencia".
¿Cómo hacer eso?
muy sencillo, solo es necesario agregar el carácter '&' delante de la variable que queremos pasar como referencia, de lo contrario (si no lo ponemos), esta variable será pasada por valor.
!Importante: por defecto, los arrays no pueden ser pasados por valor, ¿Qué quiere decir esto? que si en un archivo especificamos uno de los parámetros como array, será pasado automáticamente por referencia y no por valor.
Crear funciones con parámetros variables
Para crear una función con parámetros indefinidos, debemos hacerlo utilizando '...'.
Ejemplo:
Este tutorial se encuentra en forum-samp. Creditos por el tutorial: No recuerdo el nombre del autor. http://forum.sa-mp.com/showthread.php?t=225796
Espero que les sirva, muchas gracias.
Nivel: Basico.
Variables y Arrays:
¿Qué es una variable?
La respuesta es muy simple:
Una variable es un pedacito de memoria que se reserva para el programa durante la ejecución del mismo, para almacenar información, que luego usara.
Para definir una variable en pawn, la forma más simple es utilizar "new" y se utiliza de la siguiente forma.
- Código:
new MiVariable;
Esa sentencia define "MiVariable" como una variable de tipo entero (en ingles integer).
¿Qué es un tag, y cuáles de variables existen?
Un tag es un pedacito de código, que asignación la hora de compilar, brinda información extra sobre la variable que definimos.
Tags:
Float => almacena números enteros y números con coma.
File => almacena el handle de un archivo abierto. (no se preocupen de que es un handle, luego lo explicare).
Bool => almacena true o false, verdadero o falso.
Integer => almacena números enteros.
¿Cómo definimos una variable con un tag?
Para definir una variable de tag float o file, lo vamos a hacer de la siguiente forma:
- Código:
new tag:Nombre;
Ejemplos:
•float:
- Código:
new Float:MiFloat;
•file:
- Código:
new File:MiFile;
•bool:
- Código:
new bool:MyBool;
•integer:
- Código:
new MiInteger;
Tipos de variables:
Integers: Sirven para almacenar numeros SIN decimales, Ejemplo:
- Código:
new year = 2012;
Flotantes: Sirven para almacenar numeros con decimales, Ejemplo:
- Código:
new Float:PI = 3.141592653589;
String: Más bien dicho son "arrays" pero se les llaman string por que string proviene del ingles y en español significa cadena, les llaman string por que se estan refiriendo a que almanecaran una "cadena de texto" Ejemplo:
- Código:
new cadena[5] = "Hola"; // Contiene espacio para 4 caracteres y el caracter nulo " \0 " que marca el fin de la cadena
Ahora, posiblemente se estén preguntando "¿Por qué no se utiliza integer:nombre?", esto es porque pawn por defecto, si no se le especifica, define las variables como integers.
¿Qué es un array?
Para simplificarlo, un array es lo mismo que una variable, pero puede contener una mayor cantidad de datos, en vez de solo 1.
¿Cuales son los tags de los arrays?
Los mismos tags que tienen las variables, y se los especifica de igual forma. "tag:nombre".
¿Cómo defino un array?
La forma de definir un array es muy sencilla, de hecho es = que definir una variable, excepto que tiene una diferencia.
- Código:
new MiArray[4];
Como pueden ver, solo varia [n]; en este caso, n=4.¿Qué representa "n"? n representa el tamaño de ese array.
!Importante: A la hora de definir un array, debemos tener en cuenta, que este nunca puede tomar el valor de la definición.
Ejemplo:
- Código:
new Array[5];
Array[5] = 4;//esto causara un error, dado que el índex máximo de Array es 4.
Ahora que más o menos tenemos idea de cómo se declara una variable y un array, veremos otras formas de declararlos.
Tipos de variables/arrays:
Estos métodos se aplican tanto para variables como para arrays, así q los mezclare para variar un poco.
Existen 4 tipos, de los cuales ahora veremos los dos más fáciles de aprender.
Local
Definición:
Solo puede ser utilizada dentro del entorno en el cual es declarada(ej.: Callbacks, funciones, etc.). Para declarar una variable/array de este tipo, la declaración debe ser realizada dentro del entorno en el que se desea usar la variable/array.
Ejemplificación:
- Código:
publica OnPlayerConnect(playerid)
{
new str[36+MAX_PLAYER_NAME], name[MAX_PLAYER_NAME];//declaración del array local
GetPlayerName(playerid, name, sizeof(name));
format(str, sizeof(str), ">>%s(%i) ha ingresado en el servidor", name, playerid);
SendClientMessageToAll(0xFFFF00FF, str);
return 1;
}
Global
Definición:
Puede ser utilizada en todo el proyecto. Para declarar una variable/array de este tipo, debe declararse fuera de cualquier función o callback.
Ejemplificación:
- Código:
new Connected[MAX_PLAYERS];
publica OnPlayerConnect(playerid)
{
Connected[playerid] = true;
return 1;
}
publica OnPlayerDisconnect(playerid, reason)
{
Connected[playerid] = false;
return 1;
}
!Importante: Tenemos que tener en cuenta, que cuando declaramos una variable/array tanto local, la variable existe dentro de los espacios inferiores, pero no en los superiores.
- Código:
MyFuncion()
{
new var1;
for(new i; i<5; i++){
//var1 todavía existe.
new var2;
printf("%i", var2);
var2++;
//var2 todavía existe
}
//var1, todavía existe, pero var2 no existe
}
//var1 no existe.
Operadores:
¿Qué es un operador?
Un operador es un símbolo que se utiliza en expresiones, o bien para realizar una acción.
¿Cuáles son los Operadores?
Aritméticos:
•A + B => Retorna la suma de A y B.
•A - B => Retorna la resta de A y B.
•A * B => Retorna la multiplicación de A y B.
•A / B => Retorna la división de A y B.
•A % B => Retorna el resto de la división de A y B.
Asignación:
•A = B => Asigna a A el valor de B.
•A ++ => Asigna a A el resultado de A+1.
•A -- => Asigna a A el resultado de A-1.
•A += B => Asigna a A el resultado de A+B.
•A -= B => Asigna a A el resultado de A-B.
•A *= B => Asigna a A el resultado de A*B.
•A /= B => Asigna a A el resultado de A/B.
•A %= B => Asigna a A el resto de A/B.
Racionales(numéricos):
•A == B => Retorna "true" si A=B, de lo contrario retorna "false".
•A != B => Retorna "false" si A=B, de lo contrario retorna "true".
•A < B => Retorna "true" si A<B, de lo contrario retorna "false".
•A > B => Retorna "true" si A>B, de lo contrario retorna "false".
•A <= B => Retorna "true" si A<=B, de lo contrario retorna "false".
•A >= B => Retorna "true" si A>=B, de lo contrario retorna "false".
Racionales(booleanas):
•!B => Retorna "true" si B=false, de lo contrario retorna "false".
•A || B => Retorna "true" si A=true o B=true, de lo contrario retorna "false".
•A && B => Retorna "true" si A=true y B=true, de lo contrario retorna "false".
Misceláneos:
•([]) => Se utiliza para la declaración de arrays.
Expresiones:
¿Qué es una expresión?
Una expresión es una combinación de variables/arrays, funciones, que son evaluadas según los parámetros indicados. (si no entienden, no se preocupen, luego entenderán)
¿Cuáles son las expresiones que existen y cómo se utilizan?
Existen 16 expresiones, pero ahora solo veremos algunas. Más adelante veremos las demás.
if
Es una de las expresiones más importantes, se utiliza para comparar, y según el resultado de la comparación, se realiza o no una determinada acción.
Ejemplo:
- Código:
public OnPlayerConnect(playerid){
new rnd = random(2);
if(rnd = 0)SendClientMessage(playerid, 0x00FF00FF, "Bienvenido al servidor");
return 1;
}
!Importante: Cuando el código a ejecutar si la comparación es verdadera es de 1 línea o 1 sentencia (ejemplo1), no es necesario usar brackets, de lo contrario estos se deben colocar(ejemplo2).
else
Es al igual que if una de las expresiones más importantes, y también una de las más utilizadas. Su uso consiste en el opuesto de
Ejemplo:
- Código:
Estado(playerid)
{
if(IsPlayerConnected(playerid)){
printf("El jugador %i está conectado", playerid);
return 1;
}
else{
printf("El jugador %i esta desconectado", playerid);
return 0;
}
}
assert
Es similar a if, pero si es falso, entonces retorna(fin del callback/función)
Ejemplo:
- Código:
public OnFilterScriptInit()
{
new num = 5;
assert(num>0);
printf("%i", num);
return 1;
}
En el ejemplo dado, si la variable num es > 0 entonces escribirá el valor de num en la consola, de lo contrario retornan.
return
Se utiliza para retornar un valor de una función/callback, o bien para salir (de la)/(del) misma/o
Ejemplo:
- Código:
IsValidPlayer(playerid)
{
if(playerid==INVALID_PLAYER_ID || !IsPlayerConnected(playerid))return false;
return true;
}
Caracteres Especiales
•( \ ) => Indica que la línea actual, sigue en la de abajo.
•( ; ) => Fin de sentencia.
Nivel: Medio.
Inicializadores:
Bueno ahora vamos a avanzar un poco más allá de las clásicas definiciones y vamos a comprender un poco más sobre este lenguaje de programación de scripts.
Ahora vamos a aprender un poco sobre:
new, enum, forward y publica.
new
¿Cómo se usa new?
bueno esto no lo vamos a ver, ya que es realmente algo muy básico, y lo explique anteriormente.
Lo que realmente vamos a ver es porque usar new y no otros, es decir vamos a ver el correcto uso de esta sentencia.
La verdad es que no es muy complicado el uso de esta sentencia.
Cuando usar new
•Si necesitamos declarar una variable/array a nivel local, cuyo contenido pueda cambiar.
•Si necesitamos declarar una variable/array a nivel global, cuyo contenido pueda cambiar.
Cuando no usar new
•Para declarar una función.
•Para declarar un callback.
•Para declarar un array que no cambiara su contenido.
Enums
¿Qué es un enum?
Básicamente un enum, consiste en una lista.
¿Cómo se define un enum?
Un enum como tal, se define de la siguiente forma:
- Código:
enum MiEnum{elemento_0, elemento_1, elemento_N};
llevado a la práctica y para más fácil lectura, podemos crear algo así:
- Código:
enum Lista{
elemento_0,
elemento_1,
elemento_2,
elemento_n
};
¿Qué utilidad tienen los enums?
Generalmente los enums se suelen utilizar para listar datos. El más usado de ellos similar al anterior, para luego obtener los datos y asignarlos en un array
Ejemplo:
- Código:
enum PD{
Dinero,
Vida,
Armadura,
Advertencias
};
new PlayerInfo[MAX_PLAYERS][PD];
public
¿Qué es y para qué sirve public?
Sirve para la declaración de funciones/callbacks o bien variables.
¿Cuándo usar publica?
•Se utiliza para la declaración de funciones/callbacks que deben ser accesibles desde todos los documentos.
•También se puede utilizar para la declaración de variables que necesitamos que el host pueda modificar, ya que el host no puede modificar variables declaradas con new.(siempre variables globales)
forward
¿Qué es y para qué sirve forward?
forward le "dice" de cierta forma que la función que se declara luego del mismo, "viene después". Esto es así ya que las funciones estándar declaradas en pawn, no son declaradas hasta su uso.
pero las funciones declaradas como publica, no son estándar y pawn exige la declaración de las mismas antes de su uso. Por eso se usa "forward función(parámetros);"
¿Cuándo usar forward?
Siempre que se declare una función/callback del tipo public.
Definiciones
Dimensiones de un array
- Código:
new Array[5]
Ese array es unidimensional, ¿Qué quiere decir eso? Que solo tiene una dimensión.
¿Puede un array tener más de una dimensión?
Si, puede y pawn soporta hasta tres dimensiones.
Acá les dejo unos "gráficos" simples para que lo puedan entender mejor.
Unidimensional:
- Código:
new ArrayUnidimencional[5];
- Código:
X
X
X
X
X
Cada una de esas x, puede contener un valor diferente.
Bidimensional:
- Código:
new ArrayBidimencional[5][2];
- Código:
X X
X X
X X
X X
X X
Cada una de esas x, puede tener un valor diferente, que a su vez contiene otro valor. (Si no lo entienden no se preocupen. luego lo explicare de otra forma)
Tridimensional:
- Código:
new ArrayTridimencional[5][2][2];
Ahora bien, supongamos que tengo declarado un array así:
- Código:
new Array[4];
y luego le agrego un valor.
- Código:
Array[2] = 6;
Gráficamente:
- Código:
X
X
6
X
Ahora, posiblemente, se estén preguntando por qué en la 3 posición? cuando en el índex del array(numero q indica la posición del array a utilizar) es "2".
eso es porque todos los arrays empiezan con el índex 0 y no con el 1.
Gráficamente:
- Código:
índex 0 1 2 3
valor X X 6 X
Otro ejemplo.
- Código:
new Array[5][2];
Array[2][1] = 5;
Gráficamente:
- Código:
X X
5 X
X X
X X
X X
Del mismo modo con un array tridimensional. dado que no se puede representar en un plano, les dejo el link a un grafico. para los 3 tipos de arrays (principalmente miren la estructura del tridimensional). Link
Inicialización
El concepto de inicialización hace referencia al valor que se le da a una variable/array al crearlo.
por defecto en una variable su valor es "", mientras q en un array cada uno de los valores q puede contener es 0.
¿Cómo inicializar una variable?
La inicialización de una variable es realmente muy simple, consiste en setear el valor correspondiente.
- Código:
new Variable = 5;
La variable se inicia en 5.
¿Cómo inicializar un array?
Es un poco más complicado que una variable, pero aun así sigue siendo algo simple.
- Código:
new Array[10] = {1, 5, 5, 9, 10, 6, 7, 3, 0, 10};
- Código:
new Array[2][3] = {{1, 5, 6}, {4, 2, 7}};
En los ejemplos dados anteriormente se inicializan los arrays definidos ya con los valores seteados.
- Código:
new Array[10] = {1, 2, ...};
Esta forma de inicializar un array es = que hacer:
- Código:
new Array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
Es decir que ... llena los espacios en blanco con el valor de la sucesión que sigue.
- Código:
new Array[10] = {15, 30, ...};
en el ejemplo anterior el Array sería igual a
- Código:
{15, 30, 45, 50, 75, 90, 105, 120, 135, 150}
Operadores
Operadores misceláneos:
•({}) => Se utiliza para la declaración del contenido de arrays.
•defined => Retorna "true" si la variable indicada fue definida mediante "#define".
•sizeof() => Retorna el tamaño de un array.
•tagof() => Retorna el tag de una variable/array.
•char => Retorna el numero de cells que se necesitan para contener un string compactado.
Expresiones
switch, case(simple) y default:
Estas expresiones, van siempre juntas y se utilizan para realizar comparaciones en las cuales se quiere que según el valor, se realice una acción. Puede ser reemplazada por if, else if, else if, else, pero usando if sería más lenta y menos efectiva.
Ejemplo:
- Código:
switch(variable){
case 0:
print("0");
case 1:
print("1");
case 2:{
print("0");
print("1");
print("2");
}
case 3 .. 10:
print("3-10");
default:
print("variable no es ni 0, ni 1, ni 2, ni 3, ni 4, variable=otro valor");
}
!Importante: cuando luego de la expresión "case" sigue una sola línea, o un if(sin else/else if) la expresión puede ir libre de brakets, de lo contrario es necesario colocarlos.
for
Es un loop o bucle que consiste en tres pasos. El 1º consiste en la iniciación, el 2º es la comparación y el 3º es la renovación. Cada paso se separa por ";".
- Código:
new playerid;
for(playerid; playerid<GetMaxPlayers(); playerid++){
if(IsPlayerConnected(playerid)){
printf("El jugador con el id %i está conectado", playerid);
print("--------------------------------------");
}
}
En el código anterior, creamos un bucle que recorre la id de todos los jugadores. luego chequea si estos están conectados, y finalmente si lo están, lo escribe en la consola.
!Importante: Funciona = que el if, respeto de los brackets y las sentencias.
do
Es otro tipo de bucle, pero a diferencia del for, solo consta de 1 paso. El chequeo.
Ejemplo:
- Código:
new id;
do{
if(IsPlayerConnected(playerid)){
printf("El jugador con el id %i está conectado", playerid);
print("--------------------------------------");
}
id++;
}while(id<GetMaxPlayers());
Este ejemplo es = al ejemplo dado con el for, pero con la sentencia do.
while
Esta expresión, también es utilizada para realizar un bucle, y la forma es muy similar a la de la expresión "do".
- Código:
new id;
while(id<GetMaxPlayers()){
if(IsPlayerConnected(playerid)){
printf("El jugador con el id %i está conectado", playerid);
print("--------------------------------------");
}
id++;
}
Loops(infinitos)
Bueno, en esta pequeña parte de este tutorial, explicare como crear loops infinitos de diferentes formas.
Método 1:
- Código:
for(;;)print("Esto es un texto que saldrá repetidamente en la consola");
Método 2:(tira 1 warning, pero funciona perfecto)
- Código:
while(true)print("Esto es un texto que saldrá repetidamente en la consola");
Método 3:(tira 1 warning, pero funciona perfecto)
- Código:
do{
print("Esto es un texto que saldrá repetidamente en la consola");
}while(true);
Esas son 3 formas de hacer un loop infinito. Hay mas formas pero son todas similares, así que decidí poner solo esas.
Directivas
#if, #elseif, #else, #endif
Definición:
Se utiliza para comparar una sentencia.
Ejemplo:
- Código:
#if USE_MENU = 1
print("Menús: Habilitados");
#elseif USE_MENU = 0
print("Menús: Deshabilitados");
#else
print("Menús: Error");
#endif
#error
Definición:
Se utiliza para enviar un error durante la compilación.
Ejemplo:
- Código:
#if defined ERROR
#error Mensaje de error.
#endif
#assert
Definición:
Chequea si una comparación devuelve true o false. En caso de ser false, detiene la compilación.
Ejemplo:
- Código:
#define PP 6
#assert PP<4
Ese ejemplo enviara un error fatal con el texto "assertion failed: 6<4"
#include
Definición:
Inserta el texto del archivo a incluir en la línea en la que se ubica.
Ejemplo:
- Código:
#include <a_samp>//carpeta de includes
#include "../include/gl_common"//otra carpeta
#tryinclude
Definición:
Funciona igual que #include, con la diferencia de que si no puede incluir el archivo, no envía un error.
Ejemplo:
- Código:
#tryinclude <a_samp>
#define
Definición:
Crea una macro.
Ejemplo:
- Código:
#define COLOR_RED 0xFF0000FF
Caracteres Especiales (Strings)
•( \a ) => Beep
•( \b ) => Backspace
•( \e ) => Escape
•( \n ) => Nueva Línea
•( \r ) => Retorno de Carro (se utiliza en Windows para una línea nueva "/r/n")
•( \t ) => Tabulación Horizontal
•( \v ) => Tabulación Vertical
•( \\ ) => Inserta literalmente el símbolo '\'
•( \’’ ) => Inserta literalmente el símbolo "'"
•( \" ) => Inserta literalmente el símbolo '"'
•( \% ) => Inserta literalmente el símbolo '%'
•( \ddd; ) => código de caracteres, con el código en decimal "ddd"
•( \xhhh; ) => código de caracteres, con el código en hexadecimal "hhh"
Creación de funciones
¿Qué es una función?
Podemos definir a una función como un conjunto de acciones que se realizan cuando llamamos a la función.
¿Cómo crear una función?
por ahora veremos solo estas 3 formas de definir una función:
Forma 1:
- Código:
MiFuncion(parámetros)
{
//acciones
}
Pero esta función si no se utiliza, nos dará 1 advertencia diciendo que no estamos usando ese símbolo
Forma 2:
- Código:
forward MiFuncion(parámetros);
publica MiFuncion(parámetros)
{
//acciones
}
Forma 3:
- Código:
stock MiFuncion(parámetros)
{
//acciones
}
Funciones sin parámetros
Estas son las funciones más simples de hacer, dado que solo ejecutan el código dado. Generalmente se crean funciones así para cargar configuraciones de un sistema, o para realizar varias cosas.
Ejemplo:
- Código:
stock KickAll()
{
for(new i; i<GetMaxPlayers(); i++)if(IsPlayerConnected(i))Kick(i);
}
Esa es una función muy simple que solo kickea a todos los jugadores conectados.
Funciones con parámetros
Estas funciones aun son simples de hacer, pero le agregamos una complicación más. Los parámetros de una función funcionan = que variables/arrays, y hay veces que se les debe asignar un tag en su declaración
Ejemplo:
- Código:
stock SetPlayerHealthEx(playerid, Float:vida, color, const mensaje[])
{
SetPlayerHealth(playerid, vida);
SendClientMessage(playerid, color, message[]);
}
Funciones con retorno de valores
Las funciones pueden retornar valores, pero el tipo de valor retornado debe ser siempre igual.
Existen dos formas de retornar valores:
- Código:
stock GetConnectedPlayers()
{
new count;
for(new i; i<GetMaxPlayers(); i++)if(IsPlayerConnected(i))count++;
return count;
}
- Código:
stock GetConnectedPlayers()
{
new count;
for(new i; i<GetMaxPlayers(); i++)if(IsPlayerConnected(i))count++;
GetConnectedPlayers = count;
}
Ahora voy a mostrar una forma errónea de retornar valores.
- Código:
stock Suma(valor1, valor2)
{
new str[128];
if(!IsNumeric(valor1) || !IsNumeric(valor2)){
str = "ERROR: Los valores deben ser numéricos";
return str;
}
return valor1+valor2;
}
La función Suma, va a generar un error a la hora de compilar, dado que el primer valor que retorna es un string o array, mientras que el segundo es un numero entero.
Nivel: Avanzado.
Inicializadores (avanzado)
Ahora ya con un mayor conocimiento, vamos a ver stock, static, const y operator.
stock
Vamos a ir directo al grano, dado que entender stock es lo más fácil de esta sección.
¿Cómo se utiliza?
stock se utiliza para la declaración de variables o funciones que no estamos seguros si vamos a utilizar o no. Utilizando stock, el compilador si no se utiliza, no la define.
static
Se puede declarar una variable/array local estática o global estática.
Local estática
Definición:
Tiene la misma función que la variable/array local, pero a diferencia de la anterior, esta guarda la información.
Ejemplificación:
- Código:
public OnFilterScriptInit()
{
MyFunction();
print("!");
MyFunction();
return 1;
}
MyFunction()
{
for(new i; i<3; i++){
static j;
printf("%i", j);
j++;
}
}
Ese código va a escribir en la consola:
- Código:
0
1
2
!
3
4
5
Mientras que si la variable no fuera local estática, escribiría en la consola:
- Código:
0
0
0
!
0
0
0
Global estática
Definición:
Tiene la misma función que la variable/array global, pero solo puede utilizarse en el archivo que se declara.
Ejemplificación:
- Código:
static MyVariableEstaticaGlobal;
const
Cuando declaramos una variable como constante, significa que la misma no podrá ser modificada.
¿Cómo se declara una variable const?
eso es muy sencillo:
- Código:
new const Nombre = contenido
- Código:
new const Nombre[] = "contenido"
¿Cuándo se declara una variable const?
Existen 3 opciones comunes:
•Para crear un array constante.
•Para una variable pública(publica) que debe ser seteada obligatoriamente por el host y solo por el host.
•En los parámetros de una función.
operator
Se utiliza para declarar un tag propio.
¿Cómo se utiliza?
Es un poco complejo.
ejemplo:
- Código:
stock NewTag:operator=(a)
{
return NewTag:(a*5);
}
main()
{
new NewTag:BB = 5;
printf("%i", _:BB);
return 1;
}
Este ejemplo es realmente simple y no justificaría crear un nuevo tag. Pero es para que sea más fácil de entender.
Operadores (operadores misceláneos)
•(A) ? (B) : (C) => Es muy similar a if. Si A="true" retorna B, de lo contrario retorna C.
ejemplo:
- Código:
printf("Admin: %s", (Sinfo[Admin])?("ON"):("OFF"));
Si Sinfo[Admin] = true, entonces en la consola aparecerá "Admin: ON", de lo contrario aparecerá "Admin: OFF".
Operadores de Bits(manipulación)
•~A => Retorna el complemento de A.
•A >> B => Retorna el shift aritmético de B (hacia la izquierda) sobe A.
•A >>> B => Retorna el shift lógico de B (hacia la izquierda) sobre A.
•A << B => Retorna el shift de B (hacia la derecha) sobre A.
•A & B => Retorna A "and" B.
•A | B => Retorna A "or" B.
•A ^ B => Retorna A "exclusive or" B.
Operadores de Bits(Asignación)
Esos operadores son iguales a los de asignación común, y a estos se les suman los de manipulación de bits (siempre con el signo = después del signo de manipulación).
Expresiones(Loops(avanzado), saltos, sleep y state)
break
Se utiliza para terminar con un bucle.
Ejemplo:
- Código:
for(new i; i<10; i++)if(Array_N[i] == true)break;
continue
Se utiliza para saltar un valor en un bucle.
- Código:
for(new i; i<10; i++){
if(i==5)continue;
printf("%i", i);
}
Este ejemplo dará como resultado en la consola:
- Código:
0
1
2
3
4
5
6
7
8
9
goto
Esta expresión se utiliza para realizar un sato, para ir a x lugar del código, previamente definido.
Ejemplo:
- Código:
función()
{
new bool:ThisBool;
principio:
do{
if(random(2) == 0)ThisBool = false;
else ThisBool = true;
if(ThisBool == true){
print("SI");
goto TEnd;
}
else{
print("No");
ThisBool = false;
goto principio;
}
}while(ThisBool == false);
TEnd:
return;
}
El ejemplo por ahí no sea muy claro, pero lo que ese código hace es:
1º definir la variable(tipo boolean).
2º empieza con el bucle, y asigna un valor a la variable según sea 0 o 1 el número obtenido en el if.
3º compara el contenido de la variable y si es false, vuelve a empezar, de lo contrario termina.
sleep
Se utiliza para parar la aplicación durante x milisegundos. Aun que esta expresión figura en el manual de pawn, dudo que funcione.
Ejemplo:
- Código:
sleep(1000);
En este caso, la consola quedaría detenida durante 1 segundo.
Si la función no funciona, acá dejo una para aquellos a los que les interese:
- Código:
stock SleepEx(time)
{
time += GetTickCount();
while(time>GetTickCount()){}
}
state
Se utiliza para cambiar el estado de un autómata. Su uso es:
- Código:
state nombredelautomata
Directivas
#define
Definición:
Crea una macro. puede ser una función o solo una constante.
Ejemplo:
Constante:
- Código:
#define COLOR_RED 0xFF0000FF
Función:
- Código:
#define Minutes(%0) (%0)*60*1000
Dado que el tema de las macros es muy amplio, y ya ha sido explicado por Y_Less les dejo el Link
#endinput
Definición:
Deja de incluir el archivo que estaba siendo leído.
Ejemplo:
- Código:
#include <nombre>
#if defined _NOMBRE_INC
#endinput
#endif
#define _NOMBRE_INC
#pragma
Definición:
Esta directiva, puede tomar muchos valores:
amxlimit (valor):
Setea el valor máximo del tamaño que puede alcanzar el archivo .amx del script.
amxram (valor):
Setea el valor máximo de memoria ram que puede utilizar el archivo .amx del script.
codepage (nombre/valor):
Setea el formato en el que deben codificarse los strings.
ctrlchar (carácter):
Setea el símbolo que indica la continuación una nueva línea (por defecto"\").
deprecated (valor):
Setea un símbolo que no se puede usar. Si el compilado lo encuentra en el script, sale un warning.
dynamic (valor):
Setea el tamaño en cells de la memoria asignada para los datos dinámicos.
Library (nombre):
Especifica el archivo (.dll o .so) del cual obtener las funciones nativas.
pack (0/1):
Cambia el modo de uso de los strings comprimidos y descomprimidos.
tabsize (value):
Setea el valor asignado a cada tabulación. (defecto: .
unused (symbol):
Especifica que no se usara ese símbolo.
#undef
Definición:
Elimina una macro declarada o una variable/array declarada con const.
Ejemplo:
- Código:
#define COLOR_X 0xFFA4B6F9
printf("%d", COLOR_X);
#undef COLOR_X
Si luego de ese código, intentáramos usar COLOR_X, tendríamos que definirlo nuevamente, o el compilador, no compilaría.
Creación de funciones
Pasar parámetros como opcionales
¿Cómo hacer esto? muy sencillo.
Debemos agregar =valordefault a la variable q queramos que sea opcional y listo.
Ejemplo:
- Código:
stock Func(playerid, hora, minutos=0)
{
SetPlayerTime(playerid, hora, minutos);
printf("Un admin seteo la hora de %i a %i:%i", playerid, hora, minutos);
}
Pasar parámetros como valor y como referencia
Bueno ustedes por el momento con este tutorial solo sabían pasar archivos por valor. Ahora bien, ¿Qué significa que pasamos un archivo por valor?
Significa, que aun que nosotros editemos ese valor, el valor pasado no cambiara.
Ejemplo:
- Código:
main()
{
new val, val1, val2, val3;
val = 1;
val1 = 3;
val2 = 5;
val3 = Func(val1, val2, val);
printf("%i", val3);
printf("%i %i %i", val, val1, val2);
}
stock Func(valor_I, valor_D, valor_M)
{
valor_I /= Valor_D*valor_M;
return valor_M += Valor_I-Valor_D;
}
Como pueden observar Func edita los valores que se le asignan, pero los valores iniciales (val, val2, val3), siguen siendo los mismos.
Ahora bien, existe una forma de editar los valores que se le asignan a una función. Esto es lo que se conoce como "por referencia".
¿Cómo hacer eso?
muy sencillo, solo es necesario agregar el carácter '&' delante de la variable que queremos pasar como referencia, de lo contrario (si no lo ponemos), esta variable será pasada por valor.
!Importante: por defecto, los arrays no pueden ser pasados por valor, ¿Qué quiere decir esto? que si en un archivo especificamos uno de los parámetros como array, será pasado automáticamente por referencia y no por valor.
Crear funciones con parámetros variables
Para crear una función con parámetros indefinidos, debemos hacerlo utilizando '...'.
Ejemplo:
- Código:
main()
{
printf("%i", SumaTodo(5, 6, 1, 100, 8));
printf("%i", SumaTodo(1, 9, 6, 169, 17, 65, 243, 213));
}
stock SumaTodo(...)
{
new res;
for(new i; i<numargs(); i++)res += getarg(i);
return res;
}
Este tutorial se encuentra en forum-samp. Creditos por el tutorial: No recuerdo el nombre del autor. http://forum.sa-mp.com/showthread.php?t=225796
Espero que les sirva, muchas gracias.
Última edición por Aldys el Jue Sep 05, 2013 1:18 pm, editado 2 veces