Pascal/Turbo Pascal - Error

   
Vista:

Error

Publicado por Miguel (162 intervenciones) el 24/09/2008 03:18:30
Bueno, estaba trabajando con lista simplemente encadenada y me encuentro con este error que me lo tira en FREE. "program recieved signal sigsegv segmentation fault".

Me las tira en varias partes del programa, así que les dejo la declaración y un ejemplo de donde me lo tira.

TYPE
TEmpleado = RECORD
nombre : STRING[20];
telefono : STRING[10];
direccion : STRING[20];
edad : INTEGER
END;

TNodo = ^TElem;

TElem = RECORD
info : TEmpleado;
next : TNodo;
END;

VAR
puntero : TNodo;

PROCEDURE AvElem (VAR punt : TNodo);
BEGIN
punt:=punt^.next;
END;

PROCEDURE CargaPers (VAR elemento : TEmpleado);
BEGIN
WRITE('Ingrese el nombre del empleado: ');
READLN(elemento.nombre);
WRITE('Ingrese el telefono del empleado: ');
READLN(elemento.telefono);
WRITE('Ingrese la direccion del empleado: ');
READLN(elemento.direccion);
WRITE('Ingrese la edad del empleado: ');
READLN(elemento.edad)
END;

PROCEDURE CargarSec (VAR p : TNodo);
VAR
q,x : TNodo;
preg : STRING[1];
elem : TEmpleado;
BEGIN
CLRSCR;
x:=p^.next;
preg:='S';
WHILE Upcase(preg)<>'N' DO
BEGIN
CLRSCR;
NEW(q);
CargaPers(elem);
q^.info:=elem;
q^.next:=x^.next; { aca me tira el error, por ejemplo }
x^.next:=q;
WRITE('¿Desea ingresar otro empleado? (S/N): ');
READLN(preg)
END;
END;

El programa compila pero si lo ejecuto, se clava ahí. Yo compilo con DEV, pero le hice un TRACE en FREE y justo ahí me larga ese cartel.
Bueno si alguien me puede ayudar se agradece de ante mano.
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:Error

Publicado por Diego Romero (997 intervenciones) el 24/09/2008 09:21:35
A simple vista, el error se debe a un puntero sin definir (un "puntero loco"). Y creo que sé por qué sucede eso.

Tienes un parámetro "p" en el procedimiento CargarSec que es un puntero a una estructura que a su vez tiene un puntero. Luego copias ese puntero en "x", es decir, "p" y "x" apuntan a la misma estructura en memoria. Y luego haces que el puntero que está en la estructura apuntada por "x" sea copiada a otro puntero en otra estructura apuntada por "q". Pero ese puntero "next" en "x" ¿apunta a una dirección válida?. Creo que no.

Me parece que el problema está precisamente en "p", supongo que bajo ciertas condiciones "p" está apuntando a cualquier cosa, es decir, no está inicializado.
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