Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Una serie de dudas con unos procedures y functions elementales (https://www.clubdelphi.com/foros/showthread.php?t=66694)

ioco 08-03-2010 15:32:11

Una serie de dudas con unos procedures y functions elementales
 
Buenas, aquí vengo a traer de nuevo más problemas de novato ¬¬'

Lo que últimamente me ocupa es una unit para poder usarla en futuras aplicaciones de cálculo con números complejos.

Tengo varias dudas al respecto:
  • No entiendo porqué me dice que la expresión es ilegal ya que no veo nada fuera de lo normal a cómo siempre las he puesto ¿he olvidado poner algo?
Código Delphi [-]
                    If Z.ArgumentoRadianes>(2*Pi) then
                       Repeat
                             Z.ArgumentoRadianes-(2*Pi);
                       until (Z.ArgumentoRadianes<=(2*Pi));

He probado por si fuera cosa de paréntesis o algo y no encuentro manera :S
  • Estoy con mi primera función con "overload" y me está dando problemas ya que se trata de sacar el Ln de un número complejo, pero dentro se recurre a ella misma y lo que quiero es que llame a la Ln que todos tenemos... ¿sé que podría solucionarlo cambiando el nombre a la función y quedarme tan ancho, pero me gustaría aprender si hay alguna otra manera :
Código Delphi [-]
      Function Ln(a:TComplejo):TComplejo; overload;
               Var
                  Z:TComplejo;
               Begin
                    Z.Modulo:=ln(a.Modulo); //<-Incompatible type for arg no1: Got Extended, expected TCOmplejo
                    Z.ArgumentoRadianes:=a.ArgumentoRadianes;
                    Z.ArgumentoGrados:=RadToDeg(Z.ArgumentoRadianes);
                    CalcularRectangular(Z);
                    Result:=Z;
               end;

Un saludo :)

BrunoBsso 08-03-2010 16:01:09

Buenas!
Te explico:
Código Delphi [-]
If Z.ArgumentoRadianes>(2*Pi) then
  Repeat
    Z.ArgumentoRadianes-(2*Pi);
  until (Z.ArgumentoRadianes<=(2*Pi));
Z.ArgumentoRadiantes es una variable, y como tal para asignarle un valor tenes que usar la asignaciíon :=.
Z.ArgumentoRadianes:=Z.ArgumentoRadianes-(2*Pi);


El siguiente:
Código Delphi [-]
Function Ln(a:TComplejo):TComplejo; overload;
Var
  Z:TComplejo;
Begin
  Z.Modulo:=ln(a.Modulo); //<-Incompatible type for arg no1: Got Extended, expected TCOmplejo
  Z.ArgumentoRadianes:=a.ArgumentoRadianes;
  Z.ArgumentoGrados:=RadToDeg(Z.ArgumentoRadianes);
  CalcularRectangular(Z);
  Result:=Z;
end;
Tu función acepta argumentos de tipo TComplejo, y en Z.Modulo:=ln(a.Modulo); le estás pasando la variable Modulo que es un extended. Deberías pasarle el número complejo (a).

Saludos!!!!

ioco 08-03-2010 16:26:18

Tantas veces que he mirado el código y no ví que faltaba la asignación ¬¬' es como mirar con los ojos cerrados...

Gracias por el toque ^^

Respecto a la función de Ln, lo que necesito hacer dentro de mi función Ln(de un complejo) es llamar a Ln(de un extended) que reside en la unit típica de System, pero en su lugar se llama a si misma.

Según leí para que se distinga entre una función u otra con el mismo nombre deben de tener o distinta cantidad de parámetros o que estos sean de distinto tipo. Y las funciones son las siguientes:

Código Delphi [-]
function Ln  ( Number  : Extended )  : Extended; //function Ln de la unit System
                                                             //(sacado de delphibasics.co.uk)
Function Ln(a:TComplejo;b:byte=0):TComplejo; overload; //mi function (le puse el parámetro b con valor por defecto tal 
                                                           //y como leí en delphibasics pero sigue sin funcionar :S)

Con esto he pensado que quizá el problema radique en que ambas funciones deberían de llevar la directiva overload, aunque no sé si es posible modificar la primera.

BrunoBsso 08-03-2010 16:32:53

Ahhh.
Te recomiendo que no modifiques la primera, porque es de la unit system :D mejor dejala como la hicieron.
En todo caso, modifica tu función. Nombrala LogNat o algo similar, es más simple evitar esos problemas cambiando el nombre de tu función. No le harías mal al código.
Sino, fijate si te sirve asi (de verdad, no sé si funcionará, es una idea nnomás):
Código Delphi [-]
Function Ln(a:TComplejo):TComplejo; overload;
Var
  Z:TComplejo;
Begin
  Z.Modulo:=System.Ln(a.Modulo); //<-Incompatible type for arg no1: Got Extended, expected TCOmplejo
  Z.ArgumentoRadianes:=a.ArgumentoRadianes;
  Z.ArgumentoGrados:=RadToDeg(Z.ArgumentoRadianes);
  CalcularRectangular(Z);
  Result:=Z;
end;
Por cierto, en esta Unit tuya, te acordaste de poner a System en el uses??
Saludos!

ioco 08-03-2010 17:41:41

Sí, ya probé a ver si era falta de declarar la unit y si la pongo en el uses me da el mensaje conforme está duplicada (según vi en los comentarios de delphibasics no es necesario declarar esta unit).

Evité el error temporalmente llamandola
Código Delphi [-]
Function Loge(a:TComplejo):TComplejo;

que era la única solución que se me ocurría para el error (supongo que el mantener el nombre para que a la hora de usarla de nuevo fuera mas sencillo no siempre se puede jeje)

Respecto a lo que propones de poner System.Ln(...) evita el error :eek: no sabía que se podía hacer referencia a funciones de una unit concreta como si de un form se tratara jeje

Probaré a implementarla para conservar el nombre si se puede ^^

Gracias por la ayuda! :)

BrunoBsso 08-03-2010 18:00:45

Si si, llamar a cualquier módulo de una unidad, anteponiendo el nombre de la unidad con un punto, es lo mismo que llamarla sin el nombre de la unidad.
Te tiene que andar sí o sí poniendo Sustem.ln
Me alegro haberte solucionado el problema :D
Saludos!


La franja horaria es GMT +2. Ahora son las 16:02:57.

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