Помогите пожалуйста разобраться. Создаю хэш-таблицу со списками. В конструкторе списка вылетает с ошибкой нарушение доступа.
IUnknown
5.05.2012 20: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
5.05.2012 20:45
Цитата(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;
... из-за чего класс не инициализировался правильно, и, естественно, в его конструкторе происходил сбой.
похожая проблема возникла в функции поиска в списке, если я при инициализации хэш-таблицы в хэш-ф-ции получаю одинаковые индексы в массиве ( 'мама' и 'книга' оказались в ячейке массива i = 8 ). В списке находится 1 запись, и при добавлении другой, происходит сбой. Это обычный линейный поиск в списке, и вроде логика в последовательности шагов присутствует. Ошибкой моей может быть неправильное описание ?
IUnknown
6.05.2012 2:34
Точную последовательность шагов для получения сбоя опиши (вот запустил я твою программу, и чего? Куда нажать, чтоб сбой своими глазами увидеть?). Ибо у тебя на данный момент что добавление, что поиск - обработчики пустые, ни фига не вызывается.
Insomnia
6.05.2012 2:38
ой,извини, я не четко сформулировал. При инициализации, хэш-таблица породила коллизию ( 'мама' и 'книга' оказались в ячейке массива i = 8 ).
IUnknown
6.05.2012 2:46
Блин. И что?
Цитата
В списке находится 1 запись, и при добавлении другой, происходит сбой.
Как сбой увидеть?
Insomnia
6.05.2012 2:50
кнопка 'создание' -> выбор файла txt -> бах!
IUnknown
6.05.2012 3:02
Никакого "бах", отображается пустая форма, и всё
Insomnia
6.05.2012 3:18
что за магия ! Сделал скришнот, еще раз перезалил архив.
IUnknown
6.05.2012 3:36
Так. Сорри, это мой глюк, я открывал старый файл 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
6.05.2012 3:46
ого. Я балбес. Спасибо за помощь ! P.S. к чертям уберу список с заглавным звеном.
Insomnia
6.05.2012 18:53
У меня возникли 2 проблемы по ходу реализации кода. первая небольшая : не пойму, почему при добавлении слова в файл вылетает ошибка несоответствие типов в proc seek . это из-за того, что у меня текстовый файл, а не типизированный ? вторая попроблемнее..осуществляю поиск слова в словаре. И по хорошему, поиск должен осуществляться по ключу, правильно ? Связь между кнопкой и файлом реализует proc Search_in_Hash_Table (в un_file) корректна ?
IUnknown
6.05.2012 21:42
Цитата
это из-за того, что у меня текстовый файл, а не типизированный ?
Абсолютно точно. Seek не умеет работать с текстовыми файлами, только с типизированными или бестиповыми.
Со второй проблемой - вроде все верно, но зачем ты i := Obj.H; делаешь в Search_in_Hash_Table - непонятно.
Insomnia
7.05.2012 20:16
подсткажите пожалуйста , есть ли замена proc seek и/или как мне требуется написать алгоритм добавления слова в конец файла ? P.s. все связал в методе поиска слова. Когда хочу вывести в таблицу поисковое слово с переводом, мне выводит только 1 слово (мама - mother ) . Я так понял , он считывает только 1 запись мою. Как мне сделать что бы с определенной строки печатал ? ии, при поиске слов инжир или яблоко пишет что слово не найдено. Это из-за того что неверно считываются данные с файла, из-за чего так происходит ?
IUnknown
7.05.2012 20:48
Цитата(Insomnia @ 7.05.2012 16:16)
есть ли замена proc seek
Есть. Файл открыва5ется не через Reset, а через Append
Цитата(Insomnia @ 7.05.2012 16:16)
Когда хочу вывести в таблицу поисковое слово с переводом, мне выводит только 1 слово
Тебе повезло. Мне вообще ничего не выводит. Версия Дельфи = 2009 (Юникодная), поэтому вся твоя работа со строками через TString летит к чертям. Проверять правильность/неправильность чего-либо не могу...
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;
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.