我有一个表格,按下按钮我想读取一个文件。没关系,我的程序就是这样做的。
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;
答案 0 :(得分:3)
您将SetLength(cities,i)
设置为一个长度。第一次i
为零,这意味着一个空数组。下一行尝试访问数组中的第一个元素,这会导致崩溃。
要更正:
SetLength(cities,i+1);