Pascal/Turbo Pascal - Funcion retorna nil cuando hay datos validos

 
Vista:

Funcion retorna nil cuando hay datos validos

Publicado por DanielG (4 intervenciones) el 31/07/2021 01:12:56
Hola que tal como estan?

Tengo la siguiente funcion

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function autenticar(var clientes: arbClientes; nombreUsuario: string): arbClientes;
 
begin
     if(clientes <> nil) then begin
              if(nombreUsuario = clientes^.nombreUsuario) then
                       autenticar:= clientes
              else begin
                if(clientes^.nombreUsuario > nombreUsuario) then
                         autenticar(clientes^.ant, nombreUsuario)
                else
                    autenticar(clientes^.sig, nombreUsuario)
              end;
     end
     else
         autenticar:= nil;
end;

el problema es que me devuelve nil cuando hay datos validos, incluso debugeando entra al if cuando son iguales los nombres y retorna el valor pero al terminar la recursión vuelve con nil, aunque en ningun momento debugeando entra en la rama del else ya que los datos q paso como parámetro son validos.

Aca checheo que me devuelve nil

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
procedure iniciarSesion(var productos: listaProductos; var clientes: arbClientes);
 
var
  password, nombreUsuario: string;
  usuario: arbClientes;
begin
  writeln;
  write('Introduce tu nombre de usuario: ');
  readln(nombreUsuario);
  write('Introduce tu password: ');
  readln(password);
  usuario := nil;
  usuario := autenticar(clientes, nombreUsuario);
  if(usuario = nil) then
       writeln('Error: email o password incorrectos') //Imprime estooo
  else
      menuPrincipal(productos, clientes, usuario);
end;

Cualquier sugerencia es bienvenida

Gracias de antemano
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

Funcion retorna nil cuando hay datos validos

Publicado por ramon (2158 intervenciones) el 01/08/2021 11:52:03
necesito mas datos como variables tipes y constantes para poder darte una ayuda valida
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

Funcion retorna nil cuando hay datos validos

Publicado por DanielG (4 intervenciones) el 02/08/2021 00:26:37
Estos son los types

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
type
 
    //Productos
    listaProductos = ^regProducto;
    regProducto = record
      nombre: string;
      codigoBarra: integer;
      precio: integer;
      sig: listaProductos;
    end;
 
    //Compras
    listaCompras = ^regCompra;
    regCompra = record
      producto: regProducto;
      fecha: string;
      dniCliente: integer;
      sig: listaCompras;
    end;
 
    //Clientes
    arbClientes = ^regCliente;
    regCliente = record
      nombre:string;
      nombreUsuario: string;
      apellido:string;
      domicilio:string;
      dni: integer;
      email: string;
      password: string;
      nivel: 0..1;
      compras: listaCompras;
      sig: arbClientes;
      ant: arbClientes;
    end;


Estas son las variables
1
2
3
var
  productos: listaProductos;   //Todo los productos
  clientes, admin: arbClientes;

Asi cargo los datos en el arbol

1
2
3
4
5
6
7
8
9
10
11
12
13
procedure agregarCliente(var clientes: arbClientes; var agregar:arbClientes);       //Agrega un cliente al arbol ordenado por nombre de usuario
 
begin
     if clientes = nil  then begin
          clientes := agregar;
     end
     else begin
       if(clientes^.nombreUsuario < agregar^.nombreUsuario) then
                agregarCliente(clientes^.sig, agregar)
       else
           agregarCliente(clientes^.ant, agregar);
     end;
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

Funcion retorna nil cuando hay datos validos

Publicado por ramon (2158 intervenciones) el 02/08/2021 16:57:20
Mira compara esto;


function autenticar(var clientes: arbClientes; nombreUsuario: string): arbClientes;

begin
if(clientes <> nil) then
begin
if(nombreUsuario = clientes^.nombreUsuario) then
autenticar := clientes
else
begin
if (clientes^.nombreUsuario > nombreUsuario) then
autenticar := clientes^.ant
else
autenticar := clientes^.sig;
end;
end
else
autenticar:= nil;
end;
--------------------------------------------------------------------------------------------------------------------------------------

function autenticar(var clientes: arbClientes; nombreUsuario: string): arbClientes;

begin
if(clientes <> nil) then begin
if(nombreUsuario = clientes^.nombreUsuario) then
autenticar:= clientes
else begin
if(clientes^.nombreUsuario > nombreUsuario) then
autenticar(clientes^.ant, nombreUsuario)
else
autenticar(clientes^.sig, nombreUsuario)
end;
end
else
autenticar:= nil;
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

Funcion retorna nil cuando hay datos validos

Publicado por DanielG (4 intervenciones) el 02/08/2021 20:39:09
En el primer código, si no encuentra el dato en el primer nodo del árbol. no buscaría mas puesto que no avanza en la recursión y el segundo es igual al que tenia antes y no funcionaba.
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

Funcion retorna nil cuando hay datos validos

Publicado por ramon (2158 intervenciones) el 03/08/2021 14:47:22
Te deje losdoa pera que vieras las diferencias en los cambios.
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

Funcion retorna nil cuando hay datos validos

Publicado por DanielG (4 intervenciones) el 03/08/2021 22:03:34
Probé mi algoritmo original en otro compilador porque para mi estaba bien y funciona bien, no se porque en Lazarus me da error es muy raro.
Y las diferencias te las comente en mi anterior respuesta según lo que creo que hace el algoritmo.
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