Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-04-2020
compuin compuin is offline
Miembro
 
Registrado: oct 2010
Posts: 210
Poder: 14
compuin Va por buen camino
Devolver 3 valores con la misma funcion

Hola foro,

Tengo una funcion que me calcula desde 3 matrices diferentes y necesito devolver el valor de cada matriz dentro de la misma funcion.

Lo estoy haciendo de esta manera pero solo puedo devolver 1

Código Delphi [-]
function LBR_For_Venus(At_JDE:extended):extended;
var
  L, B, R, T : Extended;
begin
  //Compute T as Julian millennia since J2000.0
  T := (At_JDE - 2451545) / 365250;
       
  //Compute heliocentric, ecliptical Longitude L in radians
  L := Venus_L01(T) + Venus_L11(T) + Venus_L21(T) + Venus_L31(T) +
       Venus_L41(T) + Venus_L51(T);

  //Compute heliocentric, ecliptical Latitude B in radians
  B := Venus_B01(T) + Venus_B11(T) + Venus_B21(T) + Venus_B31(T) +
       Venus_B41(T) + Venus_B51(T);
       
  //Compute heliocentric distance R in AU
  R := Venus_R01(T) + Venus_R11(T) + Venus_R21(T) + Venus_R31(T) +
       Venus_R41(T) + Venus_R51(T);
  
  //Convert longitude and latitude from radians into degrees.
  L := L * 45 / Arctan(1);
  If Abs(L) >= 360 Then L := L - 360 * Int(L / 360);
  If L < 0 Then L := L + 360;
  
  B := B * 45 / Arctan(1);

  //Return the L,B,R values in a data vector string
  LBR_For_Venus := L;
  LBR_For_Venus := B;
  LBR_For_Venus := R;

end;


Solo puedo devolver 1 valor a la vez, pero requiero devolver el resultado de cada uno (L, B y R)

Gracias de antemano
Responder Con Cita
  #2  
Antiguo 24-04-2020
elrayo76 elrayo76 is offline
Miembro
 
Registrado: ene 2004
Ubicación: En la tierra, por eso mis archivos en la tierra y no en la nuebe...
Posts: 291
Poder: 21
elrayo76 Va por buen camino
Buenas,

Lo que yo aría es primero convertir la función "function LBR_For_Venus(At_JDE:extended):extended;" en un procedure. Deesta forma ya no devuelves los valores como resultados. Luego puedes hacer algo como lo siguiente para devolver los tres valores.

Código Delphi [-]
procedure LBR_For_Venus(At_JDE:extended; out L: extended; out B: extended; out R: extended);
begin
  .....

end;

Con lo anterior luego declaras las 3 variables que resiviran los datos del procedure se la pasas en los parámetros y las mismas tendrán los valores que necesitas.

Por otro lado en lugar de que el resultado sea un Extended puedes hacer que sea un record con los 3 valores.

Fijate cual te conviene mas para lo que necesitas.

Saludos,
El Rayo
__________________
Si tienes una función o procedimiento con diez parámetros, probablemente hayas olvidado uno
Responder Con Cita
  #3  
Antiguo 24-04-2020
compuin compuin is offline
Miembro
 
Registrado: oct 2010
Posts: 210
Poder: 14
compuin Va por buen camino
Gracias,

Voy a probar lo que me dices
Responder Con Cita
  #4  
Antiguo 24-04-2020
compuin compuin is offline
Miembro
 
Registrado: oct 2010
Posts: 210
Poder: 14
compuin Va por buen camino
Me da estos mensajes de errores cuando lo paso como una procedure



Código Delphi [-]
[Error] ConstVenus.pas(65): There is no overloaded version of 'LBR_For_Venus' that can be called with these arguments

[Error] ConstVenus.pas(38): Previous declaration of 'LBR_For_Venus' was not marked with the 'overload' directive
Responder Con Cita
  #5  
Antiguo 24-04-2020
elrayo76 elrayo76 is offline
Miembro
 
Registrado: ene 2004
Ubicación: En la tierra, por eso mis archivos en la tierra y no en la nuebe...
Posts: 291
Poder: 21
elrayo76 Va por buen camino
Buenas,

Fijate que los errores que te da es porque existe otro procedure/function con el mismo nombre. Para que puedas tener mas de uno con el mismo nombre pero diferentes parametros tienes que marcar a todos como "overload".

Esta directiva se agrega detras de todo cuando declaras la function/procedure. En este enlace tienes un ejemplo de como se usa http://www.delphibasics.co.uk/RTL.asp?Name=Overload. No importa el ambito de la misma, es decir si una es privada y la otra pública o si las dos son públicas, solo el nombre.

Cualquier cosa avisas.

Saludos,
El Rayo
__________________
Si tienes una función o procedimiento con diez parámetros, probablemente hayas olvidado uno
Responder Con Cita
  #6  
Antiguo 25-04-2020
compuin compuin is offline
Miembro
 
Registrado: oct 2010
Posts: 210
Poder: 14
compuin Va por buen camino
Ahora me arroja esto

Código Delphi [-]
[Error] ConstSaturn.pas(8): Unsatisfied forward or external declaration: 'LBR_For_Venus'
Responder Con Cita
  #7  
Antiguo 25-04-2020
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.913
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
La mejor manera, mas clara e idiomática: Usas records (que son mas livianos que clases).

http://www.delphibasics.co.uk/Article.asp?Name=Records

Las funciones con params out siempre me han parecido "raras". En cambios el uso de records hace el código mucho más claro y comprensible.
__________________
El malabarista.
Responder Con Cita
  #8  
Antiguo 25-04-2020
elrayo76 elrayo76 is offline
Miembro
 
Registrado: ene 2004
Ubicación: En la tierra, por eso mis archivos en la tierra y no en la nuebe...
Posts: 291
Poder: 21
elrayo76 Va por buen camino
Cita:
Empezado por mamcx Ver Mensaje
Las funciones con params out siempre me han parecido "raras". En cambios el uso de records hace el código mucho más claro y comprensible.

Si te parecen raras como haces para devolver un objeto. No digo que no se pueda devolver como resultado de una función, pero en este foro y en otros e leído muchas veces que dicen que es aconsejable devolver los objetos como un parámetro de la fuunción y no como resultado. El tema es que a mi modo de ver como resultado lo inicializas dentro de la clase, pero no lo puedes liberar.


Saludos,
El Rayo
__________________
Si tienes una función o procedimiento con diez parámetros, probablemente hayas olvidado uno
Responder Con Cita
  #9  
Antiguo 25-04-2020
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.913
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
En el caso de Delphi y otros lenguajes, el uso de "out" es un vestigio requerido por el defecto de no poder crear "resultados multiples" sin recurrir a crear directamente records/clases. Así que estando en Delphi, entiendo el porque se usan, pero es como el "tio diferente" en el resto de la sintaxis de funciones y su uso.

P.D: He usado mas de 12 lenguajes de forma profesional y solo uso "out" params cuando me lo obliga un API externo, pero no recuerdo haberlo hecho por mi propia mano. En gran medida, el uso de records (y sus equivalentes) en otros lenguajes, me ha parecido mas simple. Pero es una de esas cosas que son de estilo...
__________________
El malabarista.
Responder Con Cita
  #10  
Antiguo 26-04-2020
compuin compuin is offline
Miembro
 
Registrado: oct 2010
Posts: 210
Poder: 14
compuin Va por buen camino
Cita:
Empezado por elrayo76 Ver Mensaje
Buenas,

Lo que yo aría es primero convertir la función "function LBR_For_Venus(At_JDE:extended):extended;" en un procedure. Deesta forma ya no devuelves los valores como resultados. Luego puedes hacer algo como lo siguiente para devolver los tres valores.

Código Delphi [-]
procedure LBR_For_Venus(At_JDE:extended; out L: extended; out B: extended; out R: extended);
begin
  .....

end;

Con lo anterior luego declaras las 3 variables que resiviran los datos del procedure se la pasas en los parámetros y las mismas tendrán los valores que necesitas.

Por otro lado en lugar de que el resultado sea un Extended puedes hacer que sea un record con los 3 valores.

Fijate cual te conviene mas para lo que necesitas.

Saludos,
El Rayo
Hola, como puedo hacer el record con 3 valores??
Responder Con Cita
  #11  
Antiguo 27-04-2020
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.293
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por compuin Ver Mensaje
Hola, como puedo hacer el record con 3 valores??

Primero defines cómo quieres el record:
http://docwiki.embarcadero.com/RADSt...traditional.29

Código Delphi [-]
type
  MyRecord = record
    elem1: extended;
    elem2: string;
    elem3: boolean

  end;


Y luego lo usas en tu funtion/procedure:
http://docwiki.embarcadero.com/RADStudio/Rio/en/Parameters_(Delphi)#Out_Parameters


Código Delphi [-]
  procedure MyProcedure(var rec:MyRecord);
  begin
    ...
    rec.elem1 := ...
    rec.elem2 := ...
    ....
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
Respuesta



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
Devolver valores en SP GustavoCruz MS SQL Server 2 08-01-2013 03:10:52
Devolver varios valores en una función c++ LuisMiguel C++ Builder 4 23-09-2012 04:23:47
devolver valores al form que lo llamo djanp Conexión con bases de datos 9 20-12-2007 13:36:12
función date para devolver Nº dia de la semana lucasarts_18 PHP 2 27-03-2007 14:27:03
problema para devolver 2 valores en una funcion tiagor64 OOP 4 06-05-2005 15:38:59


La franja horaria es GMT +2. Ahora son las 22:34:02.


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