Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Devolver 3 valores con la misma funcion (https://www.clubdelphi.com/foros/showthread.php?t=94606)

compuin 24-04-2020 21:12:56

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

elrayo76 24-04-2020 21:27:28

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

compuin 24-04-2020 21:30:34

Gracias,

Voy a probar lo que me dices

compuin 24-04-2020 22:19:44

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

elrayo76 24-04-2020 22:32:03

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

compuin 25-04-2020 01:20:57

Ahora me arroja esto

Código Delphi [-]
[Error] ConstSaturn.pas(8): Unsatisfied forward or external declaration: 'LBR_For_Venus'

mamcx 25-04-2020 02:16:32

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.

elrayo76 25-04-2020 02:31:23

Cita:

Empezado por mamcx (Mensaje 536858)
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

mamcx 25-04-2020 04:10:34

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...

compuin 26-04-2020 02:39:17

Cita:

Empezado por elrayo76 (Mensaje 536849)
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??

Neftali [Germán.Estévez] 27-04-2020 08:47:34

Cita:

Empezado por compuin (Mensaje 536871)
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 := ...
    ....


La franja horaria es GMT +2. Ahora son las 10:40:22.

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