![]() |
|
|
#1
|
|||
|
|||
|
Мб оффтоп, но больше не нашел куда написать.
При запуске программа выдает следующую ошибку: Проект Project1.exe вызвал исключение класса EAccessViolation с сообщением 'Acceass violation at adres 00404832 in module 'Project1.exe. Read adress 00000000'. Процесс остановленю Используйте Шаг или Запуск для продолжения. Нажимаю "ОК", и программа запускается. Указывает на 13 строку: Код:
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
Application.Run;
end.В обработчике обоих событий открытия главной формы и закрытия второй один и тот же код: Код:
assignfile (townsfile, 'Towns');
assignfile (waysfile, 'Ways');
if not FileExists ('Towns') then
rewrite (townsfile)
else
reset (townsfile);
if not FileExists ('Ways') then
rewrite (waysfile)
else
reset (waysfile);
nmax:=filesize (townsfile);
SetLength (townsmas, nmax);
SetLength (waysmas, nmax);
nmax:=nmax-1;
for i:=0 to nmax do
begin
readln (townsfile, str);
townsmas [i]:=str;
end;
sluzh.NalWay:=false;
sluzh.price:=0;
sluzh.time.dd:=0;
sluzh.time.hh:=0;
sluzh.time.mm:=0;
for num1:=0 to nmax do
for num2:=0 to nmax do
waysmas[num1,num2]:=sluzh;
while not eof (waysfile) do
begin
num1:=-1;
num2:=-1;
read (waysfile, way);
for i:=0 to nmax do
begin
if way.town1=townsmas[i] then
num1:=i;
if way.town2=townsmas[i] then
num2:=i;
end;
if num1>=0 then
begin
waysmas[num1,num2].NalWay:=true;
waysmas[num1,num2].price:=way.price;
waysmas[num1,num2].time:=way.time;
end;
end;
closefile (townsfile);
closefile (waysfile);
combobox1.Text:=townsmas[0];
combobox2.Text:=townsmas[0]; |
|
#2
|
||||
|
||||
|
Ошибка "Access violation блаблабла чтение из адреса 00000000" означает чтение из нулевого указателя. В винде первые 4 мегабайта виртуального адресного пространства не доступны (там насколько я знаю, находятся таблицы страниц, доступные лишь системе). Делалось это именно для отлова нулевых указателей. Поэтому прочешите весь код и посмотрите, где могут быть нулевые (не инициализированные) указатели. Пример: не созданные динамические массивы, объекты, которые уже удалены, но используются и т.д.
|
|
#3
|
|||
|
|||
|
Ну например, не видно задания размера waysmas
|
|
#4
|
|||
|
|||
|
Цитата:
|
|
#5
|
||||
|
||||
|
Цитата:
В каком-то месте программы, у тебя происходит запись данных в "чужое место", просто ошибка вываливается в другом месте (чуть позже, когда нарушение структуры данных становится явным). |
|
#6
|
|||
|
|||
|
Цитата:
Код:
type
Ttime = record
dd,hh,mm:byte;
end;
Tzap1 = record
town1,town2:string [30];
price:integer;
time:Ttime;
end;
Tzap2 = record
NalWay:boolean;
price:integer;
time:Ttime;
end;
public
townsfile: TextFile;
waysfile: File of Tzap1;
townsmas: array of string [30];
waysmas: array of array of tzap2;
end;
var
Form1: TForm1;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var nmax,i,num1,num2:integer;
str:string;
way:Tzap1;
sluzh:tzap2;
begin
assignfile (townsfile, 'Towns');
assignfile (waysfile, 'Ways');
if not FileExists ('Towns') then
begin
rewrite (townsfile);
closefile (townsfile);
end;
reset (townsfile);
if not FileExists ('Ways') then
begin
rewrite (waysfile);
closefile (waysfile);
end;
reset (waysfile);
if not eof (townsfile) then
begin
nmax:=filesize (townsfile);
SetLength (townsmas, nmax);
SetLength (waysmas, nmax);
nmax:=nmax-1;
for i:=0 to nmax do
begin
readln (townsfile, str);
townsmas [i]:=str;
end;
combobox1.Items.LoadFromFile('towns');
combobox2.Items.LoadFromFile('towns');
sluzh.NalWay:=false;
sluzh.price:=0;
sluzh.time.dd:=0;
sluzh.time.hh:=0;
sluzh.time.mm:=0;
for num1:=0 to nmax do
for num2:=0 to nmax do
waysmas[num1,num2]:=sluzh;
while not eof (waysfile) do
begin
num1:=-1;
num2:=-1;
read (waysfile, way);
for i:=0 to nmax do
begin
if way.town1=townsmas[i] then
num1:=i;
if way.town2=townsmas[i] then
num2:=i;
end;
if num1>=0 then
begin
waysmas[num1,num2].NalWay:=true;
waysmas[num1,num2].price:=way.price;
waysmas[num1,num2].time:=way.time;
end;
end;
combobox1.Text:=townsmas[0];
combobox2.Text:=townsmas[0];
end;
closefile (townsfile);
closefile (waysfile);
end;Последний раз редактировалось qazpos, 03.09.2012 в 16:36. |
|
#7
|
||||
|
||||
|
Цитата:
|
|
#8
|
||||
|
||||
|
Цитата:
![]() Не проще сделать TStringList.LoadFromFile вместо всего этого цикла? Понятное дело, что там внутри все равно похожий цикл, но он там однозначно рабочий. Если хочется самому - можно использовать eof и одновременно считать и читать строки до конца файла, добавляя их куда надо. Последний раз редактировалось Bargest, 03.09.2012 в 18:57. |
|
#9
|
|||
|
|||
|
Цитата:
|
|
#10
|
||||
|
||||
|
С какого перепугу строка стала записью? Запись - это record, фиксированной длины. ФайлСайз не будет считать количество переводов строки. Он может только вызвать API'шный GetFileSize и, при желании, поделить на размер записи. Для текстового записей нет и используются байты.
|
| Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
qazpos (27.09.2012)
| ||
|
#11
|
||||
|
||||
|
Цитата:
|
|
#12
|
|||
|
|||
|
>Сообщение от icWasya
>Ну например, не видно задания размера waysmas >13 строка второго кода 13)SetLength (waysmas, nmax); А как это стыкуется с Код:
waysmas: array of array of tzap2; |
| Этот пользователь сказал Спасибо icWasya за это полезное сообщение: | ||
qazpos (27.09.2012)
| ||
|
#13
|
|||
|
|||
|
Цитата:
вот и сразу это никто не мог сказать, спасибо, теперь во всем разобрался |