lazarus 中的 SIGSEGV 错误

SIGSEGV error in lazarus

我有一个表单,点击一个按钮我想读取一个文件。没关系,我的程序做到了。

temekek.txt 包括 string string integer.

读取文件正常

我想做一些验证,所以我想检查文件中有多少 cities(第一个字符串)。

我的想法是将所有独特的城市收集到一个数组中。

当我想创建一个动态数组时,我遇到了一个错误SIGSEGV

我卸载了我的64位Lazarus,安装了32位,结果是一样的

这是我的程序:

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, strutils;

type

  { TmainForm }

  TmainForm = class(TForm)
    readProcutsBtn: TButton;
    procedure readProcutsBtnClick(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }

  end;

type
  productFileRow = record
    productCity, productName: string;
    productCount: integer;
  end;

var
  mainForm: TmainForm;
  productFileDataArray: array[1..200] of productFileRow;
  isProductFileValid: boolean;

const
  minCities = 2;

const
  maxCities = 50;

const
  productsFile = 'termek.txt';



implementation

{$R *.lfm}

{ TmainForm }


procedure readProducts;

var
  i: integer;
  productFileIn: TextFile;
  line: string;

begin
  assignFile(productFileIn, productsFile);
  reset(productFileIn);
  i := 0;

  while not EOF(productFileIn) do
  begin
    readLn(productFileIn, line);
    SScanf(Line, '%s %s %d', [@productFileDataArray[i].productCity,
      @productFileDataArray[i].productName, @productFileDataArray[i].productCount]);
    i := i + 1;
  end;
  closefile(productFileIn);

end;

function validateCityCount: boolean;

var
  cities: array of string;
  productFileRowItem: productFileRow;
  i: integer;

begin
  for productFileRowItem in productFileDataArray do
  begin
    i := 0;

    if not (AnsiMatchStr(productFileRowItem.productCity, cities)) then
    begin
      SetLength(cities, i);
      cities[i] := productFileRowItem.productCity;
      i := i + 1; 
    end;

  end;

  validateCityCount := False;
end;

procedure TmainForm.readProcutsBtnClick(Sender: TObject);
begin
  readProducts;
  if not validateCityCount then
  begin
    ShowMessage('Sorry, product file is invalid, too much or too less cities');
    Exit;
  end;
  ShowMessage('Products readed form `' + productsFile + '`');

end;

end.

我的程序死在这一行:

cities[i] := productFileRowItem.productCity;

您将 SetLength(cities,i) 设置为一次性长度。第一次 i 为零,这意味着一个空数组。下一行尝试访问数组中的第一个元素,这会导致崩溃。

更正:

SetLength(cities,i+1);