【问题标题】:Lazarus error "External: SIGSEGV" on variable increment?变量增量上的 Lazarus 错误“外部:SIGSEGV”?
【发布时间】:2015-11-28 10:27:17
【问题描述】:

我在我的 Lazarus 项目中遇到了一个问题:每次我想使用一个函数时,它都会抛出上述错误 (External: SIGSEGV)。我不知道那是什么意思,但一些调试告诉我,这是导致错误的代码:

class function TUtils.AsStringArray(const Strs:TStrings): TStringArray;
var
  s:string;
  i:integer;
begin
  SetLength(Result, Strs.Count);
  i := 1;
  for s in Strs do
  begin
    Result[i] := s;
    i := i + 1;
  end;
end; 

以及定义

TStringArray = array of string; 

TUtils = class
  public
    [...]
    class function AsStringArray(const Strs:TStrings): TStringArray; static;
end;   

异常发生在i := i + 1; 之后。如果您能帮助我,我将不胜感激!

【问题讨论】:

    标签: lazarus freepascal


    【解决方案1】:

    TStringArray = array of string; 等动态数组是从零开始的;您的代码将其用作基于 1 的值并引发访问冲突。

    您应该将i := 1; 替换为i := 0;

    【讨论】:

    • 它修复了之前的错误,但它要么显示了另一个错误,要么创建了一个新错误。汇编器显示这个命令:00407189 8b12 mov (%edx),%edx
    【解决方案2】:

    对于第二个问题,这是因为您正在访问索引 i,一开始它是 1,这就是您遇到问题的原因,数组的范围由“长度 - 1”确定,所以如果你的长度是 1,那么你的范围是 0。所以要解决你的 for 循环中的问题,你必须像这样输入 Result[i-1] := s; 来访问你真正想要的索引。

    更多内容请关注http://wiki.freepascal.org/Dynamic_array

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-25
      • 2013-10-01
      • 2013-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多