Unchecked_Conversion в Аде - PullRequest
       18

Unchecked_Conversion в Аде

2 голосов
/ 20 апреля 2010

Может ли кто-нибудь дать мне разъяснение по поводу использования неконтролируемой конвертации на языке Ada. Я пробовал pdf и net, но все не дает мне четкой картины.

  Now i have a small piece of code shown below:

    subtype Element4_Range is integer range 1..4;
    subtype Element3_Range is integer range 1..3;
    subtype Myarr_Range is integer range 1..10;
    type Myarr3_Type is array (Myarr_Range) of Element3_Range;
    type Myarr4_Type is array (Myarr_Range) of Element4_Range;
    Myarr3 : Myarr3_Type;
    Myarr4 : Myarr4_Type := (1,2,3,3,1,3,2,1,2,1);
    Count_1 : Integer := 0;
    Count_2 : Integer := 0;
    Count_3 : Integer := 0;
    *function To_Myarr3 is new Unchecked_Conversion(Myarr4_type,Myarr3_type);*

Теперь я сомневаюсь, что именно делает функция Myarr3?

Ответы [ 2 ]

3 голосов
/ 20 апреля 2010

Экземпляр Unchecked_Conversion копирует байты исходного значения в цель, не проверяя, является ли это разумным. Некоторые компиляторы предупреждают (возможно, в зависимости от параметров компиляции), если значения имеют разные размеры.

Element3_Range и Element4_Range оба основаны на Integer и будут использовать одинаковое количество байтов; поэтому обеим переменным вашего массива (Myarr3, Myarr4) потребуется одинаковое количество байтов (обычно 40).

Вы могли бы написать

Myarr3 := To_Myarr3 (Myarr4);

В нынешнем виде ничего плохого не произойдет, потому что все значения, которые вы использовали для инициализации Myarr4, допустимы как значения Element3_Range.

Однако, если у вас было

Myarr3 := To_Myarr3 (Myarr4'(1, 2, 3, 4, others => 1));

В результате вы получите Myarr3(4), содержащее значение вне допустимого диапазона Element3_Range, и у компилятора нет оснований полагать, что оно может быть недействительным. Это может привести к Constraint_Error s по линии.

Вы можете самостоятельно выполнить проверку:

if not Myarr3 (4)'Valid then
  -- handle the error case
2 голосов
/ 20 апреля 2010

Однажды у меня был сотрудник, который утверждал, что unchecked_conversion должен был называться "Unchcked_Copy". Все, что он делает, это копирует объект одного типа в объект другого типа.

Таким образом, ваша подпрограмма To_Myarr3 примет в качестве параметра массив типа Myarr4, представит, что это массив типа Myarr3, а затем скопирует каждый элемент в нем в левую часть выражения.

Если вы хотите изменить свой вид объекта с одного типа на другой, не копируя всю чертову вещь вокруг, вы можете вместо этого использовать Unchecked_Conversion для типов доступа к ним (поэтому вы только копируете указатель на них). Другой метод использует for object_name'address use at для наложения одного на другой (однако они могут оба инициализироваться, что может быть плохо). Но на самом деле лучший способ - проектировать типы вашей системы, чтобы вам никогда не приходилось использовать Unchecked_Conversion .

...