2

以下に 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) が実際に何を意味するのかということです.それは、配列内の次の要素のアドレスを返すことを意味しますか?それは、Ada の 'B'.Storage_Offset'(4) です --これを行います4 ビットまたは 4 バイトのメモリを意味します。2) Last_Address が 'K' である配列の最後の要素を指していると仮定すると、算術 Storage_Offset'(40) は実際の実装をどのように満たしますか?

さらに説明が必要な場合は、私に戻ってください。

関数は存在しないと仮定してください。実際のところ、私はいくつかのADAファイルを持っており、私の仕事はそれらをCファイルに変換することです.私はADAの初心者なので、それで多くの問題に直面しました.混乱が生じた場合はご容赦ください

ありがとうマディ

4

2 に答える 2

3

Storage_OffsetSystem.Storage_Elementsは、タイプのオブジェクトに追加できるパッケージ内の特別な整数型System.Addressです。との単位は正確にAddressStorage_Offset実装定義ですが、おそらく存在するほぼすべての実装がバイトを使用します。つまりNext_Address + Storage_Offset'(4)、「Next_Addressが参照するものを4バイト超えたアドレス」を意味します。

あなたはエイダの移植について少し話しました。99%の場合、これは非常に愚かな考えです(%1は、Adaコンパイラがないプラットフォームに移植する必要がある場合です)。移植する言語に関係なく、同じことを言うでしょう。それはばか者のゲームです。コードを移植するときに期待できる最善の結果は、多大な労力を費やした後でも、以前と同じように機能することです。コーディングでは、最良のケースは決して起こりません。

AdaはCとうまくインターフェースできるので、Adaに変更されていないコードを保持し、変更する必要があるのは「ポート」のものだけにする方がはるかに賢明です。

タスクコード、保護されたタイプ、またはカスタムストリームに遭遇した場合、あなたは傷ついた世界にいるでしょう。それらのものは本当に簡単なCアナログを持っていません。

上司が本当にCか何かに夢中になっている場合は、 SofcheckのAdaMagicを調べることをお勧めします。これは、AdaコードをANSICに変換するサービスを提供します。 Cコード。いずれにせよ、経験の浅い(Adaの)開発者にすべてを手作業で試してもらうよりもはるかに安価になるでしょう。

于 2010-04-27T20:58:56.577 に答える
2
my_func(int P1,int P2)
{
  return P2 + Storage_Offset'(4);
}

さて、これは本体が Ada で書かれた C 関数です。Integer と Storage_Offset を取る "+" 演算子はありません。おそらくあなたが探している

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

おそらくあなたは電話するつもりでしたmy_func(something, Next_Address)か?

Storage_Elementその場合、式はの後に 4 秒、つまりバイトのアドレスを返しますMyarr('A')

Myarr_Typeの配列でありCharacter、一般的なアーキテクチャ上の通常のコンパイラでは、標準の 8 ビット バイトになります。したがって、Myarr_Typeオブジェクトの長さは 44 バイトではなく 11 バイトMyarr('A')'Address + 4になり、 のアドレスになりますMyarr('E')

の最後の要素のアドレスが必要な場合はMyarr、試してください

Myarr (Myarr'Last)'Address
于 2010-04-27T21:11:00.120 に答える