2010-04-20 3 views
2

누구나 Ada language.I의 체크되지 않은 변환 사용에 대해 명확히 해줄 수 있습니까? 나는 pdf와 net을 시도했지만 나에게 명확한 그림을주지 않습니다.Ada의 Unchecked_Conversion

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 기능이 정확히 무엇입니까?

답변

3

인스턴스화 Unchecked_Conversion은 소스 값의 바이트를 대상에 복사합니다. 일부 컴파일러는 값이 다른 크기 인 경우 컴파일 옵션에 따라 경고합니다.

Element3_RangeElement4_Range은 모두 Integer을 기반으로하며 동일한 바이트 수를 사용합니다. 따라서 두 배열 변수 (Myarr3, Myarr4)는 동일한 바이트 수 (일반적으로 40)를 필요로합니다. 약자로

당신은 당신이 Myarr4을 초기화하는 데 사용 한 모든 값이 Element3_Range의 값으로 법적 때문에 일어날 나쁜 아무것도

Myarr3 := To_Myarr3 (Myarr4); 

을 쓸 수 있습니다. 당신이

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

이 있다면

그러나 Myarr3(4)Element3_Range의 법적 범위를 벗어나는 값을 포함 끝낼, 그것이 유효하지 않을 수 있다고 믿을 이유가없는 컴파일러와 것입니다. 이것은 라인 아래로 Constraint_Errors로 이어질 수 있습니다.

당신은 자신을 확인 강제 수 :

if not Myarr3 (4)'Valid then 
    -- handle the error case 
2

나는 unchecked_conversion 대신 "Unchcked_Copy"라는 한 것을 instisted 사람 한 번 동료가 있었다. 하나의 유형의 객체를 다른 유형의 객체에 복사하는 것뿐입니다.

그래서 To_Myarr3 루틴은 매개 변수로 Myarr4 유형의 배열을 허용하고 Myarr3 유형의 배열 인 것처럼 가장하며 그 안에있는 모든 요소를 ​​표현식의 왼쪽에 복사합니다.

주위의 모든 것을 복사하지 않고 한 유형에서 다른 유형으로 객체의보기를 변경하려는 경우 대신 액세스 유형에 대해 Unchecked_Conversion을 사용하여 포인터를 복사 만 할 수 있습니다. 또 다른 방법은 for object_name'address use at을 사용하여 다른 하나를 오버레이하는 것입니다 (그러나 둘 다 초기화 될 수 있으며 이는 좋지 않을 수 있습니다). 하지만 가장 좋은 방법은 에 시스템의 유형을 설계하여 Unchecked_Conversion을 사용할 필요가 없도록하는 것입니다.