Я занят созданием приложения, в котором я читаю данные еще из двух файлов «записей». У меня очень странная ошибка, которая выскакивает в зависимости от последовательности, в которой я открываю файлы (см. код ниже).
Если я нажимаю кнопку 1, а затем кнопку 2, вызывая таким образом файл «записей данных о погоде», а затем файл «записей параметров», все в порядке. Если я сделаю это наоборот, я получу «переполнение стека», за которым следует ошибка «нарушение доступа по адресу 0x7c90e898: запись адреса». Это происходит, когда я вызываю SetLength для массива в Button1Click.
Файл данных о погоде содержит около 550 записей, а файл параметров — около 45 записей.
Может ли кто-нибудь увидеть что-то очевидное не так с моим кодом? Я не уверен, как прикрепить файлы или сделать их доступными, если кто-то хочет использовать их для тестирования...
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls, Grids,FileCtrl,Contnrs;
type
TWeatherData = record
MyDate : TDate;
Rainfall : Double;
Temperature : Double;
end;
TParameters = record
Species : string[50];
ParameterName: string[50];
ParameterValue : double;
end;
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
Var
WeatherDataFile : file of TWeatherData;
j : integer;
WeatherDataArray : array of TWeatherData;
MyFileSize : Integer;
begin
AssignFile(WeatherDataFile,'C:\Test5.cmbwthr') ;
Reset(WeatherDataFile);
MyFileSize := FileSize(WeatherDataFile);
SetLength(WeatherDataArray,MyFileSize);
j := 0;
try
while not Eof(WeatherDataFile) do begin
j := j + 1;
Read (WeatherDataFile, WeatherDataArray[j]) ;
end;
finally
CloseFile(WeatherDataFile) ;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
ParametersFile : file of TParameters;
j : integer;
CurrentParameters : array of TParameters;
MyFileSize : Integer;
begin
AssignFile(ParametersFile,'C:\Test5.cmbpara') ;
Reset(ParametersFile);
Reset(ParametersFile);
MyFileSize := FileSize(ParametersFile);
SetLength(CurrentParameters,MyFileSize);
j := 0;
try
while not Eof(ParametersFile) do begin
j := j + 1;
Read (ParametersFile, CurrentParameters[j]) ;
end;
finally
CloseFile(ParametersFile) ;
end;
end;
end.
FileSize
четко указано, что, когда вы не передаете размер записи вReset
, FileSize вычисляет количество записей по «размеру файла в байтах / 128». Вы уверены, что документация неверна? - person Sertac Akyuz   schedule 24.03.2011