كيف ترد كود لتحديد اللوغاريتم قيمة القيمة في ADA؟

StackOverflow https://stackoverflow.com/questions/2234397

  •  19-09-2019
  •  | 
  •  

سؤال

باستخدام ADA (GNAT): أحتاج إلى تحديد قوة العشرة لقيمة معينة. النهج الأكثر وضوحا هو استخدام لوغاريتم ولكن هذا فشل في الترجمة.

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;

خطأ:

  • الأدوات المساعدة .adb: 495: 26: "السجل" غير مرئي
    • Utilities.adb: 495: 26: إعلان غير واضح في A-ngelfu.ads: 24، مثيل في الخط 482
    • Utilities.adb: 495: 26: إعلان غير واضح في A-ngelfu.ads:23، مثيل في الخط 482

لذلك، أحاول الرجوع إلى الحزمة، لكن ذلك يفشل أيضا:

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;

خطأ:

  • الأدوات المساعدة .adb: 495: 41: لا توجد تفسيرات مرشحة تطابق الفمونات:
  • Utilities.adb: 495: 41: العديد من الحجج في الدعوة إلى "سجل"
  • الأدوات المساعدة: 495: 53: النوع المتوقع "Standard.float"
  • Utilities.adb: 495: 53: اكتب Universal Integer ==> في Call إلى "Log" في A-ngelfu.ads:24، مثيل في الخط 482
هل كانت مفيدة؟

المحلول

لا أعرف إذا قمت بإصلاحها بالفعل أم لا، ولكن هنا هو الجواب.

بادئ ذي بدء، كما أرى أنك تمر Float عند إنشاء النسخة العامة، يمكنك استخدام One Generic One بدلا من ذلك.

إذا قررت استخدام الإصدار العام الذي يجب عليك فعله بالطريقة الثانية التي قمت بها، يجب عليك إنشاء الحزمة قبل استخدام وظائفها.

انظر الى a-ngelfu.ads. قد ترى النموذج الأولي الفعلي للوظيفة التي تحتاجها (هناك وظيفة أخرى ل LOGARITMMM الطبيعية مع معلمة واحدة فقط):

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

يمكنك أن ترى هناك يجب أن تكون الأساس في نوع تعويم أيضا. سيكون الرمز الصحيح للإصدار العام:

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;

واحد غير عام سيكون هو نفسه بالضبط:

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;

نصائح أخرى

Xandy هو الصحيح. حل محله.

ومع ذلك، فإن كونها ADA كان هناك استثناءان للحماية من ...

  • القيمة <0.0.
  • القيمة = 0.0.

بدون حراس هذه الوظيفة كما يسبب استثناءات أن يتم إنشاؤها. وتذكر أن _log كما عاد يمكن أن يكون <0 و 0 و> 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; 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top