IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> инициализация хэша, массив из списков
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 49
Пол: Мужской

Репутация: -  0  +


Помогите пожалуйста разобраться. Создаю хэш-таблицу со списками. В конструкторе списка вылетает с ошибкой нарушение доступа.


Прикрепленные файлы
Прикрепленный файл  Hash_vocabulary.rar ( 210.11 килобайт ) Кол-во скачиваний: 309
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Файл 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;

... из-за чего класс не инициализировался правильно, и, естественно, в его конструкторе происходил сбой.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 49
Пол: Мужской

Репутация: -  0  +


Цитата(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;

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


Спасибо большое ! понял ошибку, исправил , дополнил модуль, заработало !
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Новичок
*

Группа: Пользователи
Сообщений: 49
Пол: Мужской

Репутация: -  0  +


похожая проблема возникла в функции поиска в списке, если я при инициализации хэш-таблицы в хэш-ф-ции получаю одинаковые индексы в массиве ( 'мама' и 'книга' оказались в ячейке массива i = 8 ). В списке находится 1 запись, и при добавлении другой, происходит сбой. Это обычный линейный поиск в списке, и вроде логика в последовательности шагов присутствует. Ошибкой моей может быть неправильное описание ?

Сообщение отредактировано: Insomnia -


Прикрепленные файлы
Прикрепленный файл  Hash_vocabulary.rar ( 210.71 килобайт ) Кол-во скачиваний: 274
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Точную последовательность шагов для получения сбоя опиши (вот запустил я твою программу, и чего? Куда нажать, чтоб сбой своими глазами увидеть?). Ибо у тебя на данный момент что добавление, что поиск - обработчики пустые, ни фига не вызывается.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Новичок
*

Группа: Пользователи
Сообщений: 49
Пол: Мужской

Репутация: -  0  +


ой,извини, я не четко сформулировал. При инициализации, хэш-таблица породила коллизию ( 'мама' и 'книга' оказались в ячейке массива i = 8 ).
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Блин. И что?
Цитата
В списке находится 1 запись, и при добавлении другой, происходит сбой.
Как сбой увидеть?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Новичок
*

Группа: Пользователи
Сообщений: 49
Пол: Мужской

Репутация: -  0  +


кнопка 'создание' -> выбор файла txt -> бах!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Никакого "бах", отображается пустая форма, и всё smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Новичок
*

Группа: Пользователи
Сообщений: 49
Пол: Мужской

Репутация: -  0  +


что за магия ! Сделал скришнот, еще раз перезалил архив.


Эскизы прикрепленных изображений
Прикрепленное изображение

Прикрепленные файлы
Прикрепленный файл  Hash_vocabulary.rar ( 210.71 килобайт ) Кол-во скачиваний: 274
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Так. Сорри, это мой глюк, я открывал старый файл 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, посмотри внимательно, новый-то элемент добавляется ПЕРЕД существующими, а не ПОСЛЕ), а потом, думая, что надо пропустить заглавный элемент, ты пропускал инициализированные данные, и начинал работать с мусором. Вот тебе и глюки. Так что либо выкинь заглавное звено, либо добавляй данные в конец списка.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Новичок
*

Группа: Пользователи
Сообщений: 49
Пол: Мужской

Репутация: -  0  +


ого. Я балбес. Спасибо за помощь ! good.gif
P.S. к чертям уберу список с заглавным звеном.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Новичок
*

Группа: Пользователи
Сообщений: 49
Пол: Мужской

Репутация: -  0  +


У меня возникли 2 проблемы по ходу реализации кода. первая небольшая : не пойму, почему при добавлении слова в файл вылетает ошибка несоответствие типов в proc seek . это из-за того, что у меня текстовый файл, а не типизированный ?
вторая попроблемнее..осуществляю поиск слова в словаре. И по хорошему, поиск должен осуществляться по ключу, правильно ? Связь между кнопкой и файлом реализует proc Search_in_Hash_Table (в un_file) корректна ?


Прикрепленные файлы
Прикрепленный файл  Hash_vocabulary.rar ( 220.18 килобайт ) Кол-во скачиваний: 290
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Цитата
это из-за того, что у меня текстовый файл, а не типизированный ?
Абсолютно точно. Seek не умеет работать с текстовыми файлами, только с типизированными или бестиповыми.

Со второй проблемой - вроде все верно, но зачем ты i := Obj.H; делаешь в Search_in_Hash_Table - непонятно.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Новичок
*

Группа: Пользователи
Сообщений: 49
Пол: Мужской

Репутация: -  0  +


подсткажите пожалуйста , есть ли замена proc seek и/или как мне требуется написать алгоритм добавления слова в конец файла ?
P.s. все связал в методе поиска слова. Когда хочу вывести в таблицу поисковое слово с переводом, мне выводит только 1 слово (мама - mother ) . Я так понял , он считывает только 1 запись мою. Как мне сделать что бы с определенной строки печатал ? ии, при поиске слов инжир или яблоко пишет что слово не найдено. Это из-за того что неверно считываются данные с файла, из-за чего так происходит ?


Прикрепленные файлы
Прикрепленный файл  Hash_vocabulary.rar ( 221.3 килобайт ) Кол-во скачиваний: 288
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Цитата(Insomnia @ 7.05.2012 16:16) *
есть ли замена proc seek
Есть. Файл открыва5ется не через Reset, а через Append

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


Новичок
*

Группа: Пользователи
Сообщений: 49
Пол: Мужской

Репутация: -  0  +


спасибо за процедуру. ДЕйствительно работает. Так же исправил неккоректное чтение и вывод в таблицу. Вот только все не пойму как мне считывать из конкретной строки файла? И у меня время от времени выскакивает ошибка Прикрепленное изображениеПрикрепленное изображение, из-за чего так происходит ?

Добавлено через 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 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 17.04.2024 1:13
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name