|
#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 мегабайта виртуального адресного пространства не доступны (там насколько я знаю, находятся таблицы страниц, доступные лишь системе). Делалось это именно для отлова нулевых указателей. Поэтому прочешите весь код и посмотрите, где могут быть нулевые (не инициализированные) указатели. Пример: не созданные динамические массивы, объекты, которые уже удалены, но используются и т.д.
jmp $ ; Happy End! The Cake Is A Lie. |
#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 и одновременно считать и читать строки до конца файла, добавляя их куда надо. jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 03.09.2012 в 18:57. |
#9
|
|||
|
|||
Цитата:
|
#10
|
||||
|
||||
С какого перепугу строка стала записью? Запись - это record, фиксированной длины. ФайлСайз не будет считать количество переводов строки. Он может только вызвать API'шный GetFileSize и, при желании, поделить на размер записи. Для текстового записей нет и используются байты.
jmp $ ; Happy End! The Cake Is A Lie. |
Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
qazpos (27.09.2012)
|
#11
|
||||
|
||||
Цитата:
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#12
|
|||
|
|||
задания размера waysmas
>Сообщение от icWasya
>Ну например, не видно задания размера waysmas >13 строка второго кода 13)SetLength (waysmas, nmax); А как это стыкуется с Код:
waysmas: array of array of tzap2; |
Этот пользователь сказал Спасибо icWasya за это полезное сообщение: | ||
qazpos (27.09.2012)
|
#13
|
|||
|
|||
Цитата:
вот и сразу это никто не мог сказать, спасибо, теперь во всем разобрался |