Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пт мар 29, 2024 16:53

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: Использование хэш-таблицы
СообщениеДобавлено: Вт окт 31, 2006 11:00 
Не в сети

Зарегистрирован: Вс окт 15, 2006 13:05
Сообщения: 149
Откуда: Украина, Киев
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
Всем привет!

Помогите разобраться с использованием хэш-таблиц в СПФ. Задача следующая: есть достаточно объмная таблица, структура приведена ниже. Она неупорядочена. Необходимо находить в таблице строку по GID, в cлучае если запись не найдена запись добавить. Т.е таблица может расти.
Код:
0 \ Структура таблицы
  CELL -- GID
  CELL -- FLD
  CELL -- DT
  CELL -- PARAM
CONSTANT /Объекты

\ -- Глобальные параметры -------
  100000 CONSTANT Объекты.МаксКол-во       \ Предельное кол-во атрибутов


\ -- Резервирование памяти
0 VARIABLE Объекты
        Объекты.МаксКол-во /Объекты * ALLOCATE THROW Объекты !
Объекты Объекты.МаксКол-во /Объекты * ERASE


Ориентируюсь на библиотеку ~pinka\lib\hash-table.f Но пока толком ничего не вышло. :( Буду благодарен за фрагмент кода иллюстрирующего поиск в хэш-таблице, добавление новых значений.

--
С уважением, Алексей


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вт окт 31, 2006 17:05 
Вначале ~pinka\lib\hash-table.f написано:
Код:
\ Расстановочные таблицы
\ Ю. Жиловец, 18.12.2002, с добавлениями А. Черезова
\ 18.Sep.2003 ля-ля@тополя.ru  версия оригинального ~yz\lib\hash.f


А ~yz\lib\hash.f документирован (как и у всё у yz).

Цитата:
Буду благодарен за фрагмент кода иллюстрирующего поиск в хэш-таблице, добавление новых значений.

Поищи по папке DEVEL "hash", думаю, примеров найдётся.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср ноя 01, 2006 00:12 
Не в сети

Зарегистрирован: Вс окт 15, 2006 13:05
Сообщения: 149
Откуда: Украина, Киев
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
Спасибо. Вопрос по документации: что обозначают условные выражения в синтаксисе вызова слова
Код:
HASH! ( avalue nvalue akey nkey hash -- )

где:
avalue -- ?
nvalue -- ?
akey -- ?
nkey -- ?
hash -- ранее созданная хэш-таблица
--
С уважением, Алексей


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср ноя 01, 2006 00:15 
Код:
S" значение" S" ключ" h HASH!


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср дек 13, 2006 13:10 
Не в сети

Зарегистрирован: Сб май 13, 2006 18:17
Сообщения: 42
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
Вот такой вот вопрос возник по теме:

0 BEGIN " QWERTY" STR@ " KEY{ C @ }" STR@ h @ HASH! C @ 1+ C !
1+ DUP 10000 > UNTIL DROP

При выполнении этого тестового кода стремительно растёт выделение памяти, до 70 мегабайт. Интересно, с чем это связано, неужели так и должно быть? Пробовал small-hash, big-hash, large-hash и особой разницы не заметил. Если так не должно быть, подскажите пожалуйста, где грабли.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср дек 13, 2006 13:30 
Не в сети

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Пример стоит приводить полностью, чтобы компилялся, иначе определить грабли сложнее! ;)
Такой код
Код:
REQUIRE STR@ ~ac/lib/str5.f
REQUIRE HASH@ ~pinka/lib/hash-table.f

VARIABLE h big-hash h !
VARIABLE C 0 C !

: a
0 BEGIN " QWERTY" STR@ " KEY{ C @ }" STR@ h @ HASH! C @ 1+ C !
1+ DUP 10000 > UNTIL DROP ;

потребляет около 1.5 Мб

_________________
http://forth.org.ru/~ygrek


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср дек 13, 2006 15:15 
Динамические строки так или иначе освобождать надо.
Например, вместо
Код:
" QWERTY" STR@ " KEY{ C @ }" STR@ h @ HASH!

записать
Код:
" QWERTY" DUP >R STR@ " KEY{ C @ }" DUP >R STR@ h @ HASH! R> STRFREE R> STRFREE


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт дек 15, 2006 18:46 
Не в сети

Зарегистрирован: Сб май 13, 2006 18:17
Сообщения: 42
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
2 yGREK:
А я делал так:
Код:
S" ~ac/lib/str3.f" INCLUDED
S" ~pinka/lib/hash-table.f" INCLUDED

VARIABLE h big-hash h !
VARIABLE C 0 C !

: a
0 BEGIN " QWERTY" STR@ " KEY{ C @ }" STR@ h @ HASH! C @ 1+ C !
1+ DUP 10000 > UNTIL DROP ;

Вот теперь то я знаю, что не надо пользоваться INCLUDED и старыми либами :)

2 rvm:
Про STRFREE узнал только что, будем внимательно курить документацию.

P.S. Спасибо огромное, а то уж стали крамольные мысли закрадываться, неужто SPF проигрывает Перлу в хэшах :)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт дек 15, 2006 21:45 
Не в сети

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
INCLUDED не виноват. Дело очевидно в str3.f
NB Слово LSTRFREE - освобождает последнюю созданную строку, но в вашем случае одновременно используются сразу две строки, поэтому LSTRFREE не пригодится ;) . Но часто бывает удобно.

_________________
http://forth.org.ru/~ygrek


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB