Pascal/Turbo Pascal - Problema dificil

 
Vista:

Problema dificil

Publicado por Victor (5 intervenciones) el 28/08/2008 23:39:31
Hola estoy haciendo un codigo y tengo hecho este procedimiento para unas listas pero no se por que cuando termina de ejecutarse el programa se termina y no sigue ejecutando los procedimientos despues de este:

os pongo los tipos:

Telemento=char;
PTNodo=^TNodo;
TLista = PTNodo;

TNodo=RECORD
elemento:Telemento;
siguiente:TLista;
End;

TProd = ^TProduccion;
TListaP = TProd;
TProd2 = RECORD
izq:TLista;
der:TLista;
end;

TProduccion = RECORD
prod:TProd2;
sig: TProd;
end;

Y el procedimiento

procedure simbolos_innecesarios (var listaP:TlistaP);
var
aux:TlistaP;
aux3:Tlista;
izq:char;
der:string;
begin
der:='';
aux:=listaP;
aux3:=aux^.prod.der;
while (aux<>NIL) do
begin
izq:=' ';
der:='';
izq:=aux^.prod.izq.elemento;
while (aux3<>nil) do begin
der:=der+aux3^.elemento;
aux3:=aux3^.siguiente;
end;
{if izq=der then begin
borrarlistaP(listaP,aux^.prod.izq^.Elemento,aux^.prod.der^.elemento);
aux:=listaP;
end; }
aux:=aux^.sig;
aux3:=aux^.prod.der;
end;
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:Problema dificil

Publicado por Victor (5 intervenciones) el 28/08/2008 23:42:00
Me acabo de dar cuenta que el codigo del procedimiento que he pegado tiene un IF comentado, pero es por que estoy haciendo pruebas y se me fue al pegarlo, el codigo es sin eso comentado.
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

RE:Problema dificil

Publicado por Diego Romero (996 intervenciones) el 29/08/2008 09:08:12
La verdad es que no veo ningún problema en el código que has posteado. ¿Seguro que el programa no se sale con un mensaje de error?.
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

RE:Problema dificil

Publicado por Victor (5 intervenciones) el 29/08/2008 10:09:12
El problema es que cuando llamo al procedimiento en el programa principal me lo ejecuta ,pero cuando termina en vez de volver al programa principal y continuar ejecutando el siguiente procediemiento, se salta a la penultima linea que es un readln y se sale del programa saltandose los demas procedimientos.

Sospecho que pueda ser por el while ya que cnd lo quito lo ejecuta y no se sale pero claro no hace la funcion que necesito que haga.
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

RE:Problema dificil

Publicado por Diego Romero (996 intervenciones) el 29/08/2008 10:18:06
Parece un problema de bloques mal balanceados pero no veo que a un begin le falte su correspondiente end;. Sospecho que el problema está en otra parte, ¿podrías postear el bloque principal del programa?
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

RE:Problema dificil

Publicado por Diego Romero (996 intervenciones) el 29/08/2008 10:22:46
Ah!, una cosa, al margen:

izq:=aux^.prod.izq.elemento;

Esa línea es icorrecta. "izq" es un puntero, lo correcto sería:

izq:=aux^.prod.izq^.elemento;
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

RE:Problema dificil

Publicado por Victor (5 intervenciones) el 29/08/2008 10:22:59
Es un poco largo pero ahi va, el problema es justo cuando llamo a "simbolos innecesarios" lo ejecuta y se sale del programa, y no ejecuta el "mostrar_todo_p" que cuando lo llamo antes de "simbolos innecesarios" si que va bien.


program Project1;

{$APPTYPE CONSOLE}

uses
SysUtils,
Unit1 in 'Unit1.pas',
Lista2 in 'Lista2.pas',
LProd in 'LProd.pas',
main in 'main.pas';

var
gentrada,palabra,glimpia,g_fnc,reconocida,listado,n:string;
i:integer;
f1:text;
aux:string;
simbolo:char;
L:Tlista;
error,parteder:boolean;
cont:integer;
axioma:Telemento;
listaT,listaNT,laux2:Tlista;
listaPROD:TlistaP;
producion, reglaProduccion:TProd2;
begin
aux:='';
simbolo:=' ';
axioma:=' ';
error:=false;
cont:=1;
gentrada:=ParamStr(1);
//palabra:=ParamStr(2);
glimpia:=ParamStr(2);
//g_fnc:=ParamStr(4);
//reconocida:=ParamStr(5);
//listado:=ParamStr(6);
//n:=Paramint(7);
assign(f1,gentrada);
{$I-}
reset(f1);
{$I+}
If IOResult <> 0 then
Begin
writeln('Error al leer el primer parametro.');
End;
i:=1;
while (not eof(f1)) do begin
while (not eoln(f1)) do begin
parteDer:=False;
readln(f1,aux);
if cont=1 then begin
for i:=1 to length(aux) do begin
if (aux[i]<>' ') then
begin
simbolo:=aux[i];
end;
if (aux[i]=' ') or (i=length(aux)) then
begin
insertar(listaT,simbolo);
end;
end;
end;
if cont=2 then begin
for i:=1 to length(aux) do begin
if (aux[i]<>' ') then
begin
simbolo:=aux[i];
end;
if (aux[i]=' ') or (i=length(aux)) then
begin
insertar(listaNT,simbolo);
end;
end;
end;
if cont=3 then
begin
axioma:=aux[1];
end;
if (cont>3) then
begin
i:=1;
while (i<=(length(aux))) do
begin
if ((aux[i]<>' ') AND (parteDer = FALSE)) then
begin
simbolo:=aux[i];
insertar(Producion.izq,simbolo);
parteDer:=true;
inc(i);
end;
if (aux[i] = ':') then
begin
inc(i);
if (aux[i] = ':') then
begin
inc(i);
if (aux[i] = '=') then
begin
parteDer := TRUE;
inc(i);
end;
end;
end;
if ((aux[i]<>' ') AND (parteDer = TRUE)) then //Estamos ya en la parte derecha. No habrá huecos pero lo controlamos por si acaso
begin
simbolo:=aux[i];
insertar(Producion.der,simbolo);
end;
if i=length(aux) then //Si termina la cadena metemos la produccion en la lista.
begin
insertarP(listaProd,Producion);
//listaProd:=listaProd^.sig;
end;
inc(i);
end;
crearLista(producion.izq);
crearLista(producion.der);
end;
inc(cont);
end;
end;

mostrar(listaT);
readln;
mostrar(listaNT);
readln;
writeln;
readln;
G2_G3(listaProd,listaT,axioma,listaNT,error);
mostrar_todo_P(listaProd);
readln;
// if (not error) then begin
simbolos_innecesarios(listaProd);
// simbolos_inacesibles(listaProd,axioma,listaNT);
readln;
mostrar_todo_P(listaProd);
readln;
//end;
{if (not error) then begin
simbolos_inaccesibles(L,G);
simbolos_innecesarios(L,G);
redenominacion(L,G);
FNC(L,G);
if (not error) then
volcar_gramatica(L,G,glimpia);
writeln(G.terminales);
writeln(G.No_terminales);
writeln(G.axioma);
visualiza(L);
readln;
transformar_a_FNC(L,G);
writeln(G.terminales);
writeln(G.No_terminales);
writeln(G.axioma);
visualiza(L);
readln;
end
else
volcar_error(glimpia);
readln; }
end.
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

RE:Problema dificil

Publicado por Diego Romero (996 intervenciones) el 29/08/2008 10:38:08
No lo puedo compilar, me faltan todas las unidades.

Hagamos una cosa, envíame todos los archivos necesarios a mi correo que está en mi página web (la dirección de hotpop.com no funciona).
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