Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.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
Delphi 有没有其他方法不使用-MAXINT来执行这个case语句?_Delphi_Switch Statement - Fatal编程技术网

Delphi 有没有其他方法不使用-MAXINT来执行这个case语句?

Delphi 有没有其他方法不使用-MAXINT来执行这个case语句?,delphi,switch-statement,Delphi,Switch Statement,我有一个case语句,它计算结果代码的整数(函数的结果),如下所示: R:= DoSomething; case R of 0: begin //Success end; 1..99: begin //Specific result messages end; 100..199: begin //Other specific result messages end; -MAXINT

我有一个case语句,它计算结果代码的整数(函数的结果),如下所示:

  R:= DoSomething;
  case R of
    0: begin
      //Success
    end;
    1..99: begin
      //Specific result messages
    end;
    100..199: begin
      //Other specific result messages
    end;        
    -MAXINT..-1: begin
      //Failure
    end;
  end;
如果失败,则返回一个负数,表示错误代码
DoSomething
只是返回一个整数作为响应代码(或错误代码,为负数)的任何函数。如果它是一个错误,则会传递给另一个错误处理程序。如果是成功的,它将传递给成功处理程序(continue等)。正值将由各种特定的处理程序处理


我想知道是否有其他方法来编写
-MAXINT..-1
。更接近于“任何-1及以下”的意思。我尝试了
对所有未处理的结果使用
else
块,并在该块中区分失败的执行和没有显式处理程序的成功执行(最后一种情况是您在示例代码中似乎没有考虑到的)


您试图强制执行一个严格的
案例
,您应该使用
if
案例
的组合:

if R = 0 then
  // Success
else 
  if R < 0 then
    // Failure
  else
  begin  // Positive values
    case R of
       1..99: ...
     100..199: ...
     // Other expected values
     else
       // Unexpected positive value
     end;
  end;
如果R=0,则
//成功
其他的
如果R<0,则
//失败
其他的
开始//正值
案例R
1..99: ...
100..199: ...
//其他预期值
其他的
//意外正值
结束;
结束;
我个人会对上述内容进行格式化,使流程更加清晰,但这是我自己的偏好:

if R = 0 then
  // Success
else if R < 0 then
  // Failure
else
begin  // Positive values
  case R of
     1..99: ...
   100..199: ...
   // Other expected values
   else
     // Unexpected positive value
   end;
end;
如果R=0,则
//成功
否则,如果R<0,则
//失败
其他的
开始//正值
案例R
1..99: ...
100..199: ...
//其他预期值
其他的
//意外正值
结束;
结束;
或者,更好的是(拉里在对我的回答的评论中提到了这一点,但奇怪的是他没有提到):

如果R<0,则
//失败
其他的
开始
案例R
0://成功
1..99://预期正值
100..199:
其他的
//意外的积极因素
结束;
结束;

什么是正值?@IgnacioVazquez Abrams好吧,这些将由其他案例陈述来处理,但我不想在这个问题中包括所有可能的值,因为这些值不一定相关(尽管同样适用于正值),最终会有许多具体的正值,我将在
1..99
100..199
200..299
等范围内进行处理。但这些细节与问题无关。我不同意。:-)这一细节与问题密切相关。没有它,您根本不需要
案例。您应该进行编辑,至少包括一条关于处理正数的注释。(如果有这个细节,我就不会在这里发表评论,也不会对拉里关于强制执行不必要的
案例的回答发表评论)注意,最小整数值是
-MAXINT-1
-MAXINT表示MAXINT符号已更改。不一定需要
R>=0
,只需要
R>0
从技术上讲,您只需要
R>最后一次处理\u返回\u code
。但是,如果您正在管理大量案例,
else
块将报告从显式处理案例列表中意外删除的任何R案例,这将是一个很好的防御编程。如果您编写R>0,然后删除0大小写,程序会给您一条错误消息,好像函数返回了一个失败代码,而实际上,它会返回一个您忘记处理的成功代码。@Ken:根据注释,真正的问题涉及一长串
case
s。如果只有三种情况,则使用
If
语句更合适。但对于10或20个并行案例,我认为OP使用
案例
是正确的。当然,另一种选择是将
案例
嵌套在
if
中,这样只有正值提交给案例开关,但是如果出现未处理的成功代码,则在
案例
中仍然需要
else
。@Larry:如果特定的目的是故意忽略>0的值,没有“防御性编程”,你故意忽略了它们。然而,基于Jerry实际想要处理积极因素的“非相关细节”(如他对问题的评论所示),我的上述评论不再适用(它是基于他所说的仅处理
0
<0
的值)。他改变了问题,我将删除评论。:-)+1.我喜欢您嵌套到简洁易读的代码中的方式。0是一个预期结果(我收集的其中一个是一些可能成功的返回代码),在我看来,它应该作为case语句中的另一个预期值与它的对等方一起处理。@Larry:好的。那是你的喜好。它可能也是我的,但问题不是这样问的。:-)你贴出的答案也不是这样处理的。编辑以添加该备选方案。
if R = 0 then
  // Success
else if R < 0 then
  // Failure
else
begin  // Positive values
  case R of
     1..99: ...
   100..199: ...
   // Other expected values
   else
     // Unexpected positive value
   end;
end;
if R < 0 then
  // Failure
else
begin
  case R of 
      0:  // Success
      1..99: // Expected positive values
    100..199:
  else
      // Unexpected positives
  end;
end;