Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > access violation


Автор: freek 20.2.2010, 22:00
Есть два юнита.. сответственно в одном описан класс в другом идет его вызов. привожу их коды
Код

unit Unit2;

interface
  type str=string[20];

Telement=record
fam:str;
kniga:str;
shifr:str;
god:integer;
kolvo:integer;
end;

mas=array of Telement;
ff=file of Telement;

Tavtor=class
 pv,nv:mas;
 m,n:integer;
 constructor create(a:integer);
 destructor Destroy;
 procedure poisk(familia: str);
 procedure insert(var pp:mas;var k:integer; zapis:Telement);
 procedure sort(var pp:mas);
 end;

 var f:ff;
 fname:string;

implementation

constructor tavtor.create(a:integer);
        begin
        setlength(pv,a);
        end;
Destructor Tavtor.destroy;
        begin
        setlength(pv,0);
        inherited destroy;
        end;



procedure tavtor.insert(var pp:mas; var k:integer;zapis:telement);
begin
k:=k+1;
setlength(pp,k);
pp[k]:=zapis;
end;

end.




Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Menus, Grids,Unit2;

type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    StringGrid1: TStringGrid;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    N7: TMenuItem;
    N8: TMenuItem;
    OpenDialog1: TOpenDialog;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure N3Click(Sender: TObject);
    procedure N5Click(Sender: TObject);
    procedure N6Click(Sender: TObject);
    procedure N7Click(Sender: TObject);
    procedure N8Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
   te:tavtor;
   f:ff;
   z:telement;
   fname:string;

implementation

 uses Unit3, Unit4;


{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
te:=tavtor.create(0);
fname:='date.lib';
assignfile(f,Fname);
end;


procedure TForm1.N8Click(Sender: TObject);
var dd:telement;
begin
form4.ShowModal;
if form4.ModalResult=mrok then
begin
dd.fam:=form4.Edit1.Text;
dd.kniga:=form4.Edit2.Text;
dd.shifr:=form4.Edit3.Text;
dd.god:=strtoint(form4.Edit4.Text);
dd.kolvo:=strtoint(form4.Edit5.Text);
end;
form4.Close;
te.insert(te.pv,te.m,dd);
seek(f,filesize(f));
write(f,dd);
closefile(f);
end;
end.


при вызове TForm1.N8Click происходят вот такого типа ошибки 

Project C:\Program Files\Borland\Delphi6\Proiects\bibliotek3\Projectl.exe faulted with message: 'access violation at 0x7c90e8e7: write of address 0x00030ffc". Process Stopped. Use Step or Run to continue. 

Дебагер показал что затык начинается со строки seek(f,filesize(f));

Что делаю не так??? я так понимаю что судя по типу ошибки идет обращение к несуществующему объекту в памяти... В общем что я где не так сделал?

P/S: Данное творение не мое, а набранный пример  из методички для изучения ООП. Но как видно что-то либо упущенно либо неправильно написано.


Автор: DarkProg 21.2.2010, 00:19
Я не уверен, но у тебя в двух модулях есть глобальная переменная f объявлення дважды , посмотри зачем тебе нужна эта переменная и убери её в одном из объявлений.

Автор: freek 21.2.2010, 02:00
Цитата

Я не уверен, но у тебя в двух модулях есть глобальная переменная f объявлення дважды , посмотри зачем тебе нужна эта переменная и убери её в одном из объявлений.

Не помагает (

Автор: CodeMonkey 21.2.2010, 13:25
assignfile - вижу. Reset или Rewrite - не вижу.

P.S. ООП тут не при чём.

Автор: freek 21.2.2010, 16:05
Цитата

assignfile - вижу. Reset или Rewrite - не вижу.

Добавил: reset(f);

Теперь
Код

procedure TForm1.N8Click(Sender: TObject);
var dd:telement;
begin
reset(f);
form4.ShowModal;
if form4.ModalResult=mrok then
begin
dd.fam:=form4.Edit1.Text;
dd.kniga:=form4.Edit2.Text;
dd.shifr:=form4.Edit3.Text;
dd.god:=strtoint(form4.Edit4.Text);
dd.kolvo:=strtoint(form4.Edit5.Text);
end;
form4.Close;
te.insert(te.pv,te.m,dd);
seek(f,filesize(f));
write(f,dd);
closefile(f);
end;
end.


Но ошибка всё таже.. хотя в файл уже и данные записались и дебагер проходит дальше...

Цитата

P.S. ООП тут не при чём.


Это я уже догадался но вот не легче стало  smile 

Автор: freek 26.2.2010, 21:35
РЕбят больше никаких мыслей нет???

 smile  подскажите где взять хороший пример для изучения классов...???

Автор: DarkProg 26.2.2010, 21:51
Цитата(freek @  26.2.2010,  21:35 Найти цитируемый пост)
подскажите где взять хороший пример для изучения классов...??? 


В библиотеке(если ты студент то в Вузовской должна быть хотя бы одна книжка) возьми штук 5 книг, где тебе кажется что в этих книгах написано понятным языком и посвяти сему делу один полноценный рабочий день(у меня ушло ровно столько smile )

А если ты не студент ищи людей у которых есть книги по данной тематике или покупай сам(у меня книжек по программированию уже почти полка и хочу ещё smile )

Добавлено через 2 минуты и 52 секунды
Цитата(freek @  21.2.2010,  16:05 Найти цитируемый пост)
Но ошибка всё таже.. хотя в файл уже и данные записались и дебагер проходит дальше...


Ну воспользуйся трассировкой вручную, поставь бряки в начале каждой функции и иди по шагам, место где происходит косяк ты найдёшь, а оттуда уже смотри где косячит

Автор: freek 26.2.2010, 22:10
насчет книг не солгашусь..  Книги это больно общно... хотелось бы конкретики.. любую можно в инете  скачать.. вот только пока полную не видел.. везде в скользь об ООП говорят и все без особых примеров... 

Цитата

Дебагер показал что затык начинается со строки seek(f,filesize(f));


а вот почему это затык я не догоняю пока еще...


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)