Компилятор Ады выбирает неправильную перегруженную функцию

Я использую avr-ada для компиляции своей программы. Я хочу дважды сдвинуть вправо переменную unsigned_16. Interfaces.Shift_Right перегружен и обеспечивает как Unsigned_8, так и Unisgned_16.

Когда я компилирую, я получаю сообщение об ошибке «ожидаемый тип «Interfaces.Unsigned_8»», «найден тип «Interfaces.Unsigned_16»». Я пытался указать, что ввод является Unsigned_16, но это не сработает. Как указать правильную функцию?

with AVR;                          use AVR;
with AVR.MCU;
with AVR.Timer0;
with AVR.ADC;
with Interfaces;
use Interfaces;
procedure Flash_Led is

   adc_result_10 : Unsigned_16 := 0;
   adc_result_8 : Unsigned_8 := 0;

begin
   -- set OC0A pin as output, required for output toggling
   MCU.DDRD_Bits := (others => DD_Output);
   -- set all pins low
   MCU.PortD := 16#00#;

   -- clear register
   MCU.TCCR0B := 16#00#;

   --  initialize timer to Clear Timer on Compare, scale the input
   --  clock and set a value to compare the timer against.
   Timer0.Init_CTC (Timer0.Scale_By_1024, Overflow => 1);

   --  Toggle the OC0(A)-Pin on compare match
   Timer0.Set_Output_Compare_Mode_Toggle;

   -- Initialize ADC
   ADC.Init(ADC.Scale_By_64, Ref => ADC.Is_Vcc);


   loop   -- loop forever
      adc_result_10 := ADC.Convert_10bit(Ch => 0);
      adc_result_10 := Shift_Right(Unsigned_16'(adc_result_10), 2); --'
      adc_result_8 := Unsigned_8(adc_result_10);
      Timer0.Set_Overflow_At(adc_result_10);
   end loop;
end Flash_Led;

person userYou    schedule 30.12.2014    source источник
comment
Вы звоните Right_Shift или Shift_Right? Пожалуйста, обновите свой вопрос, чтобы показать (небольшую) полную программу, иллюстрирующую проблему.   -  person Keith Thompson    schedule 30.12.2014
comment
Это компилируется без ошибок для меня с использованием GNAT в Linux (ссылаясь на пример на pastebin, а не на код в вопросе ).   -  person Keith Thompson    schedule 01.01.2015


Ответы (2)


Линия:

Timer0.Set_Overflow_At(adc_result_10);

Должны были быть:

Timer0.Set_Overflow_At(adc_result_8);

Я недостаточно внимательно посмотрел на номер строки в сообщении об ошибке. Упс.

person userYou    schedule 30.12.2014

Если вы не уверены, какая функция вызывается (учитывая, что она перегружена), вы всегда можете создать уникальное имя с помощью переименования...

function My16_Shift_Right (Item : in Unsigned_16; Amount : Natural) return Unsigned_16 
    renames Interfaces.Shift_Right;

а затем проверьте, как вы думаете о своей программе.

person Dale Stanbrough    schedule 02.01.2015