Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.05.2011, 10:07   #1
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
Вопрос Непонятный Access Violation

Проблема проста : возникает access violation, не могу понять из-за чего.
Код:
procedure TForm1.FormActivate(Sender: TObject);
begin
      If FileExists('base.rte') Then MyLoadFromFile;
end;

procedure TForm1.MyLoadFromFile;
var
    F : TextFile;
    S : String;
    i : Integer;
begin
      count:=0;
      AssignFile(F,'base.rte');
      Reset(F);
      While Not Eof(F) Do
      Begin
            Readln(F,S);
            If UpperCase(S) = 'NAME' Then
            Begin
                  count:=count+1;
                  Readln(F,S);
                  Main[count].Name:=S;
                  Readln(F,S);
                  While UpperCase(S) <> 'NAME' Do
                  Begin
                        Main[count].n:=Main[count].n+1;
                        Main[count].Urs[Main[count].n]:=S;
                        Readln(F,S);
                  End;
            End;
      End;
      CloseFile(F);
      For i:=1 to count Do
      Begin
            ListBox1.Items.Add(Main[i].Name);
      End;
      current:=0;
      ShowUrs;
end;
Почему же?
_-Re@l-_ вне форума Ответить с цитированием
Старый 07.05.2011, 10:21   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

код неполный!!
1) где описание массива Main?

2) что такое процедура ShowUrs

3) ListBox1 - кинут на форму в DesingTime? или создаётся динамически?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.05.2011, 10:22   #3
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Кто такой Main?
p51x вне форума Ответить с цитированием
Старый 07.05.2011, 10:26   #4
Valio
Сливочное масло
Участник клуба
 
Аватар для Valio
 
Регистрация: 01.01.2011
Сообщений: 1,149
По умолчанию

Если Main это массив, то надо проверить не получится ли так что

Код:
If UpperCase(S) = 'NAME' Then
            Begin
                  count:=count+1;
                  Readln(F,S);
                  Main[count].Name:=S;
На этой строке произойдёт выход за его пределы.

Ну и какбы обычно такие вещи решаются бряками или на худой конец посредством ShowMessage.
Сливочное масло Valio - компиляция как по маслу
Valio вне форума Ответить с цитированием
Старый 07.05.2011, 11:38   #5
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Такие вещи в первую очередь решаются включением опции Range Check Errors (не забываем сделать Build проекту после изменения опции) - а уж потом всё остальное.

http://www.gunsmoker.ru/2009/05/access-violation.html
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 07.05.2011, 12:00   #6
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Вот весь код:
Код:
unit Physics;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, XPMan;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Label1: TLabel;
    Button1: TButton;
    Label2: TLabel;
    Label3: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Label4: TLabel;
    RadioGroup1: TRadioGroup;
    Button2: TButton;
    XPManifest1: TXPManifest;
    Button3: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure ListBox1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure MyLoadFromFile;
    procedure ShowUrs;
  end;

type
     Formula = packed record
     Urs : array[1..100] of String;
     Name : String;
     n : Integer;
end;

var
  Form1: TForm1;
  Main : array[1..1000] of Formula;
  count : Integer;
  current : Integer;
  myNew : Boolean;

implementation

{$R *.dfm}

procedure TForm1.MyLoadFromFile;
var
    F : TextFile;
    S : String;
    i : Integer;
begin
      count:=0;
      AssignFile(F,'base.rte');
      Reset(F);
      While Not Eof(F) Do
      Begin
            Readln(F,S);
            If UpperCase(S) = 'NAME' Then
            Begin
                  count:=count+1;
                  Readln(F,S);
                  Main[count].Name:=S;
                  Readln(F,S);
                  While (UpperCase(S) <> 'NAME') or
                        (not Eof(F)) Do
                  Begin
                        Main[count].n:=Main[count].n+1;
                        Main[count].Urs[Main[count].n]:=S;
                        Readln(F,S);
                  End;
            End;
      End;
      CloseFile(F);
      For i:=1 to count Do
      Begin
            ListBox1.Items.Add(Main[i].Name);
      End;
      current:=0;
      ShowUrs;
end;


procedure TForm1.ShowUrs;
var
    i : Integer;
begin
      ListBox1.ItemIndex:=current;
      RadioGroup1.Items.Clear;
      for i:=1 to Main[current+1].n do
      begin
            RadioGroup1.Items.Add(Main[current+1].Urs[i]);
      end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var t : Integer;
begin
      if myNew then
      begin
            count:=count+1;
            Main[count].Name:=Edit1.Text;
            Main[count].Urs[1]:=Edit2.Text;
            Main[count].n:=1;
            ListBox1.Items.Add(Main[count].Name);
            Edit1.Clear;
            Edit2.Clear;
            current:=count-1;
            ShowUrs;
      end
      else
      begin
            myNew:=True;
            Main[current+1].n:=Main[current+1].n+1;
            t:=Main[current+1].n;
            Main[current+1].Urs[t]:=Edit2.Text;
            Edit1.Clear;
            Edit2.Clear;
            ShowUrs;
      end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
      myNew:=False;
      Edit1.Text:=Main[current+1].Name;
      Edit2.Clear;
      Edit2.SetFocus;
end;

procedure TForm1.ListBox1Click(Sender: TObject);
begin
      current:=ListBox1.ItemIndex;
      ShowUrs;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
      myNew:=True;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
       If FileExists('base.rte') Then MyLoadFromFile;
end;

end.
При таком варианте кода тоже даёт Access Violation.

Последний раз редактировалось _-Re@l-_; 07.05.2011 в 12:02.
_-Re@l-_ вне форума Ответить с цитированием
Старый 07.05.2011, 12:09   #7
Valio
Сливочное масло
Участник клуба
 
Аватар для Valio
 
Регистрация: 01.01.2011
Сообщений: 1,149
По умолчанию

Код:
Main : array[1..1000] of Formula;
Это не о чём не говорит. В файле может быть 2000 записей.

Ставь бряки, локализуй ошибку.
Сливочное масло Valio - компиляция как по маслу
Valio вне форума Ответить с цитированием
Старый 07.05.2011, 12:15   #8
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Хах, а вы знаете, я нашёл ошипку.
Смотрим сюда:
Код:
  
While (UpperCase(S) <> 'NAME') or
                        (not Eof(F)) Do
Вроде бы на первый взгляд всё нормально, вот только такой цикл бесконечный - если UpperCase(S) <> 'Name', то цикл продолжается, если Eof(F) = False, то цикл тоже продолжается - в общем, получается, что хотя бы одно из условий всегда равно True, и получается бесконечный цикл.
Чтобы избавиться от этого, делаем так:
Код:
While (UpperCase(S) <> 'NAME')  Do
Begin
        Main[count].n:=Main[count].n+1;
        Main[count].Urs[Main[count].n]:=S;
        If Eof(F) Then Break;
        Readln(F,S);
End;
И всё! Access Violation исчезает, и всё работает.

P.S. Хотя, по правде говоря, логические ошибки всё равно в программе есть..

Последний раз редактировалось _-Re@l-_; 07.05.2011 в 12:28.
_-Re@l-_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Access violation at address... KoBRaAndrey Общие вопросы Delphi 4 12.03.2011 18:23
Delphi - непонятный access violation KingOfNothing Помощь студентам 7 03.11.2009 00:46
Access Violation SunKnight Общие вопросы Delphi 2 05.06.2008 16:46
Access Violation Carbon Общие вопросы Delphi 12 18.09.2007 19:55