Question

Utilisation Ada (GNAT): Je dois déterminer la puissance de dix pour une valeur donnée. L'approche la plus évidente est d'utiliser un logarithme; mais qui ne parvient pas à compiler.

with Ada.Numerics.Generic_Elementary_Functions;
procedure F(Value : in Float) is
      The_Log : Integer := 0;
begin
      The_Log := Integer(Log(Value, 10));
      G(Value, The_Log);
end;

Erreur:

  • utilities.adb: 495: 26: "Log" est pas visible
    • utilities.adb: 495: 26: déclaration non visible à a-ngelfu.ads:24, par exemple à la ligne 482
    • utilities.adb: 495: 26: déclaration non visible à a-ngelfu.ads:23, par exemple à la ligne 482

Alors je tente de se référer à l'ensemble, mais qui ne parvient aussi:

with Ada.Numerics.Generic_Elementary_Functions;
procedure F(Value : in Float) is
      The_Log : Integer := 0;
      package Float_Functions is new Ada.Numerics.Generic_Elementary_Functions (Float);
begin
      The_Log := Integer(Float_Functions.Log(Value, 10));
      G(Value, The_Log);
end;

Erreur:

  • utilities.adb: 495: 41: pas d'interprétation candidats correspondent aux chiffres réels:
  • utilities.adb: 495: 41: trop d'arguments en appel à "Connexion"
  • utilities.adb: 495: 53: type attendu "Standard.Float"
  • utilities.adb: 495: 53: trouvé de type entier universel ==> dans l'appel à "Connexion" à a-ngelfu.ads:24, par exemple à la ligne 482
Était-ce utile?

La solution

Je ne sais pas si vous fixe déjà ou non, mais voici la réponse.

D'abord, comme je vois que vous êtes de passage Float lors de l'instanciation la version générique vous pouvez utiliser une non générique au lieu.

Si vous décidez d'utiliser la version générique, vous devez faire la deuxième façon, vous avez fait, vous devez instancier le paquet avant d'utiliser ses fonctions.

Regarder a-ngelfu.ads vous pouvez voir le prototype réel de la fonction dont vous avez besoin (il y a une autre fonction pour le logarithme naturel avec seulement 1 paramètre):

function Log(X, Base : Float_Type'Base) return Float_Type'Base;

Vous pouvez y voir que la base doit être dans un type de flotteur aussi. Le code correct pour la version générique serait:

with Ada.Numerics.Generic_Elementary_Functions;

procedure F(Value : in Float) is
    -- Instantiate the package:
    package Float_Functions is new Ada.Numerics.Generic_Elementary_Functions (Float);
    -- The logarithm:
    The_Log : Integer := 0;
begin
    The_Log := Integer(Float_Functions.Log(Value, 10.0));
    G(Value, The_Log);
end;

L'un non-générique serait exactement le même:

with Ada.Numerics.Elementary_Functions;

procedure F(Value : in Float) is
    -- The logarithm:
    The_Log : Integer := 0;
begin
    The_Log := Integer(Ada.Numerics.Elementary_Functions.Log(Value, 10.0));
    G(Value, The_Log);
end;

Autres conseils

Xandy est juste. Sa solution a fonctionné.

Cependant étant Ada, il y avait deux exceptions à se prémunir contre ...

  • Valeur <0.0
  • Valeur = 0.0

Sans gardes cette fonction car il est fait exception à générer. Et rappelez-vous que The_Log de retour peut être <0, 0 et> 0.

with Ada.Numerics.Elementary_Functions; 

procedure F(Value : in Float) is 
    -- The logarithm: 
    The_Log : Integer := 0; 
begin 
    if Value /= 0.0 then
        The_Log := Integer(
             Ada.Numerics.Elementary_Functions.Log(abs Value, 10.0)); 
    end if;
    G(Value, The_Log); 
end; 
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top