Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.09.2012, 11:16
qazpos qazpos вне форума
Прохожий
 
Регистрация: 02.09.2012
Сообщения: 5
Репутация: 10
По умолчанию Непонятная ошибка

Мб оффтоп, но больше не нашел куда написать.
При запуске программа выдает следующую ошибку:
Проект 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.
Далее при попытке выхода из второй формы при помощи своей кнопки выдает ту же ошибку, из формы не выходит, но указывает на "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  
Старый 02.09.2012, 11:39
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Ошибка "Access violation блаблабла чтение из адреса 00000000" означает чтение из нулевого указателя. В винде первые 4 мегабайта виртуального адресного пространства не доступны (там насколько я знаю, находятся таблицы страниц, доступные лишь системе). Делалось это именно для отлова нулевых указателей. Поэтому прочешите весь код и посмотрите, где могут быть нулевые (не инициализированные) указатели. Пример: не созданные динамические массивы, объекты, которые уже удалены, но используются и т.д.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #3  
Старый 03.09.2012, 10:38
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Ну например, не видно задания размера waysmas
Ответить с цитированием
  #4  
Старый 03.09.2012, 15:06
qazpos qazpos вне форума
Прохожий
 
Регистрация: 02.09.2012
Сообщения: 5
Репутация: 10
По умолчанию

Цитата:
Сообщение от icWasya
Ну например, не видно задания размера waysmas
13 строка второго кода
Ответить с цитированием
  #5  
Старый 03.09.2012, 15:19
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от qazpos
В обработчике обоих событий открытия главной формы и закрытия второй один и тот же код:
А если убрать этот код ошибка появляется? И где объявления переменных (например str)?
В каком-то месте программы, у тебя происходит запись данных в "чужое место", просто ошибка вываливается в другом месте (чуть позже, когда нарушение структуры данных становится явным).
Ответить с цитированием
  #6  
Старый 03.09.2012, 16:33
qazpos qazpos вне форума
Прохожий
 
Регистрация: 02.09.2012
Сообщения: 5
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
А если убрать этот код ошибка появляется? И где объявления переменных (например str)?
Я немного переписал и дописал код, исключил возможность обработки пустых файлов:
Код:
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;
Если убрать код, то ошибка не появляется. Скажу больше, ошибка не появляется, если убрать 93 и 94 строки

Последний раз редактировалось qazpos, 03.09.2012 в 16:36.
Ответить с цитированием
  #7  
Старый 03.09.2012, 17:03
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от qazpos
Я немного переписал и дописал код, исключил возможность обработки пустых файлов:
Код:
...
    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;
...
Мне вот это место немного непонятно. Ты переменной nmax присваиваешь размер файла в байтах, а потом в цикле пытаешься прочесть из него nmax строк? Откуда у файла размером например 100 байт возмётся 100 строк?
Ответить с цитированием
  #8  
Старый 03.09.2012, 18:53
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
Откуда у файла размером например 100 байт возмётся 100 строк?
Ну если перевод строки отмечать одним символом #13, и сделать 100 переводов строк, то как раз.
Не проще сделать TStringList.LoadFromFile вместо всего этого цикла? Понятное дело, что там внутри все равно похожий цикл, но он там однозначно рабочий. Если хочется самому - можно использовать eof и одновременно считать и читать строки до конца файла, добавляя их куда надо.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 03.09.2012 в 18:57.
Ответить с цитированием
  #9  
Старый 03.09.2012, 21:15
qazpos qazpos вне форума
Прохожий
 
Регистрация: 02.09.2012
Сообщения: 5
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
Мне вот это место немного непонятно. Ты переменной nmax присваиваешь размер файла в байтах, а потом в цикле пытаешься прочесть из него nmax строк? Откуда у файла размером например 100 байт возмётся 100 строк?
Как говорил препод, и как я гуглил уже после, функция FileSize возвращает размер файла в записях, т.е. кол-во записей в файле, в данном случае - строк. Но попробую без нее.
Ответить с цитированием
  #10  
Старый 03.09.2012, 21:18
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

С какого перепугу строка стала записью? Запись - это record, фиксированной длины. ФайлСайз не будет считать количество переводов строки. Он может только вызвать API'шный GetFileSize и, при желании, поделить на размер записи. Для текстового записей нет и используются байты.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
Этот пользователь сказал Спасибо Bargest за это полезное сообщение:
qazpos (27.09.2012)
  #11  
Старый 03.09.2012, 22:11
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Цитата:
Сообщение от qazpos
... т.е. кол-во записей в файле, в данном случае - строк...
Если уж так нужно читать строки, то что мешает использовать ReadLn?
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #12  
Старый 04.09.2012, 09:39
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию задания размера waysmas

>Сообщение от icWasya
>Ну например, не видно задания размера waysmas

>13 строка второго кода
13)SetLength (waysmas, nmax);
А как это стыкуется с
Код:
 waysmas: array of array of tzap2; 
Массив двумерный, а задаёте только один размер
Ответить с цитированием
Этот пользователь сказал Спасибо icWasya за это полезное сообщение:
qazpos (27.09.2012)
  #13  
Старый 27.09.2012, 13:25
qazpos qazpos вне форума
Прохожий
 
Регистрация: 02.09.2012
Сообщения: 5
Репутация: 10
По умолчанию

Цитата:
Сообщение от icWasya
Массив двумерный, а задаёте только один размер

вот и сразу это никто не мог сказать, спасибо, теперь во всем разобрался
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:40.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter