Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops Can';不能处理ada任务中的异常_Loops_Select_Task_Call_Ada - Fatal编程技术网

Loops Can';不能处理ada任务中的异常

Loops Can';不能处理ada任务中的异常,loops,select,task,call,ada,Loops,Select,Task,Call,Ada,我举了以下例子: with Ada.TEXT_IO; use Ada.TEXT_IO; procedure main is task Test is entry Call1; entry Call2; end Test; task body Test is Num : Integer := 5; begin loop select when Num < 5 => accept Call1 do

我举了以下例子:

with Ada.TEXT_IO;
use Ada.TEXT_IO;

procedure main is

  task Test is
    entry Call1;
    entry Call2;
  end Test;

  task body Test is
    Num : Integer := 5;
  begin
    loop
      select when Num < 5 =>
        accept Call1 do
          Put_Line("Call1 called!");
        end Call1;
      or when Num > 5 =>
        accept Call2 do
          Put_Line("Call2 called!");
        end Call2;
      or
        terminate;
      end select;
    end loop;
    exception when PROGRAM_ERROR => Put_Line("Nothing to call... :(");
  end Test;

begin
  Test.Call1;
end;
带有Ada.TEXT\u IO;
使用Ada.TEXT\u IO;
主要程序是
任务测试是
进入电话1;
进入电话2;
结束试验;
任务体测试是
Num:整数:=5;
开始
环
当Num<5=>
接受电话
放线(“呼叫1!”);
结束通话1;
或者当Num>5=>
接受电话做什么
放线(“呼叫2!”);
结束通话2;
或
终止
终端选择;
端环;
当程序错误=>Put_行(“无需调用…:(”)时出现异常;
结束试验;
开始
试验1;
结束;

如果我是对的,当任务不能调用任何东西时,它会出现程序错误。当我运行它时,它会陷入一个无休止的while循环中。我如何解决这个问题?

我想你是在尝试探索当没有打开的
选择
备选方案时会发生什么

如果所有备选方案都已关闭且没有其他部分,则会引发异常程序_错误

问题是,
terminate
是一个选择选项(,同上),无法关闭,因此并非所有选项都关闭,
Test
位于
terminate
,准备在主程序退出时终止。但主程序位于
Test.Call1
死锁

如果您消除
或终止
,您将得到预期的
程序错误
;任务终止,主程序将得到
任务错误


在理想情况下,编译器会发现两个
accept
都不可能是开放的;想必没有人有足够的深度来实现检查(通常问题会不那么明显)。

我想你是在尝试探索没有开放的
选择
替代方案时会发生什么

如果所有备选方案都已关闭且没有其他部分,则会引发异常程序_错误

问题是,
terminate
是一个选择选项(,同上),无法关闭,因此并非所有选项都关闭,
Test
位于
terminate
,准备在主程序退出时终止。但主程序位于
Test.Call1
死锁

如果您消除
或终止
,您将得到预期的
程序错误
;任务终止,主程序将得到
任务错误


在理想情况下,编译器会发现这样一个事实,即
accept
都不能打开;大概没有人有足够深刻的感受来实现检查(通常情况下,问题不会那么明显).

你说得不对。有什么问题吗?如果我在下面的假设中是正确的,即你正在探索如果没有开放选择的替代方案会发生什么,那么如果你这样说而不是仅仅说“我有以下示例”,那会有所帮助.如果不是,正如雅各布所说,问题是什么?你是不对的。问题是什么?如果我在下面的假设中是正确的,你正在探索如果没有开放选择的替代方案会发生什么,如果你这样说,而不是仅仅“我有下面的例子”,那会有所帮助。如果不是,正如Jacob所说,问题是什么?例如,在现实世界的程序中,
Num
永远不会改变这一点并不明显。选择性接受也不会是任务接受输入调用的唯一位置。如果我将代码从这个:或当Num>5=>修改为这个:或当Num>4=>时,我将得到无休止的循环。如何我能处理吗?
Num>5
(或
4
)处于
Call2
的保护中,但您的主程序正在尝试
Call1
。因此您仍然存在死锁(不是无止境的循环!尽管从外部看它们确实很相似)例如,在现实世界的程序中,
Num
永远不会改变这一点并不明显。选择性接受也不是任务接受输入调用的唯一位置。如果我将代码从这个:或当Num>5=>修改为这个:或当Num>4=>时,我将得到无休止的循环。我如何处理这个问题?
Num>5
(或
4
)处于
Call2
的保护中,但您的主程序正在尝试
Call1
。因此您仍然存在死锁(不是无止境的循环!尽管从外部看它们确实相似)