[Guía] Uso y funciones para variables booleanas.

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
Tyrael
Aprendiz
Aprendiz
Mensajes: 174
Registrado: 14 Feb 2015 00:10
Reputación: 9

15 Ago 2018 18:17

¿ Que es una variable booleana ?.


  • Bueno, una variable booleana es una de las muchas formas que hay para definir variables en los lenguajes de programación.
  • Sólo puede tener dos resultados, verdadero o falso.
Veamos cómo podemos definir una variable de éste tipo.
 Codigo Pawno:
1

new bool:VariableTutorial[MAX_PLAYERS];
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 1
De ésta forma definiariamos la variable para todos los jugadores pero también podemos hacerla global.
 Codigo Pawno:
1

new bool:VariableTutorial = false;
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 1
Con esta forma se definiría de forma global.

Es obligatorio que al conectar un jugador le establezcamos la variable al valor que nosotros queramos.

En el caso de que sea para jugadores se haría así
* Lo recomendable sería en añadirla en el primer spawn del jugador..
 Codigo Pawno:
1

     VariableTutorial[playerid] = false;
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 1
Y si fuera en variable global debería de ser en la función OnGameModeInit
 Codigo Pawno:
1

     VariableTutorial = false;
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 1
Cómo dije al principio del tutorial las variables booleanas sólo tienes dos opciones:

False ( Falso).
True (Verdadero ).

Se pueden fijar de tal forma:
 Codigo Pawno:
1
2

VariableTutorial[playerid] = false; //Fijamos en falso
VariableTutorial[playerid] = true;  //Fijamos en verdadero
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 2
Se pueden usar de muchas formas pero yo lo haré con una función:
 Codigo Pawno:
1
2
3
4
5
6
7
8
9

stock MiFuncion(Jugador)
{
	switch(VariableTutorial[Jugador])
	{
	    case false:     SendClientMessage(Jugador, -1, "La función está en false.");
	    case true:     SendClientMessage(Jugador, -1, "La función está en verdadero.");
	}
	return 1;
}
  Cantidad de llaves: Abiertas(2)-Cerradas(2) | Lineas Totales: 9
Y se llamaría MiFuncion(ID del jugador)

En el caso de una variable global:
 Codigo Pawno:
1
2
3
4
5
6
7
8
9

stock MiFuncion(Jugador)//Usamos jugador en el caso de que queramos recibir un mensaje con el estado de la función
{
	switch(VariableTutorial)
	{
	    case false:     SendClientMessage(Jugador, -1, "La función está en false.");
	    case true:     SendClientMessage(Jugador, -1, "La función está en verdadero.");
	}
	return 1;
}
  Cantidad de llaves: Abiertas(2)-Cerradas(2) | Lineas Totales: 9
Ahora un ejemplo de comando para modificar la variable

 Codigo Pawno:
1
2
3
4
5
6
7
8
9

CMD:comando(playerid, params[])
{
    switch(VariableTutorial[playerid])
	{
	    case false:     {	VariableTutorial[playerid] = true;	SendClientMessage(playerid, -1, "La función pasa a estar en true");       }
	    case true:     {	VariableTutorial[playerid] = false;	SendClientMessage(playerid, -1, "La función pasa a estar en false");   }
	}
	return 1;
}
  Cantidad de llaves: Abiertas(4)-Cerradas(4) | Lineas Totales: 9
Y para la variable global lo mismo:
 Codigo Pawno:
1
2
3
4
5
6
7
8
9

CMD:comando(playerid, params[])
{
    switch(VariableTutorial[playerid])
	{
	    case false:     {	VariableTutorial = true;	SendClientMessage(playerid, -1, "La función pasa a estar en true");       }
	    case true:     {	VariableTutorial = false;	SendClientMessage(playerid, -1, "La función pasa a estar en false");   }
	}
	return 1;
}
  Cantidad de llaves: Abiertas(4)-Cerradas(4) | Lineas Totales: 9
Ahora vamos a ver cómo crear restricciones para usar con éstas variables:
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10
11
12
13

CMD:comando(playerid, params[])
{
    if(VariableTutorial[playerid] == false) SendClientMessage(playerid, -1, "La variable debe estar en verdadero para seguir con el comando.");

	return 1;
}

CMD:comando(playerid, params[])
{
    if(VariableTutorial[playerid] == true) SendClientMessage(playerid, -1, "La variable debe estar en false para seguir con el comando.");

	return 1;
}
  Cantidad de llaves: Abiertas(2)-Cerradas(2) | Lineas Totales: 13
Y para usar en variable global:
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10
11
12
13

CMD:comando(playerid, params[])
{
    if(VariableTutorial == false) SendClientMessage(playerid, -1, "La variable debe estar en verdadero para seguir con el comando.");

	return 1;
}

CMD:comando(playerid, params[])
{
    if(VariableTutorial == true) SendClientMessage(playerid, -1, "La variable debe estar en false para seguir con el comando.");

	return 1;
}
  Cantidad de llaves: Abiertas(2)-Cerradas(2) | Lineas Totales: 13
¿ Dudas, errores o preguntas ?. Publica aquí.
Última edición por Tyrael el 20 Ago 2018 17:52, editado 2 veces en total.
Avatar de Usuario
Alfon
Baneado
Baneado
Mensajes: 693
Registrado: 17 Ene 2016 18:39
Ubicación: YOVIVOENALGUNAPARTEDEESTE INSIGNIFICANTEMUNDOLLENODE RARITOSYANORMALES PERONOPASANADACARNAL YOLOSAMO
Reputación: 24

15 Ago 2018 23:10

 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10
11
12
13

CMD:comando(playerid, params[])
{
    if(VariableTutorial == false; SendClientMessage(playerid, -1, "La variable debe estar en verdadero para seguir con el comando.");
    
	return 1;
}

CMD:comando(playerid, params[])
{
    if(VariableTutorial == true; SendClientMessage(playerid, -1, "La variable debe estar en false para seguir con el comando.");

	return 1;
}
  Cantidad de llaves: Abiertas(2)-Cerradas(2) | Lineas Totales: 13
 Codigo Pawno:
1
2

if(VariableTutorial == false;
if(VariableTutorial == true;
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 2
Te faltó cerrar el paréntesis, además que no lleva punto y coma al lado de los valores.
 Codigo Pawno:
1
2

if(VariableTutorial == true) SendClientMessage(playerid, -1, "La variable debe estar en false para seguir con el comando.");
if(VariableTutorial == false) SendClientMessage(playerid, -1, "La variable debe estar en verdadero para seguir con el comando.");
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 2
A parte de verificar eso así, lo puedes hacer de ésta manera:
 Codigo Pawno:
1
2

if(VariableTutorial) //Si es verdadero
if(!VariableTutorial) //Si es falso
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 2
Otra manera:
 Codigo Pawno:
1
2

if(!VariableTutorial) SendClientMessage(playerid,-1,"Debe estar en verdadero.");
else SendClientMessage(playerid,-1,"Función ejecutada");
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 2
También debes aclarar que las variables booleanas consumen cierta cantidad de bytes (para que tengan entendido cuál es su consumo, no iría mal. ¿O sí?)

Mejora el post.

Saludos
Avatar de Usuario
MrDave
Ayudante
Ayudante
Mensajes: 989
Registrado: 05 Oct 2017 12:13
Reputación: 108

16 Ago 2018 11:09


Antes de hacer una guía se debe primero investigar sobre el tema o sino podría causar una ambiguación para los nuevos que lean esta divulgación.
Aparte de tener errores de sintaxis, también tiene algunas fallas en conceptos de programación algorítmica.
Ambas variables son GLOBALES, porqué se pueden usar en cualquier lugar del "script", ya sea en funciones, procedimientos o devoluciones de llamadas.
La única diferencia es que la primera es un ARREGLO que tendrá 'x' cantidad de variables dependiendo de como esté definido la constante "MAX_PLAYERS". Por otro lado, la segunda línea es una simple variable INDIVIDUAL, que sólo guarda un dato.
 Codigo Pawno:
1
2

new bool:VariableTutorial[MAX_PLAYERS];
new bool:VariableTutorial2 = false;
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 2
Ejemplo completo:
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

#include <a_samp>

new bool:VariableTutorial[MAX_PLAYERS];
new bool:VariableTutorial2 = false;

main()
{
	VariableTutorial[0] = true;
	VariableTutorial2 = false;
	function1();
	printf("El valor es: %d", VariableTutorial[0]);
	printf("El valor es: %d", VariableTutorial2);
	return 1;
}

function1()
{
        VariableTutorial[0] = true;
        VariableTutorial2 = false;
	return 1;
}
  Cantidad de llaves: Abiertas(2)-Cerradas(2) | Lineas Totales: 21

Ahora sí ves porqué son variables globales, porqué la puedo emplear tanto en la función "main" como en "function1", no se debe confundir términos.
Incluso se puede dar datos a cada jugador, usando variables individuales y siguen siendo GLOBALES:
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49

forward pc_cmd_test(playerid);

new var1;
new var2;
new var3;
new var4;

public OnPlayerConnect(playerid)
{
	var1 = 0;
	var2 = 1;
	var3 = 2;
	var4 = 3;
	return 1;
}

public pc_cmd_test(playerid)
{
	new str[35];
	switch(playerid)
	{
	    case 0:
	    {
	        var1 = 7;
	        format(str, sizeof(str), "El valor de tu variable es: %d", var1);
	        SendClientMessage(playerid, -1, str);
	    }
	    case 1:
	    {
	        var2 = 8;
	        	        format(str, sizeof(str), "El valor de tu variable es: %d", var2);
	        SendClientMessage(playerid, -1, str);
	    }
	    case 2:
	    {
	        var3 = 9;
	        format(str, sizeof(str), "El valor de tu variable es: %d", var3);
	        SendClientMessage(playerid, -1, str);
	    }
	    case 3:
	    {
	        var4 = 10;
	        format(str, sizeof(str), "El valor de tu variable es: %d", var4);
	        SendClientMessage(playerid, -1, str);
	    }
	    //etc...
	}
	return 1;
}
  Cantidad de llaves: Abiertas(7)-Cerradas(7) | Lineas Totales: 49

Sólo que este método es muy tedioso y gasta mucho código, por esa razón que es buena práctica usar "arrays" para estos casos, ya que ahorra el trabajo del programador. Imagínate, sí la cantidad de "slots" de mi servidor fuera de 100 jugadores, tendría que crear 100 variables ¡Joder tío! Sería algo complicado hacerlo con el proceso de arriba.
Otra cosa que vi en el tutorial, fue esto:
 Codigo Pawno:
1
2

VariableTutorial[playerid] = 0; //Fijamos en 0 o  falso que sería lo mismo
VariableTutorial[playerid] = 1;  //Fijamos en 1 o verdadero que sería lo mismo
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 2

Es lo mismo para nosotros, pero para el compilador NO.
Sí declaras una variable tipo "BOOLEANA", el valor guardado debe ser "BOOLEANO", no puedo asignar un valor que sea diferente de "true" or "false", porqué el compilador lo tomaría como un "integer" y te daría un "warning", el típico: "tag mismatch".
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10
11

#include <a_samp>

main()
{
	new bool:x = true;
	printf("El valor de x es: %d", x);
	x = 1;
	x = 10;
	x = 0;
	return 1;
}
  Cantidad de llaves: Abiertas(1)-Cerradas(1) | Lineas Totales: 11

En el ejemplo de arriba estoy declarando una variable local automática que sólo puede almacenar un "true" or "false", tú mismo lo dijiste en el tutorial.
Dado que estoy asignando en mi variable "x" valores enteros como 1, 10, 0, me saldrá 3 advertencias porqué no estoy respetando el "tag" de la dicha variable.

Y por último esto:
 Codigo Pawno:
1
2
3
4
5
6
7
8
9

stock MiFuncion(Jugador)
{
	switch(VariableTutorial[Jugador])
	{
	    case 0:     SendClientMessage(Jugador, -1, "La función está en false ((0))");
	    case 1:     SendClientMessage(Jugador, -1, "La función está en verdadero ((1))");
	}
	return 1;
}
  Cantidad de llaves: Abiertas(2)-Cerradas(2) | Lineas Totales: 9
Sí quieres que la función devuelve un valor "booleano", lo puedes hacer así:
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10

forward bool:MiFuncion(Jugador);
bool:MiFuncion(Jugador)
{
	switch(VariableTutorial[Jugador])
	{
	    case 0:  return false;
	    case 1:  return true;
	}
	return false;
}
  Cantidad de llaves: Abiertas(2)-Cerradas(2) | Lineas Totales: 10

Claro, sí el "tag" es un "Float:" o "bool:", la función deberá ser declarada con un "forward", y debe ser antes de definir la función, de lo contrario, te saldrá un "warning".
Y sí, como dice @Alfon las variables booleana sólo ocupa 1 byte de memoria, por eso es buena práctica emplearlo cuando la variable sólo guardará dos valores posibles. Usados cuando quieres crear un "sistema" para activar o desactivar una cosa.
¡Saludos!

- Temporalmente estoy retirado de SA-MP; por lo tanto no me envíen propuestas de proyectos.
- No respondo dudas por privado, usa la sección de preguntas.
Avatar de Usuario
FranCostas
Junior
Junior
Mensajes: 537
Registrado: 05 Jul 2016 23:14
Ubicación: localhost:7777
Contactar:
Reputación: 13

16 Ago 2018 20:12

Spoiler:
MrDave escribió:
16 Ago 2018 11:09

Antes de hacer una guía se debe primero investigar sobre el tema o sino podría causar una ambiguación para los nuevos que lean esta divulgación.
Aparte de tener errores de sintaxis, también tiene algunas fallas en conceptos de programación algorítmica.
Ambas variables son GLOBALES, porqué se pueden usar en cualquier lugar del "script", ya sea en funciones, procedimientos o devoluciones de llamadas.
La única diferencia es que la primera es un ARREGLO que tendrá 'x' cantidad de variables dependiendo de como esté definido la constante "MAX_PLAYERS". Por otro lado, la segunda línea es una simple variable INDIVIDUAL, que sólo guarda un dato.
 Codigo Pawno:
1
2

new bool:VariableTutorial[MAX_PLAYERS];
new bool:VariableTutorial2 = false;
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 2
Ejemplo completo:
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

#include <a_samp>

new bool:VariableTutorial[MAX_PLAYERS];
new bool:VariableTutorial2 = false;

main()
{
	VariableTutorial[0] = true;
	VariableTutorial2 = false;
	function1();
	printf("El valor es: %d", VariableTutorial[0]);
	printf("El valor es: %d", VariableTutorial2);
	return 1;
}

function1()
{
        VariableTutorial[0] = true;
        VariableTutorial2 = false;
	return 1;
}
  Cantidad de llaves: Abiertas(2)-Cerradas(2) | Lineas Totales: 21

Ahora sí ves porqué son variables globales, porqué la puedo emplear tanto en la función "main" como en "function1", no se debe confundir términos.
Incluso se puede dar datos a cada jugador, usando variables individuales y siguen siendo GLOBALES:
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49

forward pc_cmd_test(playerid);

new var1;
new var2;
new var3;
new var4;

public OnPlayerConnect(playerid)
{
	var1 = 0;
	var2 = 1;
	var3 = 2;
	var4 = 3;
	return 1;
}

public pc_cmd_test(playerid)
{
	new str[35];
	switch(playerid)
	{
	    case 0:
	    {
	        var1 = 7;
	        format(str, sizeof(str), "El valor de tu variable es: %d", var1);
	        SendClientMessage(playerid, -1, str);
	    }
	    case 1:
	    {
	        var2 = 8;
	        	        format(str, sizeof(str), "El valor de tu variable es: %d", var2);
	        SendClientMessage(playerid, -1, str);
	    }
	    case 2:
	    {
	        var3 = 9;
	        format(str, sizeof(str), "El valor de tu variable es: %d", var3);
	        SendClientMessage(playerid, -1, str);
	    }
	    case 3:
	    {
	        var4 = 10;
	        format(str, sizeof(str), "El valor de tu variable es: %d", var4);
	        SendClientMessage(playerid, -1, str);
	    }
	    //etc...
	}
	return 1;
}
  Cantidad de llaves: Abiertas(7)-Cerradas(7) | Lineas Totales: 49

Sólo que este método es muy tedioso y gasta mucho código, por esa razón que es buena práctica usar "arrays" para estos casos, ya que ahorra el trabajo del programador. Imagínate, sí la cantidad de "slots" de mi servidor fuera de 100 jugadores, tendría que crear 100 variables ¡Joder tío! Sería algo complicado hacerlo con el proceso de arriba.
Otra cosa que vi en el tutorial, fue esto:
 Codigo Pawno:
1
2

VariableTutorial[playerid] = 0; //Fijamos en 0 o  falso que sería lo mismo
VariableTutorial[playerid] = 1;  //Fijamos en 1 o verdadero que sería lo mismo
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 2

Es lo mismo para nosotros, pero para el compilador NO.
Sí declaras una variable tipo "BOOLEANA", el valor guardado debe ser "BOOLEANO", no puedo asignar un valor que sea diferente de "true" or "false", porqué el compilador lo tomaría como un "integer" y te daría un "warning", el típico: "tag mismatch".
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10
11

#include <a_samp>

main()
{
	new bool:x = true;
	printf("El valor de x es: %d", x);
	x = 1;
	x = 10;
	x = 0;
	return 1;
}
  Cantidad de llaves: Abiertas(1)-Cerradas(1) | Lineas Totales: 11

En el ejemplo de arriba estoy declarando una variable local automática que sólo puede almacenar un "true" or "false", tú mismo lo dijiste en el tutorial.
Dado que estoy asignando en mi variable "x" valores enteros como 1, 10, 0, me saldrá 3 advertencias porqué no estoy respetando el "tag" de la dicha variable.

Y por último esto:
 Codigo Pawno:
1
2
3
4
5
6
7
8
9

stock MiFuncion(Jugador)
{
	switch(VariableTutorial[Jugador])
	{
	    case 0:     SendClientMessage(Jugador, -1, "La función está en false ((0))");
	    case 1:     SendClientMessage(Jugador, -1, "La función está en verdadero ((1))");
	}
	return 1;
}
  Cantidad de llaves: Abiertas(2)-Cerradas(2) | Lineas Totales: 9
Sí quieres que la función devuelve un valor "booleano", lo puedes hacer así:
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10

forward bool:MiFuncion(Jugador);
bool:MiFuncion(Jugador)
{
	switch(VariableTutorial[Jugador])
	{
	    case 0:  return false;
	    case 1:  return true;
	}
	return false;
}
  Cantidad de llaves: Abiertas(2)-Cerradas(2) | Lineas Totales: 10

Claro, sí el "tag" es un "Float:" o "bool:", la función deberá ser declarada con un "forward", y debe ser antes de definir la función, de lo contrario, te saldrá un "warning".
Y sí, como dice @Alfon las variables booleana sólo ocupa 1 byte de memoria, por eso es buena práctica emplearlo cuando la variable sólo guardará dos valores posibles. Usados cuando quieres crear un "sistema" para activar o desactivar una cosa.
¡Saludos!
Desde mi humilde punto de vista, comentarios como estos son los que arruinan la comunidad, el que creó el post, minima mente le tardó 20 minutos para que vengan a corregirle todo, el pibe está intentando ayudar no está haciendo comentarios de caca <-- (xd) corrigiendo a todos asi queda bien, siempre los mismos usuarios haciendo los mismos comentarios intentando opacar al que publica o simplemente queriendo sobresalir, si no fuera así, tranquilamente todo este testamento que escribió el user de arriba lo puede mandar por mp y así el usuario puede modificar el post y arreglar los errores, pero quién va a querer aportar algo, gastar tiempo en hacer el post, el código para que después comiencen a corregirlo y no exactamente de buena manera...

Fede querido... no es un comentario incitando el forobardo, es mi humilde punto de vista
Avatar de Usuario
Alfon
Baneado
Baneado
Mensajes: 693
Registrado: 17 Ene 2016 18:39
Ubicación: YOVIVOENALGUNAPARTEDEESTE INSIGNIFICANTEMUNDOLLENODE RARITOSYANORMALES PERONOPASANADACARNAL YOLOSAMO
Reputación: 24

17 Ago 2018 21:18

Spoiler:
FranCostas escribió:
16 Ago 2018 20:12
Spoiler:
MrDave escribió:
16 Ago 2018 11:09

Antes de hacer una guía se debe primero investigar sobre el tema o sino podría causar una ambiguación para los nuevos que lean esta divulgación.
Aparte de tener errores de sintaxis, también tiene algunas fallas en conceptos de programación algorítmica.
Ambas variables son GLOBALES, porqué se pueden usar en cualquier lugar del "script", ya sea en funciones, procedimientos o devoluciones de llamadas.
La única diferencia es que la primera es un ARREGLO que tendrá 'x' cantidad de variables dependiendo de como esté definido la constante "MAX_PLAYERS". Por otro lado, la segunda línea es una simple variable INDIVIDUAL, que sólo guarda un dato.
 Codigo Pawno:
1
2

new bool:VariableTutorial[MAX_PLAYERS];
new bool:VariableTutorial2 = false;
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 2
Ejemplo completo:
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

#include <a_samp>

new bool:VariableTutorial[MAX_PLAYERS];
new bool:VariableTutorial2 = false;

main()
{
	VariableTutorial[0] = true;
	VariableTutorial2 = false;
	function1();
	printf("El valor es: %d", VariableTutorial[0]);
	printf("El valor es: %d", VariableTutorial2);
	return 1;
}

function1()
{
        VariableTutorial[0] = true;
        VariableTutorial2 = false;
	return 1;
}
  Cantidad de llaves: Abiertas(2)-Cerradas(2) | Lineas Totales: 21

Ahora sí ves porqué son variables globales, porqué la puedo emplear tanto en la función "main" como en "function1", no se debe confundir términos.
Incluso se puede dar datos a cada jugador, usando variables individuales y siguen siendo GLOBALES:
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49

forward pc_cmd_test(playerid);

new var1;
new var2;
new var3;
new var4;

public OnPlayerConnect(playerid)
{
	var1 = 0;
	var2 = 1;
	var3 = 2;
	var4 = 3;
	return 1;
}

public pc_cmd_test(playerid)
{
	new str[35];
	switch(playerid)
	{
	    case 0:
	    {
	        var1 = 7;
	        format(str, sizeof(str), "El valor de tu variable es: %d", var1);
	        SendClientMessage(playerid, -1, str);
	    }
	    case 1:
	    {
	        var2 = 8;
	        	        format(str, sizeof(str), "El valor de tu variable es: %d", var2);
	        SendClientMessage(playerid, -1, str);
	    }
	    case 2:
	    {
	        var3 = 9;
	        format(str, sizeof(str), "El valor de tu variable es: %d", var3);
	        SendClientMessage(playerid, -1, str);
	    }
	    case 3:
	    {
	        var4 = 10;
	        format(str, sizeof(str), "El valor de tu variable es: %d", var4);
	        SendClientMessage(playerid, -1, str);
	    }
	    //etc...
	}
	return 1;
}
  Cantidad de llaves: Abiertas(7)-Cerradas(7) | Lineas Totales: 49

Sólo que este método es muy tedioso y gasta mucho código, por esa razón que es buena práctica usar "arrays" para estos casos, ya que ahorra el trabajo del programador. Imagínate, sí la cantidad de "slots" de mi servidor fuera de 100 jugadores, tendría que crear 100 variables ¡Joder tío! Sería algo complicado hacerlo con el proceso de arriba.
Otra cosa que vi en el tutorial, fue esto:
 Codigo Pawno:
1
2

VariableTutorial[playerid] = 0; //Fijamos en 0 o  falso que sería lo mismo
VariableTutorial[playerid] = 1;  //Fijamos en 1 o verdadero que sería lo mismo
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 2

Es lo mismo para nosotros, pero para el compilador NO.
Sí declaras una variable tipo "BOOLEANA", el valor guardado debe ser "BOOLEANO", no puedo asignar un valor que sea diferente de "true" or "false", porqué el compilador lo tomaría como un "integer" y te daría un "warning", el típico: "tag mismatch".
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10
11

#include <a_samp>

main()
{
	new bool:x = true;
	printf("El valor de x es: %d", x);
	x = 1;
	x = 10;
	x = 0;
	return 1;
}
  Cantidad de llaves: Abiertas(1)-Cerradas(1) | Lineas Totales: 11

En el ejemplo de arriba estoy declarando una variable local automática que sólo puede almacenar un "true" or "false", tú mismo lo dijiste en el tutorial.
Dado que estoy asignando en mi variable "x" valores enteros como 1, 10, 0, me saldrá 3 advertencias porqué no estoy respetando el "tag" de la dicha variable.

Y por último esto:
 Codigo Pawno:
1
2
3
4
5
6
7
8
9

stock MiFuncion(Jugador)
{
	switch(VariableTutorial[Jugador])
	{
	    case 0:     SendClientMessage(Jugador, -1, "La función está en false ((0))");
	    case 1:     SendClientMessage(Jugador, -1, "La función está en verdadero ((1))");
	}
	return 1;
}
  Cantidad de llaves: Abiertas(2)-Cerradas(2) | Lineas Totales: 9
Sí quieres que la función devuelve un valor "booleano", lo puedes hacer así:
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10

forward bool:MiFuncion(Jugador);
bool:MiFuncion(Jugador)
{
	switch(VariableTutorial[Jugador])
	{
	    case 0:  return false;
	    case 1:  return true;
	}
	return false;
}
  Cantidad de llaves: Abiertas(2)-Cerradas(2) | Lineas Totales: 10

Claro, sí el "tag" es un "Float:" o "bool:", la función deberá ser declarada con un "forward", y debe ser antes de definir la función, de lo contrario, te saldrá un "warning".
Y sí, como dice @Alfon las variables booleana sólo ocupa 1 byte de memoria, por eso es buena práctica emplearlo cuando la variable sólo guardará dos valores posibles. Usados cuando quieres crear un "sistema" para activar o desactivar una cosa.
¡Saludos!
Desde mi humilde punto de vista, comentarios como estos son los que arruinan la comunidad, el que creó el post, minima mente le tardó 20 minutos para que vengan a corregirle todo, el pibe está intentando ayudar no está haciendo comentarios de c*** <-- (xd) corrigiendo a todos asi queda bien, siempre los mismos usuarios haciendo los mismos comentarios intentando opacar al que publica o simplemente queriendo sobresalir, si no fuera así, tranquilamente todo este testamento que escribió el user de arriba lo puede mandar por mp y así el usuario puede modificar el post y arreglar los errores, pero quién va a querer aportar algo, gastar tiempo en hacer el post, el código para que después comiencen a corregirlo y no exactamente de buena manera...

Fede querido... no es un comentario incitando el forobardo, es mi humilde punto de vista
Ningún comentario corrigiendo al creador de post arruina la comunidad, sólo estamos ayudando. No vas a crear una guía con errores (que puede pasar sin querer queriendo) por algo existe la comunidad. [PawnScript. Soporte SA:MP en español ningún comentario es lo que dices, yo solamente corregí porque noté un pequeño error y además añadí más información, lo de MrDave es más como para que comprendan aparte de lo aportado (está mal por cierto) porque hará confundir a los más nuevos con funciones de tipo stock o funciones que ni si quiera han visto, o que no tengan idea para qué es eso, que ya va fuera del tema, porque esto se basa en utilizar variables tipo bool, más no funciones de terceros y variables enteras o con celdas.

Aunque cierta parte de tu comentario tienes razón con lo de sobresalir, no te lo voy a negar, es tonto que hagan eso. XD



Saludos.
Avatar de Usuario
Tyrael
Aprendiz
Aprendiz
Mensajes: 174
Registrado: 14 Feb 2015 00:10
Reputación: 9

20 Ago 2018 17:49

Alfon escribió:
15 Ago 2018 23:10
Spoiler:
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10
11
12
13

CMD:comando(playerid, params[])
{
    if(VariableTutorial == false; SendClientMessage(playerid, -1, "La variable debe estar en verdadero para seguir con el comando.");
    
	return 1;
}

CMD:comando(playerid, params[])
{
    if(VariableTutorial == true; SendClientMessage(playerid, -1, "La variable debe estar en false para seguir con el comando.");

	return 1;
}
  Cantidad de llaves: Abiertas(2)-Cerradas(2) | Lineas Totales: 13
 Codigo Pawno:
1
2

if(VariableTutorial == false;
if(VariableTutorial == true;
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 2
Te faltó cerrar el paréntesis, además que no lleva punto y coma al lado de los valores.
 Codigo Pawno:
1
2

if(VariableTutorial == true) SendClientMessage(playerid, -1, "La variable debe estar en false para seguir con el comando.");
if(VariableTutorial == false) SendClientMessage(playerid, -1, "La variable debe estar en verdadero para seguir con el comando.");
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 2
A parte de verificar eso así, lo puedes hacer de ésta manera:
 Codigo Pawno:
1
2

if(VariableTutorial) //Si es verdadero
if(!VariableTutorial) //Si es falso
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 2
Otra manera:
 Codigo Pawno:
1
2

if(!VariableTutorial) SendClientMessage(playerid,-1,"Debe estar en verdadero.");
else SendClientMessage(playerid,-1,"Función ejecutada");
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 2
También debes aclarar que las variables booleanas consumen cierta cantidad de bytes (para que tengan entendido cuál es su consumo, no iría mal. ¿O sí?)

Mejora el post.

Saludos
Tienes razón en que me faltaron los paréntesis, ya lo corregí.

Hay muchas formas de comprobar las variables pero en mi concepto de tutoriales siempre me declino ha realizarlos para nuevos ya que el que lleva un tiempo programando conoce bien éstos conceptos ya que son muy básicos.

En la referencia al consumo de memoria nunca me preocupó mucho la verdad.
MrDave escribió:
16 Ago 2018 11:09
Spoiler:

Antes de hacer una guía se debe primero investigar sobre el tema o sino podría causar una ambiguación para los nuevos que lean esta divulgación.
Aparte de tener errores de sintaxis, también tiene algunas fallas en conceptos de programación algorítmica.
Ambas variables son GLOBALES, porqué se pueden usar en cualquier lugar del "script", ya sea en funciones, procedimientos o devoluciones de llamadas.
La única diferencia es que la primera es un ARREGLO que tendrá 'x' cantidad de variables dependiendo de como esté definido la constante "MAX_PLAYERS". Por otro lado, la segunda línea es una simple variable INDIVIDUAL, que sólo guarda un dato.
 Codigo Pawno:
1
2

new bool:VariableTutorial[MAX_PLAYERS];
new bool:VariableTutorial2 = false;
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 2
Ejemplo completo:
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

#include <a_samp>

new bool:VariableTutorial[MAX_PLAYERS];
new bool:VariableTutorial2 = false;

main()
{
	VariableTutorial[0] = true;
	VariableTutorial2 = false;
	function1();
	printf("El valor es: %d", VariableTutorial[0]);
	printf("El valor es: %d", VariableTutorial2);
	return 1;
}

function1()
{
        VariableTutorial[0] = true;
        VariableTutorial2 = false;
	return 1;
}
  Cantidad de llaves: Abiertas(2)-Cerradas(2) | Lineas Totales: 21

Ahora sí ves porqué son variables globales, porqué la puedo emplear tanto en la función "main" como en "function1", no se debe confundir términos.
Incluso se puede dar datos a cada jugador, usando variables individuales y siguen siendo GLOBALES:
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49

forward pc_cmd_test(playerid);

new var1;
new var2;
new var3;
new var4;

public OnPlayerConnect(playerid)
{
	var1 = 0;
	var2 = 1;
	var3 = 2;
	var4 = 3;
	return 1;
}

public pc_cmd_test(playerid)
{
	new str[35];
	switch(playerid)
	{
	    case 0:
	    {
	        var1 = 7;
	        format(str, sizeof(str), "El valor de tu variable es: %d", var1);
	        SendClientMessage(playerid, -1, str);
	    }
	    case 1:
	    {
	        var2 = 8;
	        	        format(str, sizeof(str), "El valor de tu variable es: %d", var2);
	        SendClientMessage(playerid, -1, str);
	    }
	    case 2:
	    {
	        var3 = 9;
	        format(str, sizeof(str), "El valor de tu variable es: %d", var3);
	        SendClientMessage(playerid, -1, str);
	    }
	    case 3:
	    {
	        var4 = 10;
	        format(str, sizeof(str), "El valor de tu variable es: %d", var4);
	        SendClientMessage(playerid, -1, str);
	    }
	    //etc...
	}
	return 1;
}
  Cantidad de llaves: Abiertas(7)-Cerradas(7) | Lineas Totales: 49

Sólo que este método es muy tedioso y gasta mucho código, por esa razón que es buena práctica usar "arrays" para estos casos, ya que ahorra el trabajo del programador. Imagínate, sí la cantidad de "slots" de mi servidor fuera de 100 jugadores, tendría que crear 100 variables ¡Joder tío! Sería algo complicado hacerlo con el proceso de arriba.
Otra cosa que vi en el tutorial, fue esto:
 Codigo Pawno:
1
2

VariableTutorial[playerid] = 0; //Fijamos en 0 o  falso que sería lo mismo
VariableTutorial[playerid] = 1;  //Fijamos en 1 o verdadero que sería lo mismo
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 2

Es lo mismo para nosotros, pero para el compilador NO.
Sí declaras una variable tipo "BOOLEANA", el valor guardado debe ser "BOOLEANO", no puedo asignar un valor que sea diferente de "true" or "false", porqué el compilador lo tomaría como un "integer" y te daría un "warning", el típico: "tag mismatch".
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10
11

#include <a_samp>

main()
{
	new bool:x = true;
	printf("El valor de x es: %d", x);
	x = 1;
	x = 10;
	x = 0;
	return 1;
}
  Cantidad de llaves: Abiertas(1)-Cerradas(1) | Lineas Totales: 11

En el ejemplo de arriba estoy declarando una variable local automática que sólo puede almacenar un "true" or "false", tú mismo lo dijiste en el tutorial.
Dado que estoy asignando en mi variable "x" valores enteros como 1, 10, 0, me saldrá 3 advertencias porqué no estoy respetando el "tag" de la dicha variable.

Y por último esto:
 Codigo Pawno:
1
2
3
4
5
6
7
8
9

stock MiFuncion(Jugador)
{
	switch(VariableTutorial[Jugador])
	{
	    case 0:     SendClientMessage(Jugador, -1, "La función está en false ((0))");
	    case 1:     SendClientMessage(Jugador, -1, "La función está en verdadero ((1))");
	}
	return 1;
}
  Cantidad de llaves: Abiertas(2)-Cerradas(2) | Lineas Totales: 9
Sí quieres que la función devuelve un valor "booleano", lo puedes hacer así:
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10

forward bool:MiFuncion(Jugador);
bool:MiFuncion(Jugador)
{
	switch(VariableTutorial[Jugador])
	{
	    case 0:  return false;
	    case 1:  return true;
	}
	return false;
}
  Cantidad de llaves: Abiertas(2)-Cerradas(2) | Lineas Totales: 10

Claro, sí el "tag" es un "Float:" o "bool:", la función deberá ser declarada con un "forward", y debe ser antes de definir la función, de lo contrario, te saldrá un "warning".
Y sí, como dice @Alfon las variables booleana sólo ocupa 1 byte de memoria, por eso es buena práctica emplearlo cuando la variable sólo guardará dos valores posibles. Usados cuando quieres crear un "sistema" para activar o desactivar una cosa.
¡Saludos!
Con esto tenemos trabajo:

Lo primero es que si intentas pasar por encima de la gente intentando usar un lenguaje demasiado sofisticado puedes caer en el error de usas palabras que no existen cómo por ejemplo ambiguación. La cual ya de por si al escribirla verás que contiene errores que el mismo foro te señala.
Lo segundo es que yo al menos soy de España y segun la RAE (Real academia española) no existe tal palabra.

Dejando eso de lado vamos al tema que nos interesa.

Si una variable para un jugador sólo tendrá 2 resultados, ¿ para que quieres añadir más variables si con una solamente resumes ?.

Sobre el método tedioso que expones te diré que no le veo sentido el tutorial se explica el uso de las variables booleanas pero parece que las confundas.

Cuando dices:

Sólo que este método es muy tedioso y gasta mucho código, por esa razón que es buena práctica usar "arrays" para estos casos, ya que ahorra el trabajo del programador. Imagínate, sí la cantidad de "slots" de mi servidor fuera de 100 jugadores, tendría que crear 100 variables ¡Joder tío! Sería algo complicado hacerlo con el proceso de arriba.
Otra cosa que vi en el tutorial, fue esto.

Obviamente siempre será mejor en el caso que expones usar arrays pero te vuelvo a repetir que el tutorial solo explica el uso de dos tipos de variables. No necesito crear 100 variables con arrays ya que es gasto de líneas claramente
Además para eso se definen como MAX_PLAYERS.

En referencia a:

Es lo mismo para nosotros, pero para el compilador NO.
Sí declaras una variable tipo "BOOLEANA", el valor guardado debe ser "BOOLEANO", no puedo asignar un valor que sea diferente de "true" or "false", porqué el compilador lo tomaría como un "integer" y te daría un "warning", el típico: "tag mismatch".

Tengo que darte la razón pensaba que pawno reconocía sistema binario pero acabo de comprobar que no.

Cuando dices:

Sí quieres que la función devuelve un valor "booleano", lo puedes hacer así:

La función simplemente es para que quien la use vea cómo cambia el valor nada más.

Y ya por último cuando dices:

Claro, sí el "tag" es un "Float:" o "bool:", la función deberá ser declarada con un "forward", y debe ser antes de definir la función, de lo contrario, te saldrá un "warning".

No es obligatorio el uso de forward antes de la función ya que se le puede declarar con stock.

Sinceramente hace mucho que vengo programando y no recuerdo bien si al usar stock se consumía memoria o no pero cómo dije antes, no es algo que me preocupase mucho.

Post corregido.
Avatar de Usuario
MrDave
Ayudante
Ayudante
Mensajes: 989
Registrado: 05 Oct 2017 12:13
Reputación: 108

21 Ago 2018 14:13

@Tyrael
Spoiler:
Con esto tenemos trabajo:

Lo primero es que si intentas pasar por encima de la gente intentando usar un lenguaje demasiado sofisticado puedes caer en el error de usas palabras que no existen cómo por ejemplo ambiguación. La cual ya de por si al escribirla verás que contiene errores que el mismo foro te señala.
Lo segundo es que yo al menos soy de España y segun la RAE (Real academia española) no existe tal palabra.

Dejando eso de lado vamos al tema que nos interesa.

Si una variable para un jugador sólo tendrá 2 resultados, ¿ para que quieres añadir más variables si con una solamente resumes ?.

Sobre el método tedioso que expones te diré que no le veo sentido el tutorial se explica el uso de las variables booleanas pero parece que las confundas.

Cuando dices:

Sólo que este método es muy tedioso y gasta mucho código, por esa razón que es buena práctica usar "arrays" para estos casos, ya que ahorra el trabajo del programador. Imagínate, sí la cantidad de "slots" de mi servidor fuera de 100 jugadores, tendría que crear 100 variables ¡Joder tío! Sería algo complicado hacerlo con el proceso de arriba.
Otra cosa que vi en el tutorial, fue esto.

Obviamente siempre será mejor en el caso que expones usar arrays pero te vuelvo a repetir que el tutorial solo explica el uso de dos tipos de variables. No necesito crear 100 variables con arrays ya que es gasto de líneas claramente
Además para eso se definen como MAX_PLAYERS.

En referencia a:

Es lo mismo para nosotros, pero para el compilador NO.
Sí declaras una variable tipo "BOOLEANA", el valor guardado debe ser "BOOLEANO", no puedo asignar un valor que sea diferente de "true" or "false", porqué el compilador lo tomaría como un "integer" y te daría un "warning", el típico: "tag mismatch".

Tengo que darte la razón pensaba que pawno reconocía sistema binario pero acabo de comprobar que no.

Cuando dices:

Sí quieres que la función devuelve un valor "booleano", lo puedes hacer así:

La función simplemente es para que quien la use vea cómo cambia el valor nada más.

Y ya por último cuando dices:

Claro, sí el "tag" es un "Float:" o "bool:", la función deberá ser declarada con un "forward", y debe ser antes de definir la función, de lo contrario, te saldrá un "warning".

No es obligatorio el uso de forward antes de la función ya que se le puede declarar con stock.

Sinceramente hace mucho que vengo programando y no recuerdo bien si al usar stock se consumía memoria o no pero cómo dije antes, no es algo que me preocupase mucho.


Sí tienes razón, la palabra que dije no fue la adecuada, debí usar mejor el término "ambigüedad" y la verdad muchas gracias por corregir, así no volveré a cometer el mismo error.
No intenté pasarte por encima en ningún momento, sólo estaba daba mi punto de vista a la guía que divulgaste, pero al parecer usted lo tomo de otra forma. Así que no es necesario decirle a una persona creído o que se cree superior a los demás, sólo porqué le expuso su perspectiva del tema.
Con respecto a tu pregunta:
Si una variable para un jugador sólo tendrá 2 resultados, ¿ para que quieres añadir más variables si con una solamente resumes ?.
No sé sí realmente te tomaste la molestia de leer y analizar lo que dije, ahí mismo en el comentario está tu respuesta.
Sí, no es necesario añadir más variables, con un "array" se hace todo, sí, es más rápido. El objetivo de mi explicación era que tanto los "arrays" como las variables individuales, son GLOBALES, claro, sí se lo declara así.

Otras de las cosas mencionadas:
Sobre el método tedioso que expones te diré que no le veo sentido el tutorial se explica el uso de las variables booleanas pero parece que las confundas.

Amigo, eso fue para demostrar que tanto los "arrays" como variables individuales, son GLOBALES y que sirven también para guardar información del jugador.

Y cuando dices:
No es obligatorio el uso de forward antes de la función ya que se le puede declarar con stock.
La palabra clave "stock" no tiene nada que ver aquí, ese identificador reservado la usas cuando tu función nunca va a ser utilizada en ninguna parte del "script", como funciones, procedimientos o devoluciones de llamadas. También usan el "stock" para librerías públicas, ya que en dicho "include" no se usarán todas esas funciones, entonces ahí sí se podría usar ese prefijo.
Sí, cuando las funciones no tienen ningún "tag", no es necesario usar el "forward", porqué el compilador supone que la función devolverá un "entero", pero cuando el "tag" es diferente a "integer", siempre se deberá declarar la función con "forward", ya que se le debe avisar al compilador que la función será usada para luego definir la función.
¡Qué tenga un feliz día! ¡Saludos!

- Temporalmente estoy retirado de SA-MP; por lo tanto no me envíen propuestas de proyectos.
- No respondo dudas por privado, usa la sección de preguntas.
Responder