Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.05.13;
Скачать: CL | DM;

Вниз

Ошибка при создании объекта   Найти похожие ветки 

 
inoc ©   (2007-04-19 20:13) [0]

Доброго времени суток! Снова ламерский вопрос, но что-то не врубаюсь. Вот такой код. При выполнении Create на GetMem выбрасывает ошибку AccessViolation. Может пропустил чего?

Type
 TCustomers = record
   FIO: string[40];// Поле ф.и.о.
   Adress: string[40];// Поле адреса
   DatPost : TDateTime; // Поле даты постановки на учет
 end;

 PHash=^TCust;

 TCust=record
   Inf:TCustomers;
   A:PHash;
 end;

 Arr=array[0..10] of PHash;
 PArr=^Arr;

 HashTableClass=class
M:WOrd;P:PHash;H:PArr;
   public
     constructor Create(M:WOrd);
     destructor Free(M:Word);
     procedure Add(Inf:TCustomers);
 end;
const CHash:TDateTime=35065;
var i,x:integer;
implementation

constructor HashTableClass.Create(M:Word);
var l:byte;
begin
 inherited create;

 l:=SizeOf(PHash);
 GetMem(H,4*M*l);
 for i:=0 to M-1 do H[i]:=Nil;
end;

destructor HashTableClass.Free(M:Word);
begin
inherited Destroy;
end;

procedure HashTableClass.Add(Inf:TCustomers);
begin

x:=DaysBetween(Inf.DatPost,CHash); //Спасибо Бакнеллу ;)
i:=x mod M; // Хэш-функция
New(P);P^.Inf:=Inf; // Добавление элемента в стека
P^.A:=H[i]; // с вершиной H[i]
H[i]:=P;
end;


 
ЮЮ ©   (2007-04-20 04:49) [1]

> При выполнении Create

осталось привести вызов Create. Ибо некоторые его делают так:

var
 ht: HashTableClass;
begin
 ht.Create(10);


з.ы. Прежде чем писать, прочти что-нибудь об оформлении кода. Такое читать без слёз невозможно.


 
icWasya ©   (2007-04-20 09:59) [2]

и почему  четыре в
 GetMem(H,4*M*l);


 
ЮЮ ©   (2007-04-20 10:03) [3]

> и почему  четыре в

четырехкратный запас прочности :)


 
ANB ©   (2007-04-20 10:32) [4]

1. Если действительно падает на GetMem, то это значит что объект к этому времени не создался (можно проверить переменную Self а так же сам GetMem только не в поле объекта, а в локальный указатель).
2. Глубоко сомневаюсь, что предковый деструктор что нибудь знает о полях-указателях и чистит выделенную им память.
3. А почему Destroy то ?


 
inoc ©   (2007-04-20 10:35) [5]


> осталось привести вызов Create. Ибо некоторые его делают
> так:
>
> var
>  ht: HashTableClass;
> begin
>  ht.Create(10);
>
> з.ы. Прежде чем писать, прочти что-нибудь об оформлении
> кода. Такое читать без слёз невозможно.


Сорри - только начинаю :(
Вызов именно такой Ht.Create(M) - M - количество записей. Заметил, что если ht - глобальная переменная, то ошибка обязательно, иначе - при определенных значениях M.


 
ANB ©   (2007-04-20 10:52) [6]


> Ht.Create(M)

Ээээ. Это вообще компиляется ? Может рановато лезть сразу в указатели, а сначала на кошечках потренироваться с ОПП отдельно, с памятью отдельно ?


 
ЮЮ ©   (2007-04-20 11:03) [7]

Ht := THashTableClass.Create(M);

P.S. Ну нарисуй, будь добр, буковку T в начале имени класса. Народ к этому уже привык. Жалкие record называешь Txxx, а класс - обделил.


 
inoc ©   (2007-04-20 11:04) [8]


> Ээээ. Это вообще компиляется ? Может рановато лезть сразу
> в указатели, а сначала на кошечках потренироваться с ОПП
> отдельно, с памятью отдельно ?


Хм, компиляется. Гм, даже работает...иногда :(


 
inoc ©   (2007-04-20 11:08) [9]


> Ht := THashTableClass.Create(M);

Упс....Торможу...Спасибо



Страницы: 1 вся ветка

Текущий архив: 2007.05.13;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.531 c
4-1166102906
gary
2006-12-14 16:28
2007.05.13
Hook


2-1177284822
rosl
2007-04-23 03:33
2007.05.13
запрос SQL


1-1173878577
Choco
2007-03-14 16:22
2007.05.13
не разрешить вставку дубрирующей записи в БД


2-1176960209
allucard
2007-04-19 09:23
2007.05.13
Печать документа


4-1166032651
P@r@zit
2006-12-13 20:57
2007.05.13
Информатика