【问题标题】:Result value logic in Delphi?Delphi中的结果值逻辑?
【发布时间】:2013-06-19 08:39:09
【问题描述】:

我正在编写这个函数,其中 如果一个字符串仅相差一个字符,则返回不同的字符位置,如果它们是正确的,则应该返回 -1 和 -10大小写相差超过 1 个字符。

仅作为示例,'010''110''100''110' 效果很好,分别返回 0 和 1...

但是,当我尝试使用'100''101''110''111' 我得到-1 的结果,而它应该是2!我已经完成了桌面测试,但我不能只看到错误。

function combine (m1, m2 : string) : integer;
var
dash : integer;
distinct : integer;
i : integer;

begin
distinct := 0;
dash := -1;

for i := 0 to Length(m1)-1 do
begin
    if m1[i] <> m2[i] then
    begin
      distinct := distinct+1;
      dash := i;
      if distinct > 1 then
        begin
          result:= -10;
          exit;
        end;
    end;
end;
result := dash;
end;

我总是得到相同长度的字符串, 我做错了什么?

【问题讨论】:

    标签: delphi function


    【解决方案1】:

    主要问题是 Delphi 字符串是从 1 开始的。您的循环需要从1 运行到Length(m1)

    如果您在编译器选项中启用了范围检查,那么编译器会在运行时引发错误,从而导致您出错。我不能强调你应该启用范围检查。它会导致编译器在你的代码中发现错误。

    另请注意,这意味着返回的值也将从 1 开始。因此'100', '101' 的输入将给出结果3,因为这是第一个差异的索引。

    您还应该检查m1m2 的长度是否相同。如果不引发异常。

    另一个提示。将变量加 1 的惯用方法如下:

    inc(distinct);
    

    如果你想增加一个不同的值,写:

    inc(distinct, n);
    

    所以,我会这样写函数:

    function combine(const m1, m2: string): integer;
    var
      i: integer;
      dash: integer;
      distinct: integer;
    begin
      if Length(m1)<>Length(m2) then begin
        raise EAssertionFailed.Create('m1 and m2 must be the same length');
      end;
    
      distinct := 0;
      dash := -1;
    
      for i := 1 to Length(m1) do
      begin
        if m1[i] <> m2[i] then
        begin
          inc(distinct);
          dash := i;
          if distinct > 1 then
          begin
            result := -10;
            exit;
          end;
        end;
      end;
      result := dash;
    end;
    

    【讨论】:

    • 噗,非常感谢。很多人会抱怨我的问题,但我只是在匆忙用一种我从未做过的语言进行编码。我还有一个问题,当我访问字符串的 0 索引时发生了什么,为什么没有引发任何异常?
    • 我同意那些人的看法。不要着急。花时间正确学习你的工具。
    • index 0 指的是字符串元数据。那是包含字符串的引用计数、长度、代码页等的块。当然,这是实现细节和访问索引 0 会导致未定义的行为(我使用的是 C/C++ 对该术语的解释)。您应该在编译器选项中启用范围检查。
    • 顺便问一下,你看到我的代码是如何缩进的了吗?在问题中正确缩进代码使我们更容易回答。您可以在发布之前让 IDE 为您格式化代码。
    • "主要问题是 Delphi 字符串是从 1 开始的。"请注意这一点,因为这一事实正在慢慢改变。从 XE3 开始,从零开始的字符串已经存在。它们在 Windows 和 Mac 编译器中默认禁用,但在移动编译器中默认启用。可以通过新的{$ZEROBASEDSTRINGS ON|OFF} 编译器指令启用/禁用 ZBS。
    猜你喜欢
    • 2013-11-01
    • 2014-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    • 1970-01-01
    • 2012-02-27
    • 2017-11-23
    相关资源
    最近更新 更多