[Guía] IDs de dialogos en enum.

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
#Fede
Moderador Global
Moderador Global
Mensajes: 3133
Registrado: 12 Ene 2015 06:32
Ubicación: Montevideo, Uruguay.
Reputación: 75

20 Jul 2018 23:05

A ver, este tema va a ser corto, es principalmente para explicar una cosa que creí que ya estábamos en una etapa de conocimiento en la que no usábamos estas practicas tan malas.

Vengo a darles la manera de utilizar un enum para almacenar la ID de los diálogos de manera que nosotros no tengamos asignarles IDs (y que ocurra lo que pase cuando se superponen).
 Codigo Pawno:
1
2
3
4
5
6

enum dialogs
{
    DIALOGO_PRUEBA,
    D_HOLA,
    HOLA
}
  Cantidad de llaves: Abiertas(1)-Cerradas(1) | Lineas Totales: 6
Es así de sencillo, realmente parece una tontería, pero hay gente que continua usando los #define para diálogos, y eso ya no es una buena practica, es mucho mas rápido de esta manera en mi opinión (Me refiero a la definición de diálogos).

¿Y como se usaria en OnDialogResponse?
De la misma manera que usas los de #define, no cambia en nada.

Ejemplo:
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

enum dialogs
{
    DIALOGO_PRUEBA
}

public OnPlayerConnect(playerid){
    ShowPlayerDialog(playerid, DIALOGO_PRUEBA, DIALOG_STLYE_MSGBOX, "Bienvenido", "¡Hola!", "Hola", "Adios");
    return 1;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    switch(dialogid)
    {
          case DIALOGO_PRUEBA: {
               if(!response) Kick(playerid);
               SendClientMessage(playerid, -1, "Que bien que aceptaste.");
          }
    }
    return 1;
}
  Cantidad de llaves: Abiertas(5)-Cerradas(5) | Lineas Totales: 21
Muy sencillo, pero bastante gente no lo conocía esto.

Edición: A petición de HERMES, agrego unas cosas al tema.

En caso de utilizar Filterscripts, hay que asignar una ID no usada. Ejemplo rápido;
 Codigo Pawno:
1
2
3
4
5
6

enum dialogs
{
     DIALOGO_FS = 450, // Asignamos ID 450.
     DIALOGO_FS2, // Esta va a ser 451.
     DIALOGO_FS3 // 452, y asì sucesivamente.
}
  Cantidad de llaves: Abiertas(1)-Cerradas(1) | Lineas Totales: 6
Estoy fuera de SA-MP, no me envíen mensajes privados invitándome a proyectos.


scriptnoob escribió:Cada día se va mejorando el foro, nuestro objetivo es como el de una empresa:

Misión: Brindar ayuda y aportes a los usuarios.
Visión: Ser la página de mayor calidad de servicio de soporte referidos a lenguajes de programación.
Lee las reglas del foro para evitar ser sancionado




Avatar de Usuario
#Roy
Aprendiz
Aprendiz
Mensajes: 197
Registrado: 25 Ago 2015 18:25
Reputación: 4

21 Jul 2018 01:00

No tenia ni idea de esto sinceramente. Muy bueno Fede!!.
Experto en el ámbito de los mapeos

Mapeos aportados:
Evilp
Aprendiz
Aprendiz
Mensajes: 59
Registrado: 29 Mar 2018 09:43
Ubicación: Venezuela
Contactar:
Reputación: 1

21 Jul 2018 12:52

Sinceramente muy bueno, muy fácil de manejar.
𝔼𝕍𝕀𝕃ℙ🐺

Avatar de Usuario
MrDave
Ayudante
Ayudante
Mensajes: 1048
Registrado: 05 Oct 2017 12:13
Reputación: 113

21 Jul 2018 12:59


Totalmente desacuerdo, ¿por qué sería una mala práctica usar la directiva "#define" para diálogos? ¿A caso ocasionaría un problema? Por lo tanto no es una mala práctica, sí lo fuera, habría posibles errores o fallos en tiempo de ejecución o incluso errores de sintaxis.
Se debe usar macros lo más posible que se pueda, ya que no ocupará ningún espacio en la memoria del servidor, en cambio los "enum" sí, ya que son variables constantes y como por defecto su tipo de dato es "integer", tendrán un peso de "4 bytes".
Una macro es una simple indicación de una sustitución que será dirigida al pre-procesador (algo que es invocado por el compilador que sucederá antes de comenzar el análisis de la escritura y traducción del código).
Sí tengo esto:
 Codigo Pawno:
1
2
3
4

#define DIALOG_EXAMPLE 0

public pc_cmd_dialog(playerid)
	return ShowPlayerDialog(playerid, DIALOG_EXAMPLE, DIALOG_STYLE_MSGBOX, "Title", "Contenido", "Cerrar", "");
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 4
El pre-procesador reemplazará el nombre "DIALOG_EXAMPLE" por el dígito '0'.
 Codigo Pawno:
1
2

public pc_cmd_dialog(playerid)
	return ShowPlayerDialog(playerid, 0, DIALOG_STYLE_MSGBOX, "Title", "Contenido", "Cerrar", "");
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 2

Ya que el compilador no tomará el "DIALOG_EXAMPLE", sino el valor original.
Así que no podemos decir que es un mala práctica usar "#define" en diálogos, incluso, sería recomendable emplearlo; sin embargo, la gente puede utilizar lo que quiera, pero en teoría, es así.
Y antes de terminar este comentario, tengo que recalcar algo. Sí quieres usar un identificador declarado con "enum" en una condicional "if", deben emplear de un "tag" al valor comparado, de lo contrario, saldrá un "warning".
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10
11
12
13

enum dialog
{
	DIALOG
};

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
	if(dialogid == DIALOG) //warning
	{
	    //código
	}
	return 1;
}
  Cantidad de llaves: Abiertas(3)-Cerradas(3) | Lineas Totales: 13

¿Por qué saldrá una advertencia? Porqué el identificador "dialogid" no pertenece en la lista "enum dialog".
¿Cuál es la solución? Emplear un "tag" al principio del parámetro "dialogid".
 Codigo Pawno:
1

if(dialog:dialogid == DIALOG) 
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 1

- 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
#Fede
Moderador Global
Moderador Global
Mensajes: 3133
Registrado: 12 Ene 2015 06:32
Ubicación: Montevideo, Uruguay.
Reputación: 75

21 Jul 2018 13:12

MrDave escribió:
21 Jul 2018 12:59

Totalmente desacuerdo, ¿por qué sería una mala práctica usar la directiva "#define" para diálogos? ¿A caso ocasionaría un problema? Por lo tanto no es una mala práctica, sí lo fuera, habría posibles errores o fallos en tiempo de ejecución o incluso errores de sintaxis.
Se debe usar macros lo más posible que se pueda, ya que no ocupará ningún espacio en la memoria del servidor, en cambio los "enum" sí, ya que son variables constantes y como por defecto su tipo de dato es "integer", tendrán un peso de "4 bytes".
Una macro es una simple indicación de una sustitución que será dirigida al pre-procesador (algo que es invocado por el compilador que sucederá antes de comenzar el análisis de la escritura y traducción del código).
Sí tengo esto:
 Codigo Pawno:
1
2
3
4

#define DIALOG_EXAMPLE 0

public pc_cmd_dialog(playerid)
	return ShowPlayerDialog(playerid, DIALOG_EXAMPLE, DIALOG_STYLE_MSGBOX, "Title", "Contenido", "Cerrar", "");
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 4
El pre-procesador reemplazará el nombre "DIALOG_EXAMPLE" por el dígito '0'.
 Codigo Pawno:
1
2

public pc_cmd_dialog(playerid)
	return ShowPlayerDialog(playerid, 0, DIALOG_STYLE_MSGBOX, "Title", "Contenido", "Cerrar", "");
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 2

Ya que el compilador no tomará el "DIALOG_EXAMPLE", sino el valor original.
Así que no podemos decir que es un mala práctica usar "#define" en diálogos, incluso, sería recomendable emplearlo; sin embargo, la gente puede utilizar lo que quiera, pero en teoría, es así.
Y antes de terminar este comentario, tengo que recalcar algo. Sí quieres usar un identificador declarado con "enum" en una condicional "if", deben emplear de un "tag" al valor comparado, de lo contrario, saldrá un "warning".
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10
11
12
13

enum dialog
{
	DIALOG
};

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
	if(dialogid == DIALOG) //warning
	{
	    //código
	}
	return 1;
}
  Cantidad de llaves: Abiertas(3)-Cerradas(3) | Lineas Totales: 13

¿Por qué saldrá una advertencia? Porqué el identificador "dialogid" no pertenece en la lista "enum dialog".
¿Cuál es la solución? Emplear un "tag" al principio del parámetro "dialogid".
 Codigo Pawno:
1

if(dialog:dialogid == DIALOG) 
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 1
Si el nombre del enum es "dialogs", no es necesario poner la etiqueta. Si usa "dialog" como nombre, si lo es.

Aquí hay dos extremos: Optimizacion o Facilidad.

El método de los enums es mas sencillo que el de #define ya que la asignación de un numero es automática, caso contrario a el #define, que es manual, por eso opino que este método es mucho mas fácil para los programadores nuevos.

El método de los #define aunque mas optimo (No se usa memoria, como dices), podría ser mas dificultoso para programadores novatos, ya que pueden cometer el error de asignar una ID que ya este en uso.

Por cierto, ¿El tamaño de integers, no es 2 bytes? (Al menos en Java, es de 2 bytes, según tengo entendido, en PAWN también lo era).
Estoy fuera de SA-MP, no me envíen mensajes privados invitándome a proyectos.


scriptnoob escribió:Cada día se va mejorando el foro, nuestro objetivo es como el de una empresa:

Misión: Brindar ayuda y aportes a los usuarios.
Visión: Ser la página de mayor calidad de servicio de soporte referidos a lenguajes de programación.
Lee las reglas del foro para evitar ser sancionado




Avatar de Usuario
MrDave
Ayudante
Ayudante
Mensajes: 1048
Registrado: 05 Oct 2017 12:13
Reputación: 113

21 Jul 2018 13:32

Spoiler:
#Fede escribió:
21 Jul 2018 13:12
MrDave escribió:
21 Jul 2018 12:59

Totalmente desacuerdo, ¿por qué sería una mala práctica usar la directiva "#define" para diálogos? ¿A caso ocasionaría un problema? Por lo tanto no es una mala práctica, sí lo fuera, habría posibles errores o fallos en tiempo de ejecución o incluso errores de sintaxis.
Se debe usar macros lo más posible que se pueda, ya que no ocupará ningún espacio en la memoria del servidor, en cambio los "enum" sí, ya que son variables constantes y como por defecto su tipo de dato es "integer", tendrán un peso de "4 bytes".
Una macro es una simple indicación de una sustitución que será dirigida al pre-procesador (algo que es invocado por el compilador que sucederá antes de comenzar el análisis de la escritura y traducción del código).
Sí tengo esto:
 Codigo Pawno:
1
2
3
4

#define DIALOG_EXAMPLE 0

public pc_cmd_dialog(playerid)
	return ShowPlayerDialog(playerid, DIALOG_EXAMPLE, DIALOG_STYLE_MSGBOX, "Title", "Contenido", "Cerrar", "");
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 4
El pre-procesador reemplazará el nombre "DIALOG_EXAMPLE" por el dígito '0'.
 Codigo Pawno:
1
2

public pc_cmd_dialog(playerid)
	return ShowPlayerDialog(playerid, 0, DIALOG_STYLE_MSGBOX, "Title", "Contenido", "Cerrar", "");
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 2

Ya que el compilador no tomará el "DIALOG_EXAMPLE", sino el valor original.
Así que no podemos decir que es un mala práctica usar "#define" en diálogos, incluso, sería recomendable emplearlo; sin embargo, la gente puede utilizar lo que quiera, pero en teoría, es así.
Y antes de terminar este comentario, tengo que recalcar algo. Sí quieres usar un identificador declarado con "enum" en una condicional "if", deben emplear de un "tag" al valor comparado, de lo contrario, saldrá un "warning".
 Codigo Pawno:
1
2
3
4
5
6
7
8
9
10
11
12
13

enum dialog
{
	DIALOG
};

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
	if(dialogid == DIALOG) //warning
	{
	    //código
	}
	return 1;
}
  Cantidad de llaves: Abiertas(3)-Cerradas(3) | Lineas Totales: 13

¿Por qué saldrá una advertencia? Porqué el identificador "dialogid" no pertenece en la lista "enum dialog".
¿Cuál es la solución? Emplear un "tag" al principio del parámetro "dialogid".
 Codigo Pawno:
1

if(dialog:dialogid == DIALOG) 
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 1
Si el nombre del enum es "dialogs", no es necesario poner la etiqueta. Si usa "dialog" como nombre, si lo es.

Aquí hay dos extremos: Optimizacion o Facilidad.

El método de los enums es mas sencillo que el de #define ya que la asignación de un numero es automática, caso contrario a el #define, que es manual, por eso opino que este método es mucho mas fácil para los programadores nuevos.

El método de los #define aunque mas optimo (No se usa memoria, como dices), podría ser mas dificultoso para programadores novatos, ya que pueden cometer el error de asignar una ID que ya este en uso.

Por cierto, ¿El tamaño de integers, no es 2 bytes? (Al menos en Java, es de 2 bytes, según tengo entendido, en PAWN también lo era).

Sí es más fácil, pero igual deberían saber usar los dos métodos.
Según la wiki-samp una variable "integer" vale 4 bytes.

http://wiki.sa-mp.com/wiki/Scripting_Basics#Variables

- 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
HERMES
Administrador General
Administrador General
Mensajes: 2829
Registrado: 20 Sep 2014 12:53
Ubicación: localhost
Reputación: 121

21 Jul 2018 20:46

El problema es que esto sólo sirve para 1 script (es decir, si tienes todos los dialogs en un mismo script, como por ejemplo en el GM). Si usas el mismo método en 2 scripts que se ejecuten en el mismo servidor (por ejemplo, en el GM y en un FS) va a haber superposición de IDs. Yo personalmente prefiero definir el id antes, aunque este método es más práctico.
Avatar de Usuario
gloweryt
Junior
Junior
Mensajes: 195
Registrado: 16 May 2017 11:42
Ubicación: Colombia
Reputación: 11

22 Jul 2018 10:14

Aja tu metodo #Fede es mas práctico pero por un lado es mejor usar #define (lo prefiero personalmente) igual cada cual tiene la libertad de usarlo como quiera pues de todas formas no es una mala práctica y gracias por el aporte amigo... :D
No te preocupes si no funciona bien. Si todo estuviera correcto, serías despedido de tu trabajo

-Ley Mosher de Ingeniería de Software


Avatar de Usuario
Graber
Junior
Junior
Mensajes: 194
Registrado: 10 Abr 2016 19:16
Contactar:
Reputación: 22

22 Jul 2018 16:24

HERMES escribió:
21 Jul 2018 20:46
El problema es que esto sólo sirve para 1 script (es decir, si tienes todos los dialogs en un mismo script, como por ejemplo en el GM). Si usas el mismo método en 2 scripts que se ejecuten en el mismo servidor (por ejemplo, en el GM y en un FS) va a haber superposición de IDs. Yo personalmente prefiero definir el id antes, aunque este método es más práctico.
No es un problema en absoluto esto, ya que facilmente se puede hacer lo siguiente para ocupar otras IDs si haces un FS o algo mas:
 Codigo Pawno:
1
2
3
4
5
6

enum //dialogs fs
{
	DIALOG_SISTEMAFS = 123456, // DIALOG_SISTEMAFS ahora tiene 123456
	DIALOG_SISTEMA_MENU, //este tendría el valor de 123457
	DIALOG_BONITO, //y este 1234568
}
  Cantidad de llaves: Abiertas(1)-Cerradas(1) | Lineas Totales: 6
Siempre es mejor usar un enum, asi evitamos sobreponer dialogs en nuestros propios scripts. El usar #define para esto quiza no es una mala práctica, pero despues, TU serás responsable de mantener ese código y revisar constantemente cada vez que vayas a añadir un dialog id en define si es que ya esta definido. Obviamente, nos ahorramos muchos malestares usando un enum.

@MrDave, parece que tienes un concepto un poco equivocado sobre las constantes. Hay 2 tipos de constantes en Pawn: un const (puro, sin nada mas), que es una expresión constante que solo existe al compilar y se compila directamente en donde se use, y luego tenemos un new const, que crea una variable al ejecutarse el .AMX, que no se puede modificar, en terminos mas sencillo, es técnicamente una variable normal, con una simple regla que dice que no se puede modificar.

Cito de algun lugar que leí de C++ (solo que en C++ nuestro "const" sería "constexpr" y nuestro "new const", un "const")
new const es decirle al compilador "prometo no tocar esta variable" y que será evaluado al ejecutar el script.
const es decirle al compilador que este es un valor que nunca cambiará y será evaluado al compilar.

Dicho esto, nosotros podemos hacer esto
 Codigo Pawno:
1

main() { new const asd = random(3); }
  Cantidad de llaves: Abiertas(1)-Cerradas(1) | Lineas Totales: 1
Pero no esto, ya que un const solo existe al compilar:
 Codigo Pawno:
1

main() { const asd = random(3); } //dara error al compilar
  Cantidad de llaves: Abiertas(1)-Cerradas(1) | Lineas Totales: 1
Ahora, el tema del enum vs #define:
MrDave escribió:
21 Jul 2018 12:59
Se debe usar macros lo más posible que se pueda, ya que no ocupará ningún espacio en la memoria del servidor, en cambio los "enum" sí, ya que son variables constantes y como por defecto su tipo de dato es "integer", tendrán un peso de "4 bytes".
En eso estas equivocandote un poco. Espero que sepas tambien, que 0, 31267 y 231789 (y cualquier otro numero) son todas expresiones constantes. Un enum tambien tiene expresiones constantes, solo que estan definidas con nombres, que al momento de ensamblar el AMX, usara los valores constantes en vez de nombres. Esto no ocurre con una variable constante, que efectivamente ocupará memoria al iniciar el servidor, pero los enums y sus contenidos son expresiones constantes, no variables.

2 archivos diferentes:
test1.pwn


test2.pwn


Darán el mismo resultado. Si usamos la opción -a del pawncc (el compilador) para que nos muestre el código en lenguaje ensamblador, notaremos que ambos dan exáctamente el mismo resultado:


Nota la parte de aqui:

Código: Seleccionar todo

    case 3 1 ; esta es una instrucción especial para saltarse todos los case (como no hay case 3)
    case 0 2 ; aqui esta DIALOG_PRUEBA,
    case 1 3 ; aqui DIALOG_PRUEBA2,
    case 2 4 ; y aqui DIALOG_PRUEBA3,
Los miembros de un enum son expresiones constantes, al igual de "0" o "12323" por si solos tambien son expresiones constantes.

No pretendo dejar mal a nadie ni nada de eso, todos tenemos nuestras virtudes en diferentes areas de la programación.
Un saludo.
Imagen

No doy soporte por privado y no estoy disponible para ningún trabajo/proyecto/lo que sea. Eviten MPs de ese tema

Avatar de Usuario
HERMES
Administrador General
Administrador General
Mensajes: 2829
Registrado: 20 Sep 2014 12:53
Ubicación: localhost
Reputación: 121

22 Jul 2018 17:16

Graber escribió:
22 Jul 2018 16:24
HERMES escribió:
21 Jul 2018 20:46
El problema es que esto sólo sirve para 1 script (es decir, si tienes todos los dialogs en un mismo script, como por ejemplo en el GM). Si usas el mismo método en 2 scripts que se ejecuten en el mismo servidor (por ejemplo, en el GM y en un FS) va a haber superposición de IDs. Yo personalmente prefiero definir el id antes, aunque este método es más práctico.
No es un problema en absoluto esto, ya que facilmente se puede hacer lo siguiente para ocupar otras IDs si haces un FS o algo mas:
 Codigo Pawno:
1
2
3
4
5
6

enum //dialogs fs
{
	DIALOG_SISTEMAFS = 123456, // DIALOG_SISTEMAFS ahora tiene 123456
	DIALOG_SISTEMA_MENU, //este tendría el valor de 123457
	DIALOG_BONITO, //y este 1234568
}
  Cantidad de llaves: Abiertas(1)-Cerradas(1) | Lineas Totales: 6
Es una buena alternativa. Lo único que se debería tener en cuenta es de dejar un margen de ids para evitar el mismo problema (que también es fácil). Me explico: suponiendo que el último id del GM es 123455, y quiero agregarle 1 más, debería aumentar 1 en la asignación del id en la variable el FS (claro que esto sólo ocurre en caso de que tenga esa cantidad de dialogs, que es poco probable).

Sería bueno que aclares el tema de los ids en el primer mensaje, @#Fede.
Avatar de Usuario
MrDave
Ayudante
Ayudante
Mensajes: 1048
Registrado: 05 Oct 2017 12:13
Reputación: 113

23 Jul 2018 15:11

@Graber

Entonces el "enum" nunca ocupará ningún espacio en la memoria del servidor porqué en realidad no son ¡VARIABLES!
Pues claro, sí fuera una variable, tendría una específica área en la RAM; sin embargo, este no es el caso.
Sí hago esto:
 Codigo Pawno:
1
2
3
4
5
6

new x = 5;
enum Nombres
{
	Pepito = x,
	Pepita
};
  Cantidad de llaves: Abiertas(1)-Cerradas(1) | Lineas Totales: 6

Me saldría un error de sintaxis por parte del compilador, porqué la variable "x" se creará en tiempo de ejecución y esos identificadores que tiene "enum Nombres" sólo servirán hasta el tiempo de compilación.
Sí quiero asignar una variable dentro de otra variable constante, debería emplear del "new const", ahí no tiraría error.
 Codigo Pawno:
1
2

new x = 5;
new const y = x; //El valor que tenga "x" en tiempo de ejecución, será la expresión constante de la variable "y".
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 2

Ahora entiendo que sería más cómodo usar el "enum" para asociar números enteros con "nombres" y así no tengo que estar escribiendo a cada rato el "#define <nombre_de_la_constante> <expresion_constante>".
¡Muchas gracias por la explicación!
¡Qué tengas un feliz día!

- 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
Graber
Junior
Junior
Mensajes: 194
Registrado: 10 Abr 2016 19:16
Contactar:
Reputación: 22

23 Jul 2018 16:17

MrDave escribió:
23 Jul 2018 15:11
Sí quiero asignar una variable dentro de otra variable constante, debería emplear del "new const", ahí no tiraría error.
 Codigo Pawno:
1
2

new x = 5;
new const y = x; //El valor que tenga "x" en tiempo de ejecución, será la expresión constante de la variable "y".
  Cantidad de llaves: Abiertas(0)-Cerradas(0) | Lineas Totales: 2
Algo asi, solo que hay 2 diferencias entre "const" y "new const":
 Codigo Pawno:
1
2
3
4
5
6
7
8

new asd = 1;
new const fds = asd; //esta mal
main()
{
	new const a = asd; //esta bien
	const b = asd; //esta mal
	funcion(asd, a, b);
}
  Cantidad de llaves: Abiertas(1)-Cerradas(1) | Lineas Totales: 8
En la segunda linea (y me acabo de enterar al intentar probarlo) da error debido a que, si un "new const" esta fuera de una funcion, este no puede tomar valores en tiempo de ejecución, solo valores constantes que el compilador ya sabe. Me imagino ya que las variables que se declaran afuera de funciones. sea un new normal o un new const, siempre deben tener expresiones constantes.

En la quinta linea, vemos que new const se usa con una variable normal. Esto es posible ya que la combinación de "new const" dentro de una funcion simplemente quiere decir "prometo no cambiar esta variable", pero seguirá siendo una variable con espacio en la memoria. Ideal para mantener el código con buena práctica si sabemos que no vamos a cambiar un valor y queremos prevenir que se cambie. En cambio, en la 6ta linea dará error por que aqui estamos intentando declarar una expresion constante que el compilador sabrá. El compilador no puede saber el valor de asd ya que asd puede cambiar mientras se esté ejecutando el programa.
Imagen

No doy soporte por privado y no estoy disponible para ningún trabajo/proyecto/lo que sea. Eviten MPs de ese tema

Responder