Punteros en pascal con array

C

Vuelvo a poner otra vez el post por dos motivos
1: lo colgue en otro foro de otra web y me han dicho que no podian verlo .
2: como el ejercicio es largo y es normal que da pereza entender y buscar el problema pongo otro sencillo que me da el mismo problema y lo cuelgo aqui.

De todos modos te pongo un ejercicio sencillo que da el mismo error al visualizar que es para mi el maldito problema.

Aqui es lo que quiero saber:

si por ejemplo introduzco el 3,4,5 al visualizar solo me sale el ultimo 5,5,5 como puedo hacer que me imprima el 3,4,5 y no el 5,5,5

program ejemplo;

{$APPTYPE CONSOLE}

uses
SysUtils;
type
tipoempresa=array[1..3]of integer;

var
x:integer;
tempre:tipoempresa;

procedure introducir(var tempre:tipoempresa);
begin
for x:=1 to 3 do
begin
new(tempre[x]);
writeln('introduce un numero');
readln(tempre[x]^);
dispose(tempre[x]);
end;
end;

procedure visualizar(var tempre:tipoempresa);
begin
for x:=1 to 3 do
begin
new(tempre[x]);
writeln(tempre[x]^);
dispose(tempre[x]);
end;
end;

begin
introducir(tempre);
visualizar(tempre);
readln;
end.

Hannibax

jajja a quie estudias la tecnica de gestion en la carlosIII ???? te ha delatado el tipoEmpresa ejjeej

Es la practica de estructura de datos no???

Exactamente que no te funciona???

C

que perra eres xD, si es la practica de carlos3, simplemente quiero como este ejemplo hacer que imprima toda la lista almacenado de array, cuando kiero sacar la lista por pantalla me saca lo ultimo que tengo almacenado.

si meto en ese array el 3,4,5 y lo imprmo solo me sacan el 5,5,5 eso es lo que no se por que me sacan siempre el ultimo numero, igual me pasa en la practica. Me saca los datos del cliente del ultimo introducido.

C

bueno, en ese ejercicio ya encontre la respuesta, pero en la practica demomento no me va de ese modo snif.

Hannibax

Lo que tienes que hacer es un for que te recorra todo el array desde la posicion 1 hasta la ultima y dentro un if que compruebe que esas posiciones no son iguales a NIL, si nos lo son, llamas al procedimiento de imprimir un Cliente, si son iguales a NIL... no imprimes nada.

Si tienes el array ordenado puedes hacer lo mismo pero pones un while que tenga como condicion de terminacion que encuentre una pisicion NIL, pero es importante que este ordenador de tal forma que todas las posiciones nulas esten al final.

En que grupo estas??? entregas el 30 o antes???

C

lo entrego el dia 28 creo q soy el grupo 11.

NoSHeL

Yo creo q no sabes para q son new y dispose :P

Cuando haces un new a un puntero reservas memoria (en este caso para un integer), y con dispose la liberas. En el procedimiento introducir haces un new por cada elemento del array, lo cual esta bien, pero a su vez en el mismo bucle estas haciendo un dispose, asi que todo lo que asignas en el array te lo estas cargando. En definitiva q no estas haciendo nada :P

Y luego en el de visualizar haces otra vez new, y te cargas lo que pudiera tener el puntero.

Asi sin probarlo y a bote pronto, yo quitaria el dispose de Introducir y el new de visualizar.

Pruebalo y nos cuentas ;)

C

#7 si me di cuenta ya del error y de como funciona, gracias por la ayuda,pero estoy en las mismas, ya que me da otro error si hago esto que es el orden que me pide en la practica .

Aqui señalo las diferencias

program ejemplo;

uses
SysUtils;
type
tipoempresa=array[1..3]of integer;

var
x:integer;
tempre,tempre1:tipoempresa;

procedure introducir(var tempre:tipoempresa);
begin
for x:=1 to 3 do
begin
new(tempre[x]);
writeln('introduce un numero');
readln(tempre[x]^);

end;

end;

procedure visualizar(var tempre:tipoempresa);
begin
for x:=1 to 3 do
begin

writeln(tempre[x]^);
dispose(tempre[x]);

end;
end;
{$APPTYPE CONSOLE}
begin

introducir(tempre);
introducir(tempre1); <---- {Ya que en el programa principal me pide otra vez esto}
visualizar(tempre);
readln;
end.

Como tu bien as dicho antes, me va bien al kitar el dispose en la funcion introducir y el new en visualizar,
pero claro en la practica me pone otra vez la funcion introducir "introducir(tempre1) y al imprimir pues se me peta el programa.

NoSHeL

Esta ultima version la ejecuto y no me da problemas. Creas 2 arrays de punteros. En el primero metes 3 numeros, y en el segundo otros 3 numeros. Y luego muestras el primer array.

¿Que se supone q tiene q hace exactamente?

Yo ejecuto, meto 1 2 3, y 4 5 6. Y me muestra 1 2 3.

C

#9 dios mio... se me va la pinza xD, cierto, me pongo a fijar con la practica,
mira te pongo el link de la practica que tengo hecho:

http://www.megaupload.com/es/?d=35ELX85V

el problema al visualizar , que solo me sale el de cliente2 y no el de cliente1.

NoSHeL

jejeje

te pasa lo mismo que el ejemplo q pusiste aqui:

procedure anyadirCliente(var cli:tipocliente;tempresa:tipoempresa);
begin
new(tempresa[x]);
tempresa[x]:=cli;
dispose(tempresa[x]); <---- Sobra
x:=x+1;
end;

procedure mostrarclientes(var tempresa:tipoempresa);
begin
writeln('Ver lista de clientes');
x:=1;
while x<= 2 do
begin
new(tempresa[x]); <---- Sobra
with tempresa[x]^ do
begin
writeln(nombre);
writeln(apellido);
writeln(direccion);
writeln(nif);
writeln(telefono);
writeln(fecha_nacimiento.dia);
writeln(fecha_nacimiento.mes);
writeln(fecha_nacimiento.anio);
end;
dispose(tempresa[x]);
x:=x+1;
end;
readln;
end;

:D

C

ok, ya esta solucionado gracias :).

Pero al imprimir me sigue saliendo solo los datos del ultimo cliente xD.

NoSHeL

Ahora que acabo de ver el enunciado, veo cual es el programa principal:

PROGRAM Practica3;

{$APPTYPE CONSOLE}

USES

SysUtils,Empresa, Cliente;

VAR

miEmpresa: TipoEmpresa;
cliente1,cliente2: tipoCliente;

BEGIN

inicializarEmpresa(miEmpresa);
leerDatosCliente(cliente1);
anyadirCliente(cliente1,miEmpresa);
leerDatosCliente(cliente2);
anyadirCliente(cliente2,miEmpresa);
mostrarClientes(miEmpresa);
borrarCliente(miEmpresa,'88891451H');
mostrarClientes(miEmpresa);
readln;

END.

Me he dado cuenta que el dispose de mostrarclientes sobra tb. Sino cada vez que hagas un mostrarclientes borras todos los clientes. Entonces la proxima vez que vayas a hacer un mostrar clientes no te mostrara nada...

Esto es lo que haces:

1º Muestras un writeln sobre inicializar empresa
2º Guardas en cliente1 la info. de un cliente
3º Agregas cliente1 al array de clientes.
4º Guardas en cliente2 info. de otro cliente
5º Agregas cliente2 al array de clientes
6º Muestras los clientes, y a su vez haces un dispose de cada uno, con lo cual dejas el array vacio.
7º Borras el cliente 88891451H, aunq este procedimiento lo tinees vacio.
8º Vuelves a mostrar el array, pero como antes hiciste dispose, no te mostrara nada, o te dara error...

Quita el dispose del mostrarclientes, y me dices si sigue solo mostrandosete el ultimo. entonces lo unico q se me ocurre es que haya algun problema con la variable X. avisame y si eso le echo otro ojo

Saludos!

C

ok muchas gracias :) lo pruevo mañana aver que tal

C

Ya esta solucionado y hecho el ejercicio :D
era lo que tu dijistes pero fallaba en una cosa tb que encontre que era en " procedure anyadirCliente(var cli:tipocliente;tempresa:tipoempresa);"

Habia que poner "procedure anyadirCliente(var cli:tipocliente;VAR tempresa:tipoempresa);"

el maldito var no me deja visualizar la lista de clientes.

Gracias por la ayuda.

Usuarios habituales