【问题标题】:Invalid data for boolean布尔值的无效数据
【发布时间】:2019-09-11 13:36:33
【问题描述】:

我的代码有错误。这个错误并不总是出现,我不知道如何调试它。

错误是:

异常名称:CONSTRAINT_ERROR

消息:myFile.adb:42 无效数据

值 84 不在 0..1 中

引用的行是这一行:

procedure myProcedure (ObjectA : in     Ptr_Type;
                       ObjectB : in out T_Type) is
Begin 
    ObjectB.BOOL := ObjectA.BOOL; (line 42)
end procedure;

-- How myProcedure is called :
varA : aliased T_Type;
varB : aliased T_Type;
-- varA and varB are used many times
myProcedure(ObjectA => varA'Unrestricted_Access,
            ObjectB => varB);


-- Where :
type T_Type is record
    ...
    BOOL : Boolean;
end record;    
type Ptr_Type is access all T_Type;

似乎代码试图将 84 放入布尔值中,但我不知道如何调试它。

我该怎么办?

编辑:添加更多细节

【问题讨论】:

  • 听起来像一个未初始化的变量。在 Linux 上,您可以尝试使用 valgrind/memcheck 运行
  • 如果你要问为什么有些代码不能工作,你至少需要向我们展示编译的代码!见minimal reproducible example。就目前而言,您的代码将无法编译,因为在 myProcedure 的主体中,您写入了 in 参数。如果您尝试以正确的顺序显示代码,则显示可编译的代码要容易得多,而不是通过声明向后工作。

标签: pointers ada


【解决方案1】:

问题是你在过程中的赋值语句:

procedure myProcedure (ObjectA : in     T_Type;
                       ObjectB : in out Ptr_Type) is
begin 
   ObjectA.BOOL := ObjectB.BOOL; (line 42)
end procedure;

你看,这个 ObjectA 是“in”参数 - 因此你不能分配给它。

编辑: 现在问题已经解决了,问题就很明显了。

两个变量都没有被初始化 - 在这种情况下,如果可能,将选择无效值作为默认初始化。

【讨论】:

  • 抱歉打错了,输入/输出是正确的(我会编辑我的问题)
【解决方案2】:

首先,如果可以的话,将BOOL : Boolean; 更改为BOOL : Boolean := raise Program_Error with "Uninitialized Value";
也可以试试ObjectA.BOOL := ObjectB.all.BOOL;

【讨论】:

  • 我会尝试您的解决方案,但无法重现该错误。你能解释一下Object.all是什么吗?
  • Object.all 被取消引用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-11
  • 1970-01-01
  • 1970-01-01
  • 2011-05-31
  • 2018-08-21
  • 2021-09-19
相关资源
最近更新 更多