|  | 
 
 | 
|  | 
| 
			 
			#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  
			
			
			
			
		 | ||||
| 
 | ||||
|   Цитата: 
 |