![]() |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
![]() ![]() |
![]() |
Insomnia |
![]()
Сообщение
#1
|
Новичок ![]() Группа: Пользователи Сообщений: 49 Пол: Мужской Репутация: ![]() ![]() ![]() |
Помогите пожалуйста разобраться. Создаю хэш-таблицу со списками. В конструкторе списка вылетает с ошибкой нарушение доступа.
Прикрепленные файлы ![]() |
IUnknown |
![]()
Сообщение
#2
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Файл 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 |
![]()
Сообщение
#3
|
Новичок ![]() Группа: Пользователи Сообщений: 49 Пол: Мужской Репутация: ![]() ![]() ![]() |
Файл 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 |
![]()
Сообщение
#4
|
Новичок ![]() Группа: Пользователи Сообщений: 49 Пол: Мужской Репутация: ![]() ![]() ![]() |
похожая проблема возникла в функции поиска в списке, если я при инициализации хэш-таблицы в хэш-ф-ции получаю одинаковые индексы в массиве ( 'мама' и 'книга' оказались в ячейке массива i = 8 ). В списке находится 1 запись, и при добавлении другой, происходит сбой. Это обычный линейный поиск в списке, и вроде логика в последовательности шагов присутствует. Ошибкой моей может быть неправильное описание ?
Сообщение отредактировано: Insomnia - 5.05.2012 22:28 Прикрепленные файлы ![]() |
IUnknown |
![]()
Сообщение
#5
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Точную последовательность шагов для получения сбоя опиши (вот запустил я твою программу, и чего? Куда нажать, чтоб сбой своими глазами увидеть?). Ибо у тебя на данный момент что добавление, что поиск - обработчики пустые, ни фига не вызывается.
|
Insomnia |
![]()
Сообщение
#6
|
Новичок ![]() Группа: Пользователи Сообщений: 49 Пол: Мужской Репутация: ![]() ![]() ![]() |
ой,извини, я не четко сформулировал. При инициализации, хэш-таблица породила коллизию ( 'мама' и 'книга' оказались в ячейке массива i = 8 ).
|
IUnknown |
![]()
Сообщение
#7
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Блин. И что?
Цитата В списке находится 1 запись, и при добавлении другой, происходит сбой. Как сбой увидеть? |
Insomnia |
![]()
Сообщение
#8
|
Новичок ![]() Группа: Пользователи Сообщений: 49 Пол: Мужской Репутация: ![]() ![]() ![]() |
кнопка 'создание' -> выбор файла txt -> бах!
|
IUnknown |
![]()
Сообщение
#9
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Никакого "бах", отображается пустая форма, и всё
![]() |
Insomnia |
![]()
Сообщение
#10
|
Новичок ![]() Группа: Пользователи Сообщений: 49 Пол: Мужской Репутация: ![]() ![]() ![]() |
что за магия ! Сделал скришнот, еще раз перезалил архив.
Эскизы прикрепленных изображений ![]() Прикрепленные файлы ![]() |
IUnknown |
![]()
Сообщение
#11
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Так. Сорри, это мой глюк, я открывал старый файл 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 |
![]()
Сообщение
#12
|
Новичок ![]() Группа: Пользователи Сообщений: 49 Пол: Мужской Репутация: ![]() ![]() ![]() |
ого. Я балбес. Спасибо за помощь !
![]() P.S. к чертям уберу список с заглавным звеном. |
Insomnia |
![]()
Сообщение
#13
|
Новичок ![]() Группа: Пользователи Сообщений: 49 Пол: Мужской Репутация: ![]() ![]() ![]() |
У меня возникли 2 проблемы по ходу реализации кода. первая небольшая : не пойму, почему при добавлении слова в файл вылетает ошибка несоответствие типов в proc seek . это из-за того, что у меня текстовый файл, а не типизированный ?
вторая попроблемнее..осуществляю поиск слова в словаре. И по хорошему, поиск должен осуществляться по ключу, правильно ? Связь между кнопкой и файлом реализует proc Search_in_Hash_Table (в un_file) корректна ? Прикрепленные файлы ![]() |
IUnknown |
![]()
Сообщение
#14
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата это из-за того, что у меня текстовый файл, а не типизированный ? Абсолютно точно. Seek не умеет работать с текстовыми файлами, только с типизированными или бестиповыми.Со второй проблемой - вроде все верно, но зачем ты i := Obj.H; делаешь в Search_in_Hash_Table - непонятно. |
Insomnia |
![]()
Сообщение
#15
|
Новичок ![]() Группа: Пользователи Сообщений: 49 Пол: Мужской Репутация: ![]() ![]() ![]() |
подсткажите пожалуйста , есть ли замена proc seek и/или как мне требуется написать алгоритм добавления слова в конец файла ?
P.s. все связал в методе поиска слова. Когда хочу вывести в таблицу поисковое слово с переводом, мне выводит только 1 слово (мама - mother ) . Я так понял , он считывает только 1 запись мою. Как мне сделать что бы с определенной строки печатал ? ии, при поиске слов инжир или яблоко пишет что слово не найдено. Это из-за того что неверно считываются данные с файла, из-за чего так происходит ? Прикрепленные файлы ![]() |
IUnknown |
![]()
Сообщение
#16
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
есть ли замена proc seek Есть. Файл открыва5ется не через Reset, а через AppendКогда хочу вывести в таблицу поисковое слово с переводом, мне выводит только 1 слово Тебе повезло. Мне вообще ничего не выводит. Версия Дельфи = 2009 (Юникодная), поэтому вся твоя работа со строками через TString летит к чертям. Проверять правильность/неправильность чего-либо не могу... |
Insomnia |
![]()
Сообщение
#17
|
Новичок ![]() Группа: Пользователи Сообщений: 49 Пол: Мужской Репутация: ![]() ![]() ![]() |
спасибо за процедуру. ДЕйствительно работает. Так же исправил неккоректное чтение и вывод в таблицу. Вот только все не пойму как мне считывать из конкретной строки файла? И у меня время от времени выскакивает ошибка
![]() ![]() Добавлено через 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;
Сообщение отредактировано: Insomnia - 7.05.2012 18:03 |
![]() ![]() |
![]() |
Текстовая версия | 17.07.2025 20:26 |