2010-04-27 2 views
1

아래 코드를 Ada 언어에 붙여 넣었습니다. 일부 구현에 대한 설명이 필요합니다. 이제ada의 주소 표현

C : character; 

    Char : character; 
    type Myarr_Type is array (character range 'A'..'K') of character; 
    Myarr : Myarr_Type := ('A','B','C','D','E','F','G','H','I','J','K'); 

    Next_Address := Myarr'address --' 
    Last_Address := Next_Address + Storage_Offset'(40); --' 

    return P2 + Storage_Offset'(4); --' 

    Last_Address := Next_Address + Storage_Offset'(4); --' 

내 의심의 여지 1) 무엇을하지 P2 + Storage_Offset '(4)는이 배열의 다음 요소의 주소를 반환하는 것을 의미 실제로 mean.Does'B'.Storage_Offset '(4) - 이것은 평균 4 비트 또는 4 바이트의 메모리를 의미합니다. 2) Last_Address가 배열의 마지막 요소 인 'K'를 가리킨다 고 가정하면, arithmentic Storage_Offset '(40)은 실제 구현을 어떻게 만족합니까?

더 이상의 설명이 필요한 경우 나에게 연락하십시오.

해당 기능이 존재하지 않는다고 가정하십시오. 사실 저는 ada 파일을 가지고 있고 C 파일로 변환하는 작업을하고 있습니다. 나는 초보자이기 때문에 많은 문제에 봉착했습니다. 어떤 혼란이든 용서해 주시기 바랍니다.

감사

+0

귀하의 질문에 모양과 사람이 그것의 의미를 가정하는 방법을 고려하시기 바랍니다하려고합니다. 또한 ** 더 많은 답변을 수락 **. –

+0

질문의 어느 부분이 명확하지 않은지 알려주시겠습니까?이 질문에 대해 명확하게 표시하는 것보다 더 낫습니다. – maddy

+1

당신이 이것을 얻은 곳마다, 그것은 "아다 언어"가 아닙니다. Fortran이나 C 또는 무엇인가에서 문자 적으로 번역 된 모든 표시를 보여줍니다. 약간의 유능한 Ada 프로그래머조차 이런 식의 코드를 작성하지 않습니다. 나 또는 다른 누군가가이 코드를 읽어 들여서 무엇을하고 있는지 말할 수는 있지만 직접 코드를 읽으면 이해할 수 있습니다. 이해가 안되는 부분은이 코드가 달성하려고하는 것입니다. 우리가 "그것을 이해할 수있다"는 것을 안다면, 코드가 의미하는 바를 더 잘 설명 할 수 있습니다. (그리고 네, 더 많은 답변을 수락하십시오.) –

답변

2

Storage_Offset 매디 유형 System.Address의 객체에 추가 할 수있는 패키지 System.Storage_Elements에서 특별한 integeral 유형입니다. AddressStorage_Offset의 단위는 정확히 정의되어 있지만, 실제로 존재하는 모든 구현은 바이트를 사용합니다. 따라서 Next_Address + Storage_Offset'(4)은 "Next_Address가 참조하는 주소의 4 바이트가 지난 주소"를 의미합니다.

Ada 포팅에 대해 조금 이야기했습니다. 99 %의 경우, 매우 어리석은 아이디어입니다 (% 1은 Ada 컴파일러가없는 플랫폼으로 포팅해야하는 경우 임). 나는 당신이 포팅하는 언어가 무엇이든 똑같은 것을 말할 것입니다. 그것은 바보의 게임이다. 코드를 이식 할 때 기대할 수있는 결과는 이전과 마찬가지로 많은 노력을 기울여야 가능합니다. 코딩으로 최상의 경우는 결코 발생하지 않습니다.

Ada는 C와 잘 인터페이스 할 수 있으므로 Ada에서 변경되지 않은 코드를 유지하고 변경해야하는 "포트"항목 만 유지하는 것이 훨씬 현명합니다.

작업 코드, 보호 된 유형 또는 사용자 정의 스트림을 발견하면 상처를 입을 것입니다. 그런 것들은 쉬운 C 유사어를 가지고 있지 않습니다.

상사가 실제로 C 또는 다른 것에 대한 보더를 가지고 있다면 나는 Ada 코드를 ANSI C로 변환하는 서비스를 제공하는 Sofcheck's AdaMagic을 조사 할 것을 제안합니다. 이전에 (두 명의 소유자가 이전에) 유지 보수 가능한 C 코드를 생성했습니다. 어쨌든, 경험이없는 (Ada에서) 개발자가 손으로 직접 시도하는 것보다 훨씬 저렴할 것입니다.

2
my_func(int P1,int P2) 
{ 
    return P2 + Storage_Offset'(4); 
} 

그런데,이 본문 에이다로 작성된 C의 함수이다. Integer 및 Storage_Offset을 취하는 "+"연산자는 없습니다. 아마도 당신은 찾고있다

function "+"(Left : Address; Right : Storage_Offset) 
return Address; 

그리고 아마 my_func(something, Next_Address)를 부를 것 인가?

이 경우 표현식은 Myarr('A') 다음에 4 Storage_Element (즉, 바이트) 인 주소를 반환합니다.

Myarr_TypeCharacter의 배열이며 일반적인 아키텍처의 일반적인 컴파일러는 표준 8 비트 바이트가됩니다.따라서 Myarr_Type 개체는 길이가 11 바이트가 아니고 44가되며 Myarr('A')'Address + 4Myarr('E')의 주소가됩니다. 당신이 Myarr의 마지막 요소의 주소를 원하는 경우

,

Myarr (Myarr'Last)'Address