Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.041 c
2-1177061949
_Илья
2007-04-20 13:39
2007.05.13
Кодировка строк


2-1175758467
iviom
2007-04-05 11:34
2007.05.13
Footer в DBGridEh


15-1176566435
Kerk
2007-04-14 20:00
2007.05.13
Письма счастья


15-1176097410
Девушка
2007-04-09 09:43
2007.05.13
Итеративный ЖЦ разработки


4-1166094492
niko
2006-12-14 14:08
2007.05.13
Создание окна в потоке с помощью ф-й WINAPI (в dll)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский