Главная страница
    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.085 c
15-1176449940
Slider007
2007-04-13 11:39
2007.05.13
С днем рождения ! 13 апреля


15-1176231879
Иксик
2007-04-10 23:04
2007.05.13
Посоветуйте чего-нибудь почитать


15-1176642479
Knight
2007-04-15 17:07
2007.05.13
Смотрю видео через Paint&#133


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


15-1176277952
Kerk
2007-04-11 11:52
2007.05.13
Помогите написать перловый регэксп плиз





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский