Sobre etiquetas
#1

Hola,
He estado pensando en algunas cosas sobre el lenguaje pawn, por ejemplo las etiquetas
їPara que sirven en sн, en realidad asignan el tipo de dato?
Por ejemplo, para usar una variable de tipo punto flotante deberнa usar: Float:
De tipo proposicional serнa usar: bool:
їPero por que se debe usar esto, usando esto se cambiarб el tamaсo de bytes de la variable?
Por ejemplo supongo que para float serбn 4 bytes, para proposicional serнa 1 byte y una de tipo normal serнa de 2 bytes
Pero he encontrado que se puede usar esto:
bool:Variable[500 char];
O sea, їuna variable proposicional como tipo de dato char? WTF
їPodrнan explicarme por quй se puede realizar esto y para que sirven los tags?
Reply
#2

Yo nunca me complico, uso "float" para cuando almacenarй vida o alguna coordenada.
Uso "bool" cuando en vez de usar "1" o "0" prefiero usar true o false
Reply
#3

PAWN maneja solo un tipo de dato, que se llama cell (y tiene 4 bytes) que seria un integer. Las etiquetas se usan para especificar tipos de datos "abstractos", en realidad, que lo unico que hacen es enviarle warnings al compilador cuando se escriben mal (o en el caso de Float:, errores, ya que Float es un Tag del lenguaje me imagino). Escribirle bool: adelante no sirve de nada, y va a usar los mismos 4 bytes de una "cell". Lo que va a hacer es que cuando quieras asignarle un valor diferente de 1 y 0 a la variable, va a dar un error o warning, no me acuerdo. La palabra char divide la cantidad de indices en 4. En C char es un tipo de dato de 1 byte, entonces escribir:
pawn Код:
new x[4 char]; // Creariamos una variable de 1 cell (4 bytes), ya que como dije, char divide el valor por 4, entonces 4/4 = 1. Creamos una variable de tamaсo: 4 bytes.

/* Pero si escribimos: */
new x[4]; // Seria el equivalente a "int x[4]" en c. 4 celdas x 4 bytes = 16 bytes.
Para acceder a un byte en particular en una variable, usamos {}.
Ejemplo:
pawn Код:
new var[1]; // Variable de 4 bytes (1 cell)

// Modificamos los valores de cada uno de los 4 bytes (obviamente entre 0 y 255, de lo contrario estariamos cambiando el valor siguiente, lo que es peligroso.
var{0} = 0xAA;
var{0} = 0xBB;
var{2} = 0xCC;
var{3} = 0xDD;

printf("%x", var);

/* Imprime:
AABBCCDD
*/
Conclusion? No te compliques con esto, ahorrar memoria en pawn es una tarea muy dificil, ya que carece de elementos de control apropiados y te vas a complicar al vicio. Podrias imaginarte la palabra "char" como esto
pawn Код:
#define char /4
Reply
#4

Muchas gracias spell! Ahora entiendo mucho mas, y aprendн lo de var{0} = 0xAA;
Una cosa, en C їun entero ocupa 4 bytes?, tenнa entendido que solo usaba 2
Reply
#5

Si, short es el que ocupa 2 bytes. Int 4, y long 8
Reply
#6

Oh vale, tengo un problema personal con la memoria y optimizaciуn asн que voy a estar cambiando algunas cosas y usar binario o hexadecimal para ahorrar mas memoria.
Gracias!
EDIT: їHay alguna forma de trabajar con bits solamente?
Creo que es mucho desperdicio 8 bits para un true o false :P
Reply
#7

Existen formas, pero son muy complicadas. Se puede hacer con los operadores << >> que mueven bits de un lado al otro, hay un include que se llama y_bits de ****** para trabajar con booleanos que son realmente booleanos, de cualquier forma pienso que trabajar con bytes es suficiente en la mayoria de los casos. Un saludo
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)