我使用John English:Ada95:面向对象编程的工艺作为教程,我目前正处于表达式计算器章节.这意味着用面向对象的方法编写算术表达式计算器.
该程序编译但提出:
mehdi@debian ~/expressions> ./driver
Execution terminated by unhandled exception
raised PROGRAM_ERROR : expressions.adb:4 finalize/adjust raised exception
Call stack traceback locations:
0x408749 0x408aa4 0x401af6 0x4024ee 0x7f05fe7132df 0x401988 0xfffffffffffffffe
Run Code Online (Sandbox Code Playgroud)
从那些有趣的数字我只能提取这些信息:
addr2line --exe=driver 0x408749 0x408aa4 0x401af6 0x4024ee 0x7f690a2b32df 0x401988 0xfffffffffffffffe
/home/mehdi/expressions/pointers.adb:40 (discriminator 6)
/home/mehdi/expressions/expressions.adb:17
/home/mehdi/expressions/driver.adb:8
/home/mehdi/expressions/b__driver.adb:267
??:0
??:?
??:0
Run Code Online (Sandbox Code Playgroud)
上述行,一个接一个:
overriding procedure Adjust (Object: in out Smart_Pointers) is
begin
Object.Node.Count := Object.Node.Count + 1;
end Adjust; -- here FIRST ONE
end Evaluate; -- SECOND
Put_Line("Le résultat de 598-8/84+25*5*(-5/54) est " & EVALUATE(Expression, Expression_string)'Img); -- THIRD
Ada_Main_Program; -- FOURTH
Run Code Online (Sandbox Code Playgroud)
我仍然没有任何线索,除了它与受控类型有关.
我放的唯一受控制的东西,我把它列在这里.
哦,还有FINALIZE:
overriding procedure Finalize (Object: in out Smart_Pointers) is
procedure Free is new Ada.Unchecked_Deallocation(Accessor_type, Accessor_access);
begin
Object.Node.Count := Object.node.Count - 1;
if Object.Node.Count = 0 then Free(Object.Node);
end if;
end;
Run Code Online (Sandbox Code Playgroud)
但这似乎并不重要.
我是初学者,所以我不知道如何使用gdb或GPS的调试工具.
如果有人有想法,或者需要更大的代码,请让自己知道;-)
这是一个有限的错误Adjust或Finalize提出异常.如果发生这种情况,运行时将引发一个PROGRAM_ERROR.在你的中Adjust,有两种可能会引发异常:
Object.Node 是 null Object.Node.Count 可以在其类型的范围之外递增如果您不想使用调试器,可以向Adjust和添加异常处理程序Finalize.