PDA

Ver la versión completa : Punteros Modula-2



Cypress
08-04-2007, 20:45
Todavia no logro entender mucho punteros.. entiendo el concepto.. pero no lo se pasar a la maquina. Hice un código que supuestamente hace esto:
Te pregunta una cantidad de veces que que queres ingresar X números, luego de ingresar estos X números te los muestra.
Este codigo puede que este muy mal. Estoy haciendo esto medio a ciegas.



MODULE eqf;
FROM InOut IMPORT ReadCard,WriteCard, WriteString,WriteLn;
TYPE Cardlista = POINTER TO Nodo;
Nodo = RECORD
elemen:CARDINAL;
Resto:Cardlista;
END;
VAR
l:Cardlista;
a,i:CARDINAL;

BEGIN
l:=NIL;
WriteString ("Ingrese un número");
WriteLn;
ReadCard(a);
WriteLn;
FOR i:=1 TO a DO
NEW(l); (* aca me da error el compilador.. no tengo muy claro lo que hace el comando NEW, creo que agrega un espacio al puntero *)

ReadCard (l^.elemen);
l^.Resto:=NIL;
END;

FOR i:= 1 TO a DO
WriteCard (l^.elemen);
END;
END eqf.


Pues bien.. ^^ ahí esta el código.. voy a seguir intentando.. pero por ahora no sale nada :(

Saludos,
Cypress

smaug_
08-04-2007, 21:57
Veras, tal como me aparece en el libro de Modula-2:
NEW(punter)
Este procedimiento crea una variable dinámica del tipo al que hace referencia el puntero, asigna como valor del puntero la referencia a la variable recien creada.

Como buen libro de la uned no queda muy claro, te intento explicar un poco mejor. el procedimiento NEW(l) reserva espacio en memoria para una variable del tipo de l Si en cada pasada llamas a NEW, lo que haces es destruir el valor de esa variable, para asignarle uno nuevo. Bueno no es realmente destruir, sino que haces que ese puntero apunte a otra zona de memoria, dejando ocupada e inutilizada la anterior. Por lo que veo estas intentando hacer una lista. En tu codigo, en ningun sitio haces que el nuevo elemento señale al siguiente de la lista.
Normalmente para las listas, suelen hacer falta tres variables, una que referencie al primer elemento de la lista, si no no podriamos recorrerla. Otro para referenciar al elemento actual y otro para referenciar al siguiente, creo que era asi.

Cypress
10-04-2007, 04:12
Aqui la solucion... me la paso alguien en el newsgroup de la facu


MODULE punteros;
FROM InOut IMPORT ReadCard,WriteCard, WriteString,WriteLn;
FROM Storage IMPORT ALLOCATE, DEALLOCATE;
TYPE Cardlista = POINTER TO Nodo;
Nodo = RECORD
elemen:CARDINAL;
Resto:Cardlista;

END;
VAR
l:Cardlista;
cant,i,leido:CARDINAL;


PROCEDURE Cons (x: INTEGER ; VAR L: Cardlista);
(* Inserta el elemento 'x' al comienzo de la lista 'L' *)
VAR nuevo: Cardlista;

BEGIN
NEW (nuevo);
nuevo^.elemen:= x;
nuevo^.Resto:= NIL;


IF ( L = NIL) THEN
L := nuevo;
ELSE
nuevo^.Resto := L;
L := nuevo;
END;
END Cons;








(************************************************* ***)
PROCEDURE ImprimirLista (L: Cardlista);
(* Imprime los elementos de la lista 'L'; en caso de que la lista sea
vacia imprime 'NIL' *)

BEGIN
IF (L = NIL) THEN (* si la lista es vacia *)
WriteString ("NIL");
ELSE (* imprimo los elementos *)
(* muestro el primer elemento, porque se que no es vacia *)
WriteCard (L^.elemen,0);
L := L^.Resto;
WHILE ( L <> NIL) DO
WriteCard (L^.elemen, 0);
L := L^.Resto;
END;

END;



(* Notar que recorro la lista con el mismo puntero 'L', ya que
este es pasado 'por copia' *)
END ImprimirLista;
(************************************************* ***)

(************************************************* ***)
PROCEDURE DestruirLista (L: Cardlista);
(* Destruye la memoria asignada a la lista 'L'*)
VAR eliminar : Cardlista;
(* variable auxiliar para recorrer la lista y eliminar la celda *)

BEGIN
WHILE ( L # NIL) DO
eliminar := L;
L := L^.Resto;
DISPOSE (eliminar);
END;
END DestruirLista;
(************************************************* ***)

(*Programa Principal*)
BEGIN
l:=NIL; (* inicializo variable *)
WriteString ("Ingrese un n&#250;mero"); WriteLn;
ReadCard(cant);
WriteLn;
FOR i:=1 TO cant DO
ReadCard (leido);
Cons (leido,l);
END;




ImprimirLista (l);

(* Una vez que no se va a usar mas la lista, hay que devolver la memoria
*)
DestruirLista (l);

END punteros.