[2do parcial Julio 2016] [Problema 2 - Parte 3] Chequeo de un archivo con FAT

[2do parcial Julio 2016] [Problema 2 - Parte 3] Chequeo de un archivo con FAT

de Hugo Sebastian Rodriguez Reyes -
Número de respuestas: 4

Estimados,

Vi la solución de este ejercicio, pero me quedó un poco distinta y me gustaría saber si tiene algún error:

Function checkArchivo (archivo : entry) : boolean

Begin

if (!archivo.usado || archivo.tipo == DIRECTORIO)

return false;

int cantSectores = archivo.tamaño / 512 // Supongo que redondea para arriba

circular : array [0..(MAX_SECTORS_DISK - 1)] of bool;

circular = {false..false};

int sectorActual = archivo.comienzo;

while (F[sectorActual] != 0){

if (sectorActual < -1 || (MAX_SECTORS_DISK - 1) < sectorActual)

return false;

if (circular[sectorActual])

return false;

circular[sectorActual] = true;

cantSectores--;

if (cantSectores < 0)

return false;

sectorActual = F[sectorActual];

}

return true;

End

En respuesta a Hugo Sebastian Rodriguez Reyes

Re: [2do parcial Julio 2016] [Problema 2 - Parte 3] Chequeo de un archivo con FAT

de Manuel Freire -

Buenas,

La solución en términos generales está bien sin embargo tengo algunos apuntes.

  • El < de if (sectorActual < -1 || (....) debería ser <=, en el caso de que te topes con un bloque libre (indicado con -1) tenés que dar error y en caso de que no te explotaría la siguiente iteración.
  • En el retorno hay que chequear el tamaño como hace en la solución del parcial (bloques ==  0) para estar seguro que el tamaño es el correcto.
  • Esto es más puntual pero creo que sería mejor usar un redondeo hacia arriba (que no es lo que estás haciendo aunque lo ponés en el comentario) ¿Por qué? Porque si un archivo tiene de tamaño 527 bytes tiene claramente dos sectores asignados y 527/512 = 1 (division entera).
De los tres el error "importante" es el del medio porque te estás comiendo un chequeo, las otras dos (y sobre todo la última) son detalles.

Saludos!
En respuesta a Manuel Freire

Re: [2do parcial Julio 2016] [Problema 2 - Parte 3] Chequeo de un archivo con FAT

de Hugo Sebastian Rodriguez Reyes -
Muchas gracias por tu respuesta.


Respecto al punto 2, si cambiara la condición del último if dentro del while:

if (cantSectores < 0)

return false;

Por:

if (cantSectores != 0)

return false;

No sería necesario retornar afuera del while (cantSectores == 0), no?

En respuesta a Hugo Sebastian Rodriguez Reyes

Re: [2do parcial Julio 2016] [Problema 2 - Parte 3] Chequeo de un archivo con FAT

de Manuel Freire -

No, si hacés eso cualquier archivo no vacío retornaría false. Tenés que hacerlo al final porque es la única forma de saber si el tamaño que dice en el inodo corresponde con la cantidad de bloques asignados.

Saludos!