Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 03-05-2007
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
problema con funciones

hola de nuevo, tengo un medio problema con las funciones (al final voy usando casi todo el armamento de delphi, pero poco a poco)

Cree una funcion

Código Delphi [-]
function tfhabitacion.verificaanadircliente(Key:word):word;


se supone que le entra el valor key y me devuelve un valor word, en si mismo es el mismo key.
El programa me funciona pero me da un aviso:
[Warning] habitacion.pas(200): W1035 Return value of function 'Tfhabitacion.verificaanadircliente' might be undefined

pero no se como resolverlo.
gracias

O mejor me explico lo que necesitaba por si se os ocurre como resolverlo.

tengo esta procedure
procedure Tfhabitacion.anadirnomKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);

ahi recoge el key, pero dentro de esa procedure he realizado otra llamada a otra procedure, pero ya no me conserva el valor key (estoy partiendo el programa en procedures tal y como recomendabais) y para eso he creado la funcion anterior, para conservar el valor del key, imagino que el aviso me sale porque en esa funcion no hay asignacion del valor key, es asi?.

Última edición por anubis fecha: 03-05-2007 a las 19:05:57.
Responder Con Cita
  #2  
Antiguo 03-05-2007
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.556
Poder: 25
egostar Va camino a la fama
Ya la declaraste en el Type de TFHabitacion??

algo asi

Código Delphi [-]
type
  TFHabitacion = class(TForm)
    BitBtn1: TBitBtn;
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private declarations }
    function verificaanadircliente(Key:word):word;
  public
    { Public declarations }
  end;


Salud OS.
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #3  
Antiguo 03-05-2007
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 29
jhonny Va camino a la famajhonny Va camino a la fama
No has definido el valor resultante de la función, colocare un ejemplo muy sencillo de lo que puedes hacer:
1:
Código Delphi [-]
 
function tfhabitacion.verificaanadircliente(Key:word):word;
begin
  //...
  //...
  Result := key;
end;

o

2:
Código Delphi [-]
 
function tfhabitacion.verificaanadircliente(Key:word):word;
begin
  //...
  //...
  verificaanadircliente := key;
end;

Espero te sirva .
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #4  
Antiguo 03-05-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
[Warning] habitacion.pas(200): W1035 Return value of function 'Tfhabitacion.verificaanadircliente' might be undefined
Lo que esto indica es que tu función no está regresando un valor, no al menos en todos los casos, de manera que usar la función es riesgoso. Debes revisar el código y asegurarte que siempre hay un valor de regreso.

Por ejemplo,

Código Delphi [-]
function divide(a, b: Integer): Integer;
begin
  if b <> 0 then
    Result := a div b;
end;

te generará esa advertencia, porque la función no regresa nada cuando b = 0.

// Saludos
Responder Con Cita
  #5  
Antiguo 03-05-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Una costumbre que tengo al crear funciones es asignarle un resultado por defecto en la primera linea, así me aseguro de que la función no devuelve nada inesperado. Es algo personal, pero me atrevo a recomendarlo:

Siguiendo el ejemplo de roman:
Código Delphi [-]
function divide(a, b: Integer): Integer;
begin
  // Así nos aseguramos de devolver siempre un resultado
  Result:= 0;
  if b <> 0 then
    Result := a div b;
end;
Responder Con Cita
  #6  
Antiguo 03-05-2007
Avatar de anubis
anubis anubis is offline
Miembro
 
Registrado: mar 2007
Posts: 863
Poder: 18
anubis Va por buen camino
gracias, asi si funciona, son cositas que van saliendo.
Responder Con Cita
  #7  
Antiguo 03-05-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por seoane
Una costumbre que tengo al crear funciones es asignarle un resultado por defecto en la primera linea, así me aseguro de que la función no devuelve nada inesperado. Es algo personal, pero me atrevo a recomendarlo:
No está mal. El problema es que así te expones a otro warning:

Cita:
Value assigned to 'divide' never used
si, por ejemplo, haces:

Código Delphi [-]
function divide(a, b: Integer): Integer;
begin
  Result := 0;

  if b <> 0 then
    Result := a div b
  else
    raise Exception.Create('Regrese a la primaria');
end;



Aunque menos "dañino", no me gusta que aparezca ninguna advertencia.

// Saludos
Responder Con Cita
  #8  
Antiguo 03-05-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Bueno roman, yo empiezo poniendo esa linea, luego si la cosa se tuerce se quita y en paz
Responder Con Cita
  #9  
Antiguo 04-05-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Yo suelo hacer lo que hace Seoane, ciertamente. La primera línea es una instrucción: "Result := false" o "Result := true", según si se supone que la función ha de retornar "false" o "true" por defecto. Sin embargo, últimamente, programando en PHP, las cosas cambian amigos.

¿Cómo? Pues porque en PHP no vale algo como "return false" al principio de la línea, puesto que el "return" impedirá que se ejecute lo que venga después, es decir, que no es lo mismo que el "result" de Delphi. Lo siento.

Ahora, aún así sigo utilizando a veces algo como:

Código PHP:
function LoqueSea(){
  
$resultado false;
  
/* */
  
return $resultado;

Que es como copiar lo que hago en Delphi: asegurarme de que la función tiene un resultado por defecto. Sin embargo, es verdad que a veces ocurre lo que menciona Román, y bueno, que, últimamente también estoy tirando por el lado de no tener un resultado por defecto, aunque, eso sí, asegurándome de que lo que la función X retorna tiene sentido en cualquier caso. ¡O eso intentamos!
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #10  
Antiguo 04-05-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Hola,

A decir verdad me extraña un poco este tipo de técnicas, o la necesidad de ellas. Parece que damos un valor por defecto para "cubrirnos las espaldas" ante algún posible caso no considerado. Pero el valor por defecto no arreglará tal omisión- de haberla -, de tal suerte que el problema seguirá latente. En el caso de Delphi, al menos, prefiero que el compilador me notifique que hay un problema, a ocultar el mensaje con un valor por defecto.

// Saludos
Responder Con Cita
  #11  
Antiguo 04-05-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Bueno. Tú eres mucho más experto que yo, Román, empero, yo no trato de ocultar ningún problema o mensaje de error... sino que, simplemente, asigno un valor de retorno por defecto para una función: nada más y nada menos.

Cuando escribo una función, digamos, "EsUsuarioAdministrador()", a veces (así lo he hecho más a menudo en Delphi que en PHP, eso sí), nada más comenzar la función, escribo un "Result := False", por ejemplo. Es una forma de decir "ningún usuario será considerado administrador a no ser que se cumplan X condiciones... en un primer momento ningún usuario es considerado administrador".

No sé. Tal vez incluso sea una forma de hacer más legible la función, no sé si me explico. Pero, ya digo, la intención no es esconder errores, ni ocultarlos, ni nada de eso.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #12  
Antiguo 04-05-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por dec
Bueno. Tú eres mucho más experto que yo, Román, empero, yo no trato de ocultar ningún problema o mensaje de error... sino que, simplemente, asigno un valor de retorno por defecto para una función: nada más y nada menos.
No me di a entender. No digo que hagan eso con la intención de ocultar el error. Digo que al dar un valor por defecto, corro el riesgo de no darme cuenta de que hay un error, porque el compilador no me lo marca.

// Saludos
Responder Con Cita
  #13  
Antiguo 04-05-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por dec
Cuando escribo una función, digamos, "EsUsuarioAdministrador()", a veces (así lo he hecho más a menudo en Delphi que en PHP, eso sí), nada más comenzar la función, escribo un "Result := False", por ejemplo. Es una forma de decir "ningún usuario será considerado administrador a no ser que se cumplan X condiciones... en un primer momento ningún usuario es considerado administrador".
Lo que describes es un caso muy particular, donde la propia semántica de la función requiere un valor por defecto, pero que yo ponga:

Código Delphi [-]
function esNumeroPrimo(n: Integer): Boolean;
begin
  Result := false;
  
  {
    algoritmo para determinar si n es primo
  }
end;

no me sirve, porque si mi algoritmo no cubre todos los casos, el valor por defecto tendrá igual de posibilidades de ser adecuado que inadecuado.

// Saludos
Responder Con Cita
  #14  
Antiguo 04-05-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Cita:
Empezado por roman
No me dí a entender. No digo que hagan eso con la intención de ocultar el error. Digo que al dar un valor por defecto, corro el riesgo de no darme cuenta de que hay un error, porque el compilador no me lo marca.
Exacto, cuando yo doy un valor por defecto, normalmente es un valor que a mi me indica un error, es decir, si la función me devuelve ese valor se que ha ocurrido algo. Por ejemplo, si la función me tiene que devolver el tamaño de un archivo y le pongo de valor por defecto -1, se que si devuelve ese valor a ocurrido un fallo.

Lo dicho, son manías que uno tiene, pero que no tengo problemas en cambiar si la función lo requiere
Responder Con Cita
  #15  
Antiguo 04-05-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Creo que todos estamos más o menos de acuerdo. Es cierto que no en todos los casos un valor de retorno por defecto puede no ser del todo "intuitivo"... yo creo que me limito a preparar un valor de retorno por defecto cuando por el contrario es intuitivo... ya digo, creo que me sirve para "leer" mejor la función... pero, ya digo que esto es algo que surje de un modo más o menos natural... no es forzado.

De hecho alguna vez se me ocurrió que todas las funciones tuvieran un valor de retorno por defecto: todas, todas las funciones. Y esto no funcionó. Es decir, que no programo de esa manera, sino que a veces lo hago así, y otras veces no. Tengo cierta confianza en que sé elegir qué función es menester de un valor de retorno por defecto y cuál no.

PD. Y no tengo abuela.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #16  
Antiguo 04-05-2007
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.556
Poder: 25
egostar Va camino a la fama
Yo creo que no es necesario inicializar el valor de retorno, la regla es que no haya ningún "vacio" en el retorno de la función.

Código Delphi [-]
function TForm1.algo(dato:String):Bool;
begin
  If dato = 'e32er433432e' then
     Result := True
  else Result := False; // Else
end;

Código Delphi [-]
function TForm1.algo(dato:word):integer;
begin
  case dato of
     0 : Result := 1;
     1 : Result := 0;
     else Result := -1; // Else
  end;
end;

De esta manera no hay ningún "vacio" para el retorno de la función de cualquier tipo.

Salud OS.
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #17  
Antiguo 04-05-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Estamos de acuerdo egostar. Pero también puede verse como distintas formas de codificación... porque una cosa es lo mismo que la otra al fin y al cabo:

Código Delphi [-]
function TForm1.algo(dato:word):integer;
begin
  case dato of
     0 : Result := 1;
     1 : Result := 0;
     else Result := -1; // Else
  end;
end;

Código Delphi [-]
function TForm1.algo(dato:word):integer;
begin
  Result := -1;
  case dato of
     0 : Result := 1;
     1 : Result := 0;
  end;
end;

Ignoro si una forma es más correcta, elegante o aconsejable que la otra, pero, las dos formas son posibles y al cabo se consigue lo mismo... Así que es cuestión de la costumbre de uno, o de si se han establecido ciertas normas al respecto,... qué sé yo.

Yo no abogo ni por una forma ni por otra. Creo que esto significa que es cuestión de gustos... en este caso creo que no me equivoco si digo esto, vamos.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #18  
Antiguo 04-05-2007
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.556
Poder: 25
egostar Va camino a la fama
Pues si, estoy de acuerdo amigo David, todo depende del estilo de programar de cada uno y por supuesto que es válido, lo que no creo que sea bueno es dejar esos "huecos" en tu código.

Salud OS.
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #19  
Antiguo 04-05-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Bueno. Como ha recordado antes Román el propio compilador se encargará de advertirte de que hay un "hueco" en tu código que puede ser contraproducente. O sea, que llevas razón, que no tiene que ser muy recomendable ir dejando huecos por ahí...
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #20  
Antiguo 04-05-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
A mi me gustaría puntualizara algo.

Una cosa es que hay dos formas de poner un valor por defecto, como el caso del else y la asignación inicial; y otra cosa es usar como técnica para crear una función, el asignar un valor por defecto de incio y partir de ahí.

En el primer caso, ya conocemos bien la función y simplemente estamos escogiendo una u otra forma de programar, y eso es cuestión meramente de gustos.

En el segundo caso, podemos proceder como seoane, dando de antemano un valor erróneo. Nótese la diferencia sustancial: un valor erróneo, que no por defecto. Ese valor es el que le va a cuidar las espaldas.

Pero en otro caso, corremos el peligro de no advertir el error y es donde no me acomodaría esa técnica.

Ahora, en el caso de PHP, que no detecta ese tipo de cosas, quizá sea muy recomendable entonces la técnica de seoane, porque al no haber un compilador que nos eche la mano, ese valor erróneo nos ayudará.

De cualquier forma, es más- en mi opinión -una técnica para cuando estamos apenas probando o diseñando la función, que para el código final

// Saludos
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
problema con funciones delphi xelip Varios 10 29-03-2007 05:21:51
Problema con funciones de Delphi7 xelip Varios 3 19-03-2007 02:39:38
Dll y funciones mar646 API de Windows 2 27-04-2005 16:45:40
Funciones de SQL DarkSide SQL 6 24-01-2005 16:00:02
Funciones Ras mauro Varios 0 17-07-2003 03:36:28


La franja horaria es GMT +2. Ahora son las 11:26:24.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi