Closed CarolinaPonceRodriguez closed 7 years ago
Buenas
No se si le estas pasando el tamaño adecuado al bitarray_create_with_mode
, fijate si funciona al enviarle algo como: bitarray_create_with_mode(pmap, sizeof(pmap),LSB_FIRST)
Gracias por el dato pero el tamanio es el correcto ya que yo leo la cantidad de bloques del metadata .bin, probe de usar la funcion bitarray_get_max_bit y me devuelve la cantidad correcta. De todas maneras, continuo con la misma duda que no fue resuelta. Saludos.
@CarolinaPonceRodriguez ¿cuánto te está dando cantidadBloques/8
?
No te olvides que la únidad mínima de información que puede procesar una computadora es un byte. Si tu cantidad de bloques no fuera múltiplo de 8 (digamos, 36), vos necesitás una cantidad de bits distinta a la que podés reservar (necesitás 36, pero al usarlos "de a bytes" tenés que reservar 5 bytes - 40 bits - para que entren los 36 bits).
Entonces, como C no sabe nada sobre andar manejando bits sueltos, lo más probable es que tu bitmap te muestre el valor de esos 4 bits de diferencia - porque algún valor tienen.
Si tu pregunta es respecto a esos 4 bits, no calientan. Dado que tenés sólo 36 bloques (en el ejemplo que inventé, obvio), nunca deberías intentar leer el valor del 37mo bit del bitmap, porque para vos no significa nada.
Contame si va por ahí la mano, o explayate un poco más para ver si te entiendo mejor.
¡Un abrazo!
Bien, supongamos el caso que se detalla en el tp:
Saludos!.
👋 Me tomé el atrevimiento de pegarme una pasada por su repo, y vi esta línea. Para el resto del mundo, la idea del código es algo así:
función inicializarBitmap {
file = abrir el archivo de bitmap...
for ( un par de veces ) {
fputc('0', file)
}
cerrar(file)
La clave está en '0'
. El caracter '0'
es el caracter ASCII que dibuja un 0. Pero no es el byte 0. Probá de hacer un printf("%d\n", '0');
- es decir, imprimir como número entero al literal '0'
. El resultado no va a ser 0 - más bien será 48, porque el dibujito del número 0 es el caracter 48 (así como el dibujito de la letra A es el número 65, por ejemplo).
¿Se entiende la diferencia entre el caracter y el número?
Entonces, claro - como estabas escribiendo 48's todo el tiempo, eventualmente algún 1 te va a aparecer (porque 48 es 00110000 en binario).
¿Puede que sea esto?
Gracias, pero sigo teniendo el mismo error, en este caso ahora hice lo siguiente: función inicializarBitmap { file = abrir el archivo de bitmap... for ( un par de veces ) { fprintf(file, "%d", 0) } cerrar(file)
Entiendo que ahi lo que estaria haciendo es escribir el decimal por lo cual si hago printf("%d",0) esto devuelve el 0 y 0 decimal es 0 binario. al usar bitarray_test_bit() me devuelve 00001100.
Saludos.
Y si abris el archivo que escribiste que contenido tiene?
Contiene los 0 que escribi, si escribo 10 ceros, pesa 10 bytes, lo cual es correcto. El problema radica al levantar eso a memoria, genero un puntero pmap, y al usar dicho puntero para generar el bitmap, es ese valor el que me termina devolviendo.
Saludos.
Para mi es lo que dice @mgarciaisaia, si vos estas viendo en el archivo 10 ceros, entonces significa que vez 10 caracteres '0'.
O lo abris como binario, y usas fwrite
y no fprintf
o fijate que existe un comando en linux que se llama truncate
que deja entre varias crear un archivos lleno de '\0' (o sea, todos los bits en 0)
Hola que tal, me funciono, pero en vez de usar el comando truncate, me tire por usar el comando dd. Gracias. Saludos!
Buenas que tal, tengo el archivo bitmap.bin el cual mapeo a memoria por lo cual cuento con un puntero void * pmap que apunta a dicho espacio reservado. Supongamos que tengo la siguiente secuencia de bit en mi archivo: 000110101010. cuando quiero crear el bitmap en base a lo que obtuve del archivo y hacer algo asi: bitarray_create_with_mode(pmap, cantidadBloques/8,LSB_FIRST) y al usar la funcion bitarray_test_bit para ver si mi bitarray creado coincide con los bits del archivo, veo que tengo seteados bits de mas. Entiendo que el seteo de bit corresponde a el bit de mayor o menor peso dependiendo del parametro que yo elija(LSB_FIRST, MSB_FIRST), pero no puedo hacer un bitarray_clean de eso, ya que pondria todos los bits seteados a 0.
Necesitaria una mano, gracias!