Помощь - Поиск - Пользователи - Календарь
Полная версия: инициализация хэша
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
Insomnia
Помогите пожалуйста разобраться. Создаю хэш-таблицу со списками. В конструкторе списка вылетает с ошибкой нарушение доступа.
IUnknown
Файл un_hash:

 constructor Class_Hash_Table.Create;
var
i : TIndex;
begin
for i := Low(TIndex) to High(TIndex) do
HT[i] := Class_List.Create; // <--- У тебя было нечто другое ...
end;

... из-за чего класс не инициализировался правильно, и, естественно, в его конструкторе происходил сбой.
Insomnia
Цитата(IUnknown @ 5.05.2012 17:24) *

Файл un_hash:

 constructor Class_Hash_Table.Create;
var
i : TIndex;
begin
for i := Low(TIndex) to High(TIndex) do
HT[i] := Class_List.Create; // <--- У тебя было нечто другое ...
end;

... из-за чего класс не инициализировался правильно, и, естественно, в его конструкторе происходил сбой.


Спасибо большое ! понял ошибку, исправил , дополнил модуль, заработало !
Insomnia
похожая проблема возникла в функции поиска в списке, если я при инициализации хэш-таблицы в хэш-ф-ции получаю одинаковые индексы в массиве ( 'мама' и 'книга' оказались в ячейке массива i = 8 ). В списке находится 1 запись, и при добавлении другой, происходит сбой. Это обычный линейный поиск в списке, и вроде логика в последовательности шагов присутствует. Ошибкой моей может быть неправильное описание ?
IUnknown
Точную последовательность шагов для получения сбоя опиши (вот запустил я твою программу, и чего? Куда нажать, чтоб сбой своими глазами увидеть?). Ибо у тебя на данный момент что добавление, что поиск - обработчики пустые, ни фига не вызывается.
Insomnia
ой,извини, я не четко сформулировал. При инициализации, хэш-таблица породила коллизию ( 'мама' и 'книга' оказались в ячейке массива i = 8 ).
IUnknown
Блин. И что?
Цитата
В списке находится 1 запись, и при добавлении другой, происходит сбой.
Как сбой увидеть?
Insomnia
кнопка 'создание' -> выбор файла txt -> бах!
IUnknown
Никакого "бах", отображается пустая форма, и всё smile.gif
Insomnia
что за магия ! Сделал скришнот, еще раз перезалил архив.
IUnknown
Так. Сорри, это мой глюк, я открывал старый файл txt...

По поводу твоей программы... Объясни мне, зачем вот эти пляски:
Цитата
 constructor Class_List.Create;
begin
inherited Create;
new(L); // Вот эта пляска зачем?
L^.next := nil;
end;


, и потом, отсюда же вытекает:
Цитата
 function Class_List.search_to_list;
var
p : TList;
begin
result := false;
p := L^.next; // Вот это непонятное действие.
while assigned (p) do
begin
if p^.info.russian <> arussian then
p := p^.next
else
result := true;
end;
end;

Смотри, насколько все проще (и, что характерно, сбоев не вызывает):

 constructor Class_List.Create;
begin
inherited Create;
L := nil; // Ну ПУСТОЙ же список после создания экземпляра класса !!!
end;

// во втором месте:
function Class_List.search_to_list;
var
p : TList;
begin
result := false;
p := L; // А раз список был пустой - то и начинаем с начала
while assigned (p) do
begin
if p^.info.russian <> arussian then
p := p^.next
else
result := true;
end;
end;


А ты чего делал? Создавал список с заглавным (заметь, неинициализированным!!!) звеном, потом добавлял объекты в начало списка (в Class_List.add_to_list, посмотри внимательно, новый-то элемент добавляется ПЕРЕД существующими, а не ПОСЛЕ), а потом, думая, что надо пропустить заглавный элемент, ты пропускал инициализированные данные, и начинал работать с мусором. Вот тебе и глюки. Так что либо выкинь заглавное звено, либо добавляй данные в конец списка.
Insomnia
ого. Я балбес. Спасибо за помощь ! good.gif
P.S. к чертям уберу список с заглавным звеном.
Insomnia
У меня возникли 2 проблемы по ходу реализации кода. первая небольшая : не пойму, почему при добавлении слова в файл вылетает ошибка несоответствие типов в proc seek . это из-за того, что у меня текстовый файл, а не типизированный ?
вторая попроблемнее..осуществляю поиск слова в словаре. И по хорошему, поиск должен осуществляться по ключу, правильно ? Связь между кнопкой и файлом реализует proc Search_in_Hash_Table (в un_file) корректна ?
IUnknown
Цитата
это из-за того, что у меня текстовый файл, а не типизированный ?
Абсолютно точно. Seek не умеет работать с текстовыми файлами, только с типизированными или бестиповыми.

Со второй проблемой - вроде все верно, но зачем ты i := Obj.H; делаешь в Search_in_Hash_Table - непонятно.
Insomnia
подсткажите пожалуйста , есть ли замена proc seek и/или как мне требуется написать алгоритм добавления слова в конец файла ?
P.s. все связал в методе поиска слова. Когда хочу вывести в таблицу поисковое слово с переводом, мне выводит только 1 слово (мама - mother ) . Я так понял , он считывает только 1 запись мою. Как мне сделать что бы с определенной строки печатал ? ии, при поиске слов инжир или яблоко пишет что слово не найдено. Это из-за того что неверно считываются данные с файла, из-за чего так происходит ?
IUnknown
Цитата(Insomnia @ 7.05.2012 16:16) *
есть ли замена proc seek
Есть. Файл открыва5ется не через Reset, а через Append

Цитата(Insomnia @ 7.05.2012 16:16) *
Когда хочу вывести в таблицу поисковое слово с переводом, мне выводит только 1 слово
Тебе повезло. Мне вообще ничего не выводит. Версия Дельфи = 2009 (Юникодная), поэтому вся твоя работа со строками через TString летит к чертям. Проверять правильность/неправильность чего-либо не могу...
Insomnia
спасибо за процедуру. ДЕйствительно работает. Так же исправил неккоректное чтение и вывод в таблицу. Вот только все не пойму как мне считывать из конкретной строки файла? И у меня время от времени выскакивает ошибка Нажмите для просмотра прикрепленного файлаНажмите для просмотра прикрепленного файла, из-за чего так происходит ?

Добавлено через 5 мин.

procedure TForm1.add_wordClick(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
StringGrid_All.Visible := false;
Panel_words.Visible := true;
file_name := OpenDialog1.FileName
end
end;


procedure TForm1.bb_seach_okClick(Sender: TObject);
var
english, russian : TString;
obj : TWord;
f : TextFile;
begin

Panel_words.Visible := false;
Panel_seach_word.Visible := False;
russian := Ed_searh.Text;
if Search_in_Hash_Table(russian, HT_File) then
begin
MessageDlg('Слово найдено!!!', mtInformation, [mbOk], 0);
StringGrid_All.Visible := true;
assignfile(f, OpenDialog1.FileName);
reset(f);
Readln(f, russian); // я считываю только 1 строку в файле ?
Readln(f, english);
if not eof(f) then readln(f);
Obj := TWord.Create(russian, english);
SetCells(StringGrid_All, Obj, 1); // вносим данные в таблицу
end
else
MessageDlg('Слово не найдено!!!', mtInformation, [mbOk], 0)
end;

Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.