Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.09.2017, 17:57   #1
Gr1fon
Новичок
Джуниор
 
Регистрация: 30.05.2013
Сообщений: 1
По умолчанию Префиксное дерево и ошибка "too many consecutive exceptions"

Доброго времени суток! Есть задача - написать префиксное дерево, которое читает из слова из файла и составляет из них словарь для проверки орфографии. Но при попытке добавить слово программа вылетает с ошибкой "too many consecutive exceptions".
Процедуры добавления:
Код:
procedure Add(var r: pTrie; c: char);
var pt: pTrie;
begin
  if r = nil then begin
    New(r);
    r^.letter := c;
    r^.firstchild := nil;
    r^.nextbrother := nil;
  end else begin
    New(pt);
    pt^.letter := c;
    pt^.nextbrother := r;
    pt^.firstchild := nil;
    r:= pt;
  end;
end;
function Find(p: pTrie; c: Char): pTrie;
var pt: pTrie;
begin
  pt:= p^.firstchild;
  while pt <> nil do begin
    pt:= pt^.nextbrother;
    if pt^.letter = c then Break;
  end;
  result:= pt;
end;
procedure SendLetter(r: pTrie; s: string);
var pt: pTrie;
    i: integer;
begin
  pt:= r;
  for i:= 1 to Length(s) do
    if (Find(pt, s[i]) = nil) then
      Add(pt^.firstchild, s[i])
    else
      pt:=Find(r, s[i]);
    if (Find(pt,'$') = nil) then
      Add(pt^.firstchild, '$');
end;
Объявленный тип контейнера:
Код:
type pTrie = ^Trie;
      Trie = record
          letter: char;
          firstchild: pTrie;
          nextbrother: pTrie;
Есть идеи? Заранее спасибо!
Gr1fon вне форума Ответить с цитированием
Старый 26.09.2017, 19:05   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Gr1fon Посмотреть сообщение
Есть идеи?
идти в отладчик и пошагово проходить, проверять, куда и как ссылки пишете.


Цитата:
Сообщение от Gr1fon Посмотреть сообщение
Код:
firstchild: pTrie;
а что означает это поле, куда эта ссылка?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.09.2017, 04:32   #3
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

Код:
function Find(p: pTrie; c: Char): pTrie;
var pt: pTrie;
begin
  pt:= p^.firstchild;
  while pt <> nil do begin
    pt:= pt^.nextbrother;//<<<<отсутствует обработка firstchild и сразу берется nextbrother
Код:
function Find(p: pTrie; c: Char): pTrie;
var pt: pTrie;
begin
  pt:= p^.firstchild;
  while pt <> nil do begin
    if pt^.letter = c then Break;
    pt:= pt^.nextbrother;
  end;
  result:= pt;
end;
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Убрать папки "Pictures", "Music", "Видео", "Downloads" из "МОЙ КОМПЬЮТЕР" Бахтиёр1916 Windows 1 05.04.2017 12:53
Нужно пояснить/прокомментировать код программы, или коды функций "Добавить" "Удалить" "Обновить(редактировать" "Поиск" "Период") ZIRASS PHP 4 15.06.2016 14:23
Для заданной строки определить все входящие в неё символ. Например: строка "abccbbabbac" состоит из символов "a", "b" и "c" Sandakan01 Помощь студентам 1 24.02.2016 03:20
Ошибка "too many consecutive exceptions" при работе программы: как найти? DimychX Общие вопросы Delphi 11 22.06.2011 21:02