pointers - 尝试将指针传递给向量元素时,对变量的访问指定常量

标签 pointers vector ada

此问题是 How to get access to a record field 的后续问题.

更复杂的(现在)代码涉及绑定(bind)整个记录向量。大致如下:

type Tag is record
  Field : String := "value";
end record;

type Tag_Access is access all Tag;

package Tags_Vectors is new Indefinite_Vectors
  (Index_Type   => Positive,
   Element_Type => Wheel_Tag);

procedure Bind_Tag (T : in out Tag_Access; Stmt : Gnade.Statement) is
begin
    Gnade.Bind_Text (Stmt, T.Field'Address, T.Field'Length);
end Bind_Tag;

procedure Insert_Tags is
  Stmt : Gnade.Statement;
  Tags : Tags_Vectors.Vector;
  --  Make necessary arrangements to populate the Stmt and Tags
  C : Tags_Vectors.Cursor := Tags.First;
begin
  while Tags_Vectors.Has_Element (C) loop
         Bind_Tag (Stmt, Tags_Vectors.Element (C)'Access);
         Tags_Vectors.Next (C);
  end loop;
  Gnade.Step (Db, Stmt);
end Insert_Tag;

我不确定 Tags_Vector.Element (C) 返回什么样的内容。至少从语法上看,Ada 似乎并不反对拥有访问属性。但是,我不明白这个错误(它认为哪一边是变量,哪一边是常量?)为什么访问变量指定常量是不好的? (它是想说我可能会改变常量的值吗?——但我从来不希望这些东西成为常量......)

最佳答案

主要问题是 Tag_Vectors.Element 返回一个临时元素,而不是可以即时修改的元素。对于编译器来说,它显示为常量,并且该函数需要一个“in out”,表示“变量”修改。这意味着您需要一个更永久的变量来保存它。此外,它必须是一个访问变量,而不是一个元素。所以你需要改变一些事情。

您可以为该元素创建一个变量,也可以为其访问创建一个变量并使用这些变量:

procedure Insert_Tags is
  Stmt : Gnade.Statement;
  Tags : Tags_Vectors.Vector;
  --  Make necessary arrangements to populate the Stmt and Tags
  C : Tags_Vectors.Cursor := Tags.First;
  Temp : aliased Wheel_Tag;
  Temp_Access : Tag_Access;
begin
  while Tags_Vectors.Has_Element (C) loop
         Temp := Tags_Vectors.Element(C);
         Temp_Access := Temp'Unchecked_Access;  
         Bind_Tag (Temp_Access, Stmt);
         Tags_Vectors.Next (C);
  end loop;
  Gnade.Step (Db, Stmt);
end Insert_Tags;

或者您也可以只使用访问变量和向量的引用函数:

procedure Insert_Tags is
  Stmt : Gnade.Statement;
  Tags : Tags_Vectors.Vector;
  --  Make necessary arrangements to populate the Stmt and Tags
  C : Tags_Vectors.Cursor := Tags.First;
  Temp_Access : Tag_Access;
begin
  while Tags_Vectors.Has_Element (C) loop
         Temp_Access := Tags.Reference(C).Element;  
         Bind_Tag (Temp_Access, Stmt);
         Tags_Vectors.Next (C);
  end loop;
  Gnade.Step (Db, Stmt);
end Insert_Tags;

请注意,只有 Bind_Tag 未在内部保存访问权限时,这些访问变量分配才有效。如果是这样,那么您必须确保在内部工作保存这些访问值时,这些向量元素永远不会被移动或删除。

关于pointers - 尝试将指针传递给向量元素时,对变量的访问指定常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77724552/

相关文章:

c - 当使用 realloc 并将内存写入新地址时会发生什么?

c - 为什么 *str1 和 *(&str1)(str 是 C 中 char 数组的名称)的计算结果不一样?

java - 动态二维数组

c++ - 将 vector 元素插入队列

ada - 如何使 GPR 接受同一项目中具有相同文件名的多个源?

c - Swift 与 C 结构指针

c++ - 指针和多维数组题

C++/带有对象指针 vector 的多个文件

operating-system - 如何在 Ada 中直接访问内存地址?

new-operator - 谁能给我一份 Ada 中 "single quote mark"用法的摘要?