拉撒路的SIGSEGV错误

时间:2018-04-25 21:53:35

标签: lazarus freepascal

我有一个表格,按下按钮我想读取一个文件。没关系,我的程序就是这样做的。

temekek.txt包括string string integer

阅读文件很好。

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

我的想法是收集阵列中所有独特的城市。

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

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

这是我的计划:

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;

1 个答案:

答案 0 :(得分:3)

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

要更正:

SetLength(cities,i+1);