Comment le code vous pour déterminer le logarithme d'une valeur Ada?
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
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;