Форум: "Начинающим";
Текущий архив: 2007.05.13;
Скачать: [xml.tar.bz2];
ВнизОшибка при создании объекта Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.085 c