Помогите пожалуйста разобраться. Создаю хэш-таблицу со списками. В конструкторе списка вылетает с ошибкой нарушение доступа.
Прикрепленные файлы
Hash_vocabulary.rar ( 210.11 килобайт )
Кол-во скачиваний: 311
Файл 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;
constructor Class_Hash_Table.Create;
var
i : TIndex;
begin
for i := Low(TIndex) to High(TIndex) do
HT[i] := Class_List.Create; // <--- У тебя было нечто другое ...
end;
похожая проблема возникла в функции поиска в списке, если я при инициализации хэш-таблицы в хэш-ф-ции получаю одинаковые индексы в массиве ( 'мама' и 'книга' оказались в ячейке массива i = 8 ). В списке находится 1 запись, и при добавлении другой, происходит сбой. Это обычный линейный поиск в списке, и вроде логика в последовательности шагов присутствует. Ошибкой моей может быть неправильное описание ?
Прикрепленные файлы
Hash_vocabulary.rar ( 210.71 килобайт )
Кол-во скачиваний: 276
Точную последовательность шагов для получения сбоя опиши (вот запустил я твою программу, и чего? Куда нажать, чтоб сбой своими глазами увидеть?). Ибо у тебя на данный момент что добавление, что поиск - обработчики пустые, ни фига не вызывается.
ой,извини, я не четко сформулировал. При инициализации, хэш-таблица породила коллизию ( 'мама' и 'книга' оказались в ячейке массива i = 8 ).
Блин. И что?
кнопка 'создание' -> выбор файла txt -> бах!
Никакого "бах", отображается пустая форма, и всё
что за магия ! Сделал скришнот, еще раз перезалил архив.
Эскизы прикрепленных изображений
Прикрепленные файлы
Hash_vocabulary.rar ( 210.71 килобайт )
Кол-во скачиваний: 278
Так. Сорри, это мой глюк, я открывал старый файл 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;
ого. Я балбес. Спасибо за помощь !
P.S. к чертям уберу список с заглавным звеном.
У меня возникли 2 проблемы по ходу реализации кода. первая небольшая : не пойму, почему при добавлении слова в файл вылетает ошибка несоответствие типов в proc seek . это из-за того, что у меня текстовый файл, а не типизированный ?
вторая попроблемнее..осуществляю поиск слова в словаре. И по хорошему, поиск должен осуществляться по ключу, правильно ? Связь между кнопкой и файлом реализует proc Search_in_Hash_Table (в un_file) корректна ?
Прикрепленные файлы
Hash_vocabulary.rar ( 220.18 килобайт )
Кол-во скачиваний: 293
подсткажите пожалуйста , есть ли замена proc seek и/или как мне требуется написать алгоритм добавления слова в конец файла ?
P.s. все связал в методе поиска слова. Когда хочу вывести в таблицу поисковое слово с переводом, мне выводит только 1 слово (мама - mother ) . Я так понял , он считывает только 1 запись мою. Как мне сделать что бы с определенной строки печатал ? ии, при поиске слов инжир или яблоко пишет что слово не найдено. Это из-за того что неверно считываются данные с файла, из-за чего так происходит ?
Прикрепленные файлы
Hash_vocabulary.rar ( 221.3 килобайт )
Кол-во скачиваний: 291
спасибо за процедуру. ДЕйствительно работает. Так же исправил неккоректное чтение и вывод в таблицу. Вот только все не пойму как мне считывать из конкретной строки файла? И у меня время от времени выскакивает ошибка , из-за чего так происходит ?
Добавлено через 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;