[TUT] Llaves { } en variables normales y char
#1
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} = // 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
Responder
#2
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.
Responder
#3
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.
[Imagen: paypalqr.png]
Responder
#4
Código PHP:
if(!g_is_connected{id}) 
=
Código PHP:
if(!g_is_connected[id]) 
Responder
#5
(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.
Responder
#6
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?
Responder
#7
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
Responder
#8
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
Responder
#9
(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
Responder
#10
lindo tuto :3
Hi Milashkasiya CrabCrab

Soy un #Panda.. Soy solo un tipo que parece #común pero soy todo lo contrario; alguien #atípico en esta sociedad actual

[Imagen: xl0jvd-5.png]
Link
Responder
#11
Buen tuto, pero no me queda en claro, ¿que gasta menos y que es mejor?
Believe, be yourself and don't hold on to just one dream ❤

https://github.com/FEDERICOMB96
Responder
#12
(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
Responder
#13
(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?
Believe, be yourself and don't hold on to just one dream ❤

https://github.com/FEDERICOMB96
Responder
#14
(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
Responder
#15
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?
Responder
#16
(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:
Código PHP:
new test[8]; 

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
Código PHP:
new test[8 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.
[Imagen: paypalqr.png]
Responder
#17
Este tipo char lo habia visto en pawn laguague guide y en los plugins de connor pero nunca entendi cuando debia usarlos Confundido. Ahora ya lo se y creo que empezare a usarlos (? (mucha redundancia me meti xd)
Hi [R]ak CrabCrab
Responder
#18
UPDATE
corregido algunos errores y agregado un poco mas de info
Responder
#19
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} = 

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
Responder
#20
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.
Responder
#21
(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} = 

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.
Responder
#22
(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.
Responder
#23
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
Responder
#24
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

Código PHP:
hola{} 

Lol
Responder
#25
Update

Viví engañado :S. Te maldigo Bugsy!
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)