2010-04-27 34 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 )在Ada中 - 這意味着4位或4字節的內存。 2)如果我假設Last_Address指向數組'K'的最後一個元素,那麼算術Storage_Offset'(40)如何滿足實際實現?

如果你需要更多的說明,請回到我身邊。

請認爲該功能不存在。事實上,我有一些ada文件,我的工作是將它們轉換爲C文件。由於我是ada的初學者,因此我遇到了很多問題。請在有任何混淆的情況下請諒解。

由於 麥迪

+0

請看看你的問題,並考慮人應該如何理解它。還**接受更多答案**。 – 2010-04-27 10:12:35

+0

請告訴我問題的哪一部分不清楚?這會更好,而不僅僅是標註這個問題不清楚。 – maddy 2010-04-27 10:48:01

+1

無論你從哪裏得到這個,它都是*不*在「阿達語言」中。它顯示了每個從Fortran或C或其他東西中翻譯過來*的字面意思。沒有一個能夠勝任的Ada程序員可以編寫這樣的代碼。我或這裏的其他人可以簡單地將代碼讀回給你,並說出它在做什麼,但你可以通過自己閱讀代碼來獲得。不明白的是這段代碼應該試圖完成什麼;如果我們知道,如果我們能「理解它」,那麼我們可以更好地解釋代碼的含義。 (是的,接受更多的答案。) – 2010-04-27 12:05:21

回答

2

Storage_Offset是可以添加到System.Address類型的對象包System.Storage_Elements特殊integeral類型。 AddressStorage_Offset的單元究竟是什麼實現定義的,但可能幾乎所有存在的實現都使用字節。所以Next_Address + Storage_Offset'(4)的意思是「地址超過Next_Address指向的四個字節」。

你談了一些關於Ada移植的內容。在99%的情況下,這是一個非常愚蠢的想法(%1是當你需要移植到沒有Ada編譯器的平臺時)。不管你使用什麼語言,我都會說同樣的事情。這是一個愚蠢的遊戲。在移植代碼的過程中,你可以希望得到的結果是,經過大量努力後,它可以像以前一樣工作。隨着編碼最好的情況永遠不會發生。

Ada可以很好地與C接口,因此在Ada中保持不變的代碼並且只需要更改「端口」就可以了。

如果您遇到任何任務代碼,受保護類型或自定義流,您將處於一個受到傷害的世界。這些東西並不是很容易的C類似物。

如果你的老闆真的有C或者其他的東西,我建議你看看Sofcheck's AdaMagic,它提供了一個服務來將Ada代碼轉換成ANSI C.在當天(兩個所有者之前),他們曾經聲稱它生成可維護的C代碼。無論哪種方式,它可能會比缺乏經驗的(Ada)開發人員嘗試手動完成這些操作要便宜得多。

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

那麼,這是一個C函數,它的主體是用Ada編寫的。沒有使用Integer和Storage_Offset的「+」運算符;也許你正在尋找

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

也許你打算叫my_func(something, Next_Address)

在這種情況下,表達式將返回Myarr('A')之後的任何地址,即字節。

Myarr_Type是一個Character的數組,它與任何常見架構上的任何常規編譯器將成爲標準的8位字節。所以Myarr_Type對象將是11個字節長,而不是44,並且Myarr('A')'Address + 4將是Myarr('E')的地址。

如果你想的Myarr最後一個元素的地址,嘗試

Myarr (Myarr'Last)'Address