Pascal/Turbo Pascal - Fallo en un proceso

 
Vista:

Fallo en un proceso

Publicado por Carlos (2 intervenciones) el 14/12/2006 19:57:05
Tengo un programa que usa la tecnica de compresion de datos RLE (Run Lenght Encoding). Se basa en la sustitucion de una secuencia de datos (terminada en punto) repetidos por un dato especial (marcador) seguido del numero de repeticiones y del dato que se repite.

En el caso

aaaaaaabbccccddde. ----------------> /7abb/4cddde

Bueno el caso esq mi programa se basa en dos procesos el de codificar y el de descodificar, y el segundo me falla al introducirle una secuencia que contenga el " / ", y no se a que se debe. ¿Alguna Idea?

Program RLE(input,output);
Var
seleccion:integer;
caracter:char;
Procedure Codificar(c:char);
Var
letrasiguiente,letra:char;
contador,i:integer;
Begin
contador:=1;
letra:=c;
Repeat
Read(letrasiguiente);
If letrasiguiente=letra
then
Begin
Contador:=Contador+1;
End
else
If contador>3
then
Begin
Write('/',contador:1,letra:1);
Contador:=1;
End
else
Begin
For i:=1 to contador do
Begin
Write(letra:1)
End;
Contador:=1;
End;
letra:=letrasiguiente;
Until letrasiguiente='.';
End;
Procedure Descodificar(c:char);
Var
letrasiguiente,letra:char;
contador,i:integer;
Begin
letra:=c;
If letra='/'
then
Begin
Read(contador);Read(letra);
For i:=1 to contador do
Write(letra:1);
Read(letra);
End;
Repeat
Read(letrasiguiente);
If letrasiguiente='/'
then
Begin
Read(contador);Read(letrasiguiente);
Write(letra);
For i:=1 to contador do
Write(letrasiguiente:1);
End
else
Write(letra:1);
letra:=letrasiguiente;
Until (letrasiguiente='.')OR(letra='.');
End;
Begin
Repeat
Writeln('Para codificar pulsa 1 ');
Writeln('Para descodificar pulsa 2 ');Readln(seleccion);
If seleccion=1
then
begin
Writeln('Dame una secuencia de caracteres terminada en punto');Read(caracter);
Codificar(caracter);
End;
If seleccion=2
then
Begin
Writeln('Dame una secuencia de caracteres codificada segun RLE');Read(caracter);
Descodificar(caracter);
End;
Until (seleccion=1)OR(seleccion=2);
Readln;Writeln(' ');
Repeat
Write('Para finalizar pulsa "Enter"');
Until caracter='?';
Readln;
End.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Fallo en un proceso

Publicado por Diego Romero (996 intervenciones) el 15/12/2006 00:58:36
No he revisado el código que has posteado, solo me atengo a tu explicación inicial.

Si usas como caracter indicador un caracter que también es un dato válido puede crear ambiguedad. Por ejemplo, si la cadena a comprimir es:

//4a

Cuando la decodifiques ¿qué significa exactamente?, ¿que hay que poner una barra seguida de cuatro aes?, ¿o hay que ponerlo literalmente?. Como esa misma es la cadena a compirimir cuando pase por ese proceso te quedaría:

/2//4a

Porque como tienes dos barras se traduce a /2/, pero la siguiente barra también es marcador de compresión ¿entonces?.

La solución sería "mirar hacia adelante" cuando estés comprimiendo. O sea, si encuentras una barra sola, codifícala con dos barras seguidas. Luego cuando estes descomprimiendo (decodificando) si encuentras una barra no te lances a multiplicar el caracter que le sigue según el número indicado, primero verifica que el siguiente caracter es también una barra, si lo es, decodifica una sola barra y continua. De este modo mi primer ejemplo se decodificaría correctamente.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar