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 中,无论您是否愿意,一切都是“别名”的。

这是 Ada 的一个方面,它没有通过简化过程变成 VHDL:而且很难看到它有什么用处。所以在 VHDL 中没有完全等价的。

马丁的回答刚刚弹出:正如他所说,你可以有 2 个或更多指向同一个堆对象的指针。

或者,解释你试图以这种方式实现的目标;可能有一种 VHDL 替代方法可以做到这一点。

于 2013-03-04T14:09:09.323 回答