sisoputnfrba / foro

Foro de consultas para el trabajo práctico
149 stars 7 forks source link

funcion bitarray_create_with_mode #724

Closed CarolinaPonceRodriguez closed 7 years ago

CarolinaPonceRodriguez commented 7 years ago

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!

nicozar95 commented 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)

CarolinaPonceRodriguez commented 7 years ago

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.

mgarciaisaia commented 7 years ago

@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!

CarolinaPonceRodriguez commented 7 years ago

Bien, supongamos el caso que se detalla en el tp:

Saludos!.

mgarciaisaia commented 7 years ago

👋 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?

CarolinaPonceRodriguez commented 7 years ago

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.

gastonprieto commented 7 years ago

Y si abris el archivo que escribiste que contenido tiene?

CarolinaPonceRodriguez commented 7 years ago

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.

gastonprieto commented 7 years ago

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)

CarolinaPonceRodriguez commented 7 years ago

Hola que tal, me funciono, pero en vez de usar el comando truncate, me tire por usar el comando dd. Gracias. Saludos!