【问题标题】:SIGSEGV error in lazarus拉撒路中的 SIGSEGV 错误
【发布时间】:2018-10-06 11:57:37
【问题描述】:

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

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;

【问题讨论】:

    标签: lazarus freepascal


    【解决方案1】:

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

    纠正:

    SetLength(cities,i+1);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-30
      • 1970-01-01
      • 2016-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多