4

VHDL でポインターを逆参照する方法を理解できませんでした。

私が念頭に置いているのは、次のようなCコードです。

  int a;
  int* ptr_a;

  a = 42;
  ptr_a=&a;
  *ptr_a=451;// how can I do this ?

VHDL でこのコードを模倣しようとしました:

ptr_test : process
    type     ptr_integer is access integer;
    variable a     : integer;
    variable ptr_a : ptr_integer;
  begin
    a         := 42;
    ptr_a     := new integer'(a);
    report "ptr now points to a : ptr=" & str(ptr_a.all);
    ptr_a.all := 451;
    report "ptr modified        : ptr=" & str(ptr_a.all);
    report "a   is NOT modified : a  =" & str(a);
    wait;
  end process;

では、ポインターを介して値を正しく変更するにはどうすればよいでしょうか?

4

2 に答える 2

6

直接できません。アクセス タイプは「ポインタのようなもの」ではありません。少なくともある程度は、データ ストレージの異なるタイプです。

この行は、へのポインタを作成しませんa:

ptr_a     := new integer'(a);

と同じ値のデータ オブジェクトを作成し、それを参照するようaに設定しptr_aます。

別のアクセス型変数を作成する場合:

variable ptr_b : ptr_integer;

を指すように設定しptr_aます。

ptr_b := ptr_a;

に変更するptr_b.allと に反映されptr_a.allます。

于 2013-03-04T14:02:18.930 に答える
3

「new」は、(C ではなく C++)「new」操作と同等です。ヒープに整数を割り当て、それを「a」に初期化するコンストラクターを呼び出します。(当然、完了したら「割り当て解除」できます)

あなたが探しているのはptr_a := a'access;、ポインターを介してグローバルまたはローカル (スタック) 変数にアクセスする Ada の方法です。これは、変数が「エイリアス」と宣言されている場合にのみ有効であり、コンパイラーに複数の変数がある可能性があることを警告します。それのビュー(したがって、いくつかの優れた最適化を妨げます)。C では、必要かどうかに関係なく、すべてが「エイリアス化」されます。

これは、VHDL への単純化プロセスを通過できなかった Ada の側面の 1 つです。これを適切に使用することは困難です。そのため、VHDL にはまったく同等のものはありません。

マーティンの答えがポップアップしました。彼が言うように、同じヒープオブジェクトへのポインターを2つ以上持つことができます。

または、この方法で何を達成しようとしているのかを説明してください。それを行う VHDL の代替方法があるかもしれません。

于 2013-03-04T14:09:09.323 に答える