Mensajes: 1,455
Temas: 36
Registro en: Oct 2013
Reputación:
6
27/04/2014, 05:28 AM
(Última modificación: 01/10/2014, 02:30 AM por Destro.)
Variable char obsoleta:
Se pensaba que las variables char ocupaban 1Byte,pero resulta que son asignadas de a 4Bytes, siendo igual que cualquier otra variable. De todos modos las llaves { } siguen siendo útil.
__________________________________________________________
Espesemos por lo básico:
Byte y bit:
Bit (Binary digit) es la mas mínima cantidad de información, solo se puede representar por 1 o 0 (true/false).
Byte es el conjunto de 8 bits.
Tipos de datos en Pawn
Pawn soporta un solo tipo de dato, el tipo cell(celda).
Cell es del tipo integer, tiene un tamaño de 32 bits (4 Bytes) o 64 bits (8 Bytes) dependiendo del equipo.
AmxModx
AmxModx solo soporta un único tipo de dato para sus natives y forwards, el tipo cell.
Etiquetas
Tal vez alguno se pregunte ¿y los tipos float/bool?.
En pawn Float y bool solo son etiquetas,no es un tipo de dato.
Llaves { }:
Hace un tiempo se pensaba que eran para acceder a cada elemento de una variable char, pero no resulto ser del todo cierto. El verdadero uso es para acceder a cada byte de cualquier variable.
Como solo se puede acceder a un byte, los valores numéricos que se pueden almacenar son de 0 a 255
¿Como utilizar las llaves { }?
Sintaxis básica:
Código PHP: new test[1]
test{0} = 4 test{1} = 5 test{2} = 6 test{3} = 7
test{4} = 8 // Invalido
server_print("[%d][%d][%d][%d]", test{0}, test{1}, test{2}, test{3})
/*Valido*/ new test[2]
test{0} = 4 test{1} = 5 test{2} = 6 test{3} = 7 test{4} = 8 test{5} = 9 test{6} = 10 test{7} = 11
Ejemplo en uso
Código PHP: /*En cualquiera de los dos casos la variable termina ocupando 36 Bytes*/ new g_is_connected[9] // o g_is_connected[33 char]
public client_putinserver(id) { g_is_connected{id} = 1 }
public client_disconnect(id) { g_is_connected{id} = 0 }
public una_funcion(id) { if(!g_is_connected{id}) // no esta conectado }
Usando llaves nos ahorramos 96 Bytes
¿En que casos es recomendado usar?
Cuando tengas que almacenar mas de un dato y que los valores de esos datos se encuentren entre 0 y 255
Mensajes: 3,020
Temas: 49
Registro en: Oct 2013
Reputación:
33
if(!g_is_connected{id}) te ahorras mas que con bitsums?
Ingeniero agrónomo y desarrollador de Software.
tutoriales-allied
buscas un zp?
"La imitación es la forma más sincera de admiración con la que puede pagar la mediocridad a la grandeza"
Merci Alliedmodders pour m'introduire dans la programmation.
Mensajes: 4,637
Temas: 73
Registro en: Oct 2013
Reputación:
44
Depende como uses los bits rocccox, si creas una variable y usas un solo bit, es al pedo ya que estas desperdiciando 31bits que estan reservados en memoria para esa variable.
Mensajes: 516
Temas: 133
Registro en: Oct 2013
Reputación:
4
Mensajes: 3,020
Temas: 49
Registro en: Oct 2013
Reputación:
33
(27/04/2014, 12:38 PM)Neeeeeeeeeel.- escribió: Depende como uses los bits rocccox, si creas una variable y usas un solo bit, es al pedo ya que estas desperdiciando 31bits que estan reservados en memoria para esa variable.
A joyita.
Ingeniero agrónomo y desarrollador de Software.
tutoriales-allied
buscas un zp?
"La imitación es la forma más sincera de admiración con la que puede pagar la mediocridad a la grandeza"
Merci Alliedmodders pour m'introduire dans la programmation.
Mensajes: 14
Temas: 1
Registro en: Mar 2014
Reputación:
0
Interesante, siempre quise usar variables de tipo char en pawn pero habia leido que solo podias usar de tipo celda
Cita:Pawn only has one data type -- the "cell". It is the size of the processor's integral pointer (4 bytes for 32bit processor, 8 bytes for 64bit processors). This has two major implications - Pawn bytecode is processor specific, and pointers can fit inside a cell.
He vivido una mentira toda mi vida e.e
PD: Es posible usar char en vez de unsigned char?
Mensajes: 2,176
Temas: 99
Registro en: Dec 2013
Reputación:
42
En el caso de "is_user_conected[33 char]" estariamos ahorrando 792 bits (99 Bytes)
Si al usar una variable "is_user_conected[33]" Cuantos bits estariamos usando ??.. Mejor dicho, cual seria la diferencia entre estos ??
No se mucho con el tema de bitsums o este tipo pero me gustaria aprender mas
Free agent - Vendo plugins, mods o apps del foro IPB (Invision community)
Contactarme vía Discord >>> AtselTV#8202
Mensajes: 14
Temas: 1
Registro en: Mar 2014
Reputación:
0
La diferencia es que estas tomando entre esos 2, es que en el primero estas consumiendo menos bytes pero tenes acotado el rango de valores que podes darle (no hace diferencia si la usas de forma booleana). De igual forma es mejor crear una variable 'is_user_connected' y operar con bits, tenes 32 bits y usas 1 bit para chequear cada jugador
Mensajes: 1,455
Temas: 36
Registro en: Oct 2013
Reputación:
6
(27/04/2014, 04:06 PM)Zonejo escribió: PD: Es posible usar char en vez de unsigned char? aparentemente no,en la guiá de pawn especifica los valores como unsigned char
Mensajes: 2,870
Temas: 13
Registro en: Oct 2013
Reputación:
24
Mensajes: 3,284
Temas: 41
Registro en: Jan 2014
Reputación:
28
Buen tuto, pero no me queda en claro, ¿que gasta menos y que es mejor?
Mensajes: 2,459
Temas: 15
Registro en: Feb 2014
Reputación:
28
(28/04/2014, 12:57 PM)Federicomb escribió: Buen tuto, pero no me queda en claro, ¿que gasta menos y que es mejor?
No es que gaste menos es que cuando declaras una varible se le asigna un espacio determinado para guardar datos y si la creas como dice el tuto se reduce el tamaño de espacio por ende el dato que guardas en la varible tambien se reduce esto es recomendable para cuando una variable tipo bool q esta en 0 y en 1 por tanto no necesitas que el espacio de la variable sea bytes si no en bits
[TUT] Carnage
Fight
"El limite de los backdoors de gente q sabe programar como nostros lo impone nuestra maldad interior y creeme q soy muy malo en el interior"
Anónimo
Mensajes: 3,284
Temas: 41
Registro en: Jan 2014
Reputación:
28
(28/04/2014, 01:01 PM)mongito100 escribió: (28/04/2014, 12:57 PM)Federicomb escribió: Buen tuto, pero no me queda en claro, ¿que gasta menos y que es mejor?
No es que gaste menos es que cuando declaras una varible se le asigna un espacio determinado para guardar datos y si la creas como dice el tuto se reduce el tamaño de espacio por ende el dato que guardas en la varible tambien se reduce esto es recomendable para cuando una variable tipo bool q esta en 0 y en 1 por tanto no necesitas que el espacio de la variable sea bytes si no en bits
Haber si entendi bien, esto sirve solamente cuando usemos bool en una variable? Cuando no es bool, no es necesario?
Mensajes: 2,459
Temas: 15
Registro en: Feb 2014
Reputación:
28
(28/04/2014, 01:05 PM)Federicomb escribió: (28/04/2014, 01:01 PM)mongito100 escribió: (28/04/2014, 12:57 PM)Federicomb escribió: Buen tuto, pero no me queda en claro, ¿que gasta menos y que es mejor?
No es que gaste menos es que cuando declaras una varible se le asigna un espacio determinado para guardar datos y si la creas como dice el tuto se reduce el tamaño de espacio por ende el dato que guardas en la varible tambien se reduce esto es recomendable para cuando una variable tipo bool q esta en 0 y en 1 por tanto no necesitas que el espacio de la variable sea bytes si no en bits
Haber si entendi bien, esto sirve solamente cuando usemos bool en una variable? Cuando no es bool, no es necesario?
Sirve para cualquier variable el tema es q al ser menor el espacio asignado a la misma no puedes guardar datos muy extensos solo de 0 a 255(1 bit) si sabes que lo vas a guardar en la variable no se pasa de este rango de valor lo puedes hacer, yo te dije que era recomendables para una variable tipo bandera por q los valores que guardan estas variables por lo general son 0 y 1
[TUT] Carnage
Fight
"El limite de los backdoors de gente q sabe programar como nostros lo impone nuestra maldad interior y creeme q soy muy malo en el interior"
Anónimo
Mensajes: 843
Temas: 303
Registro en: Oct 2013
Reputación:
2
Hola, bueno intente cambiar el plugin de la ak gold por char pero tengo un tag mismach en esta linea:
Código PHP: if ( szWeapID == CSW_AK47 && g_HasAk{id} == true && get_pcvar_num(cvar_custommodel) )
como lo puedo arreglar?
Mensajes: 4,637
Temas: 73
Registro en: Oct 2013
Reputación:
44
30/04/2014, 08:50 AM
(Última modificación: 30/04/2014, 08:51 AM por Neeeeeeeeeel.-.)
(28/04/2014, 01:05 PM)Federicomb escribió: (28/04/2014, 01:01 PM)mongito100 escribió: (28/04/2014, 12:57 PM)Federicomb escribió: Buen tuto, pero no me queda en claro, ¿que gasta menos y que es mejor?
No es que gaste menos es que cuando declaras una varible se le asigna un espacio determinado para guardar datos y si la creas como dice el tuto se reduce el tamaño de espacio por ende el dato que guardas en la varible tambien se reduce esto es recomendable para cuando una variable tipo bool q esta en 0 y en 1 por tanto no necesitas que el espacio de la variable sea bytes si no en bits
Haber si entendi bien, esto sirve solamente cuando usemos bool en una variable? Cuando no es bool, no es necesario? Cuando creás:
Cada celda de test (test[0], test[1], test[2], ...) tiene reservados 8 bytes en memoria donde puede almacenar datos. Es decir, si cada celda fuera definida como unsigned podrías guardar un número entre 0 y 4294967295. En pawn estas variables están definidas como signed, entonces podés guardar un número entre -2147483648 y 2147483647
En cambio, usando variables char
Cada celda de test tiene reservado un único byte en memoria para almacenar datos. Es decir que podés guardar un número entre 0 y 255 en pawn. Aparentemente, según Destro, las variables de tipo char se declaran como unsigned entonces no podemos guardar números negativos.
Los chars son excelentes para guardar strings en pawn, ya que la tabla ansci básica usa 1 byte para cada caracter.
Siempre y cuando no se usen caracteres UTF-8, actualmente el CS Steam tiene soporte para UTF-8 (acentos, ñ, letras rusas, etc). Los caracteres UTF-8 usan 2 bytes para cada caracter.
Mensajes: 538
Temas: 13
Registro en: Oct 2013
Reputación:
16
Este tipo char lo habia visto en pawn laguague guide y en los plugins de connor pero nunca entendi cuando debia usarlos . Ahora ya lo se y creo que empezare a usarlos (? (mucha redundancia me meti xd)
Hi [R]ak
Mensajes: 1,455
Temas: 36
Registro en: Oct 2013
Reputación:
6
UPDATE
corregido algunos errores y agregado un poco mas de info
Mensajes: 642
Temas: 25
Registro en: Feb 2014
Reputación:
17
06/06/2014, 07:53 PM
(Última modificación: 21/06/2014, 10:53 PM por Kane.)
No entendi porque no puede funcionar en dimenciones multiples, como
Código PHP: new g_vars[33 char][6 char]
g_vars{id}{0} = 1 g_vars{id}{1} = 2 g_vars{id}{2} = 3 g_vars{id}{3} = 4
Dice que 'Multi-dimensional arrays must be into '[]''
algo asi, igual nose porque pasa eso.
(19/06/2014, 11:08 PM)01011001 escribió: No tiene niveles infinitos, llega hasta 2147483648 (Y despues hace un integer overflow)
(19/06/2014, 11:08 PM)[R]ak escribió: Mis conocimientos aumentaron un 500% con este post
Mensajes: 1,616
Temas: 19
Registro en: Oct 2013
Reputación:
16
Una pregunta, ¿Por qué no se puede hacer lo siguiente?
Código PHP: new g_szName[33 char][32]
Ni te molestes en enviarme un mensaje privado para pedirme ayuda porque NO lo voy a contestar.
Gracias por su atención.
Mensajes: 1,455
Temas: 36
Registro en: Oct 2013
Reputación:
6
20/07/2014, 08:29 PM
(Última modificación: 20/07/2014, 08:35 PM por Destro.)
(06/06/2014, 07:53 PM)Kane escribió: No entendi porque no puede funcionar en dimenciones multiples, como
Código PHP: new g_vars[33 char][6 char]
g_vars{id}{0} = 1 g_vars{id}{1} = 2 g_vars{id}{2} = 3 g_vars{id}{3} = 4
Dice que 'Multi-dimensional arrays must be into '[]''
algo asi, igual nose porque pasa eso.
Código PHP: new g_test[33][2 char]
public plugin_init() { g_test[0]{0} = 5 g_test[0]{1} = 6 g_test[1]{0} = 8 g_test[1]{1} = 9 server_print("print:[%d]-[%d]-[%d]-[%d]", g_test[0]{0}, g_test[0]{1}, g_test[1]{0}, g_test[1]{1}) }
____________________________________________________________________________________
(20/07/2014, 07:37 PM)alan_el_more escribió: Una pregunta, ¿Por qué no se puede hacer lo siguiente?
Código PHP: new g_szName[33 char][32]
Código PHP: new g_szName[33][32 char]
igual no sirve para almacenar un string obtenido de una native.
Mensajes: 1,616
Temas: 19
Registro en: Oct 2013
Reputación:
16
(20/07/2014, 08:29 PM)Destro escribió: new g_szName[33][32 char]
igual no sirve para obtener un string directamente de una native. No entendí.
Ni te molestes en enviarme un mensaje privado para pedirme ayuda porque NO lo voy a contestar.
Gracias por su atención.
Mensajes: 2,459
Temas: 15
Registro en: Feb 2014
Reputación:
28
podrias explicar mejor este concepto
Cita:¿Se puede usar para almacenar una cadena?
Poder se puede,de echo para eso fue diseñado.Pero como las natives y forwards no lo soportan...
tengo entendido q se puede comprimir una cadena para almacenarla pero por q no lo soportan las natives y fowards no lo soportan
[TUT] Carnage
Fight
"El limite de los backdoors de gente q sabe programar como nostros lo impone nuestra maldad interior y creeme q soy muy malo en el interior"
Anónimo
Mensajes: 3,466
Temas: 18
Registro en: Oct 2013
Reputación:
54
Con simplemente decirte que las sintaxis de las natives son
Código PHP: native equal(algo[], algunotro[])
Como encajaria una variable que para ser llamada se usa su sintaxis
Mensajes: 1,455
Temas: 36
Registro en: Oct 2013
Reputación:
6
Update
Viví engañado :S. Te maldigo Bugsy!
|