FreeBasic
Главная
Вход
Регистрация
Среда, 09.10.2024, 09:20Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Хэш-таблица из IUP
WQДата: Понедельник, 30.10.2017, 20:24 | Сообщение # 1
Полковник
Группа: Проверенные
Сообщений: 215
Репутация: 7
Статус: Offline
Небольшой пример использования строковой хэш-таблицы из IUP, добавляет примерно 50 килобайт при статической линковке, основная часть IUP не требуется
Такую хэш-таблицу можно использовать, например, для быстрого доступа к строковым данным в большой совокупности по ключу, или как дополнение при обработке больших массивов строк
Код
''' пример использования хэш-таблицы из библиотеки IUP
''' WQ, 2017

'' путь до iup.bi и iup_table.bi, пропишите свой
#Include Once "inc/iup/iup.bi"
#Include Once "inc/iup/iup_table.bi"

'' создаем хэш-таблицу строкового типа
Dim itb As Itable Ptr
itb = iupTableCreate(IUPTABLE_STRINGINDEXED)

'' создаем массив со строками и заполняем
Dim aString(...) As String ={"100", "200", "300", "400", "500", "600", "700", "100"}

'' заполняем хэш-таблицу
'' в данном случае ключ и данные - одна и та же строка
For j As Integer = 0 To UBound(aString)
   Dim As String key=aString(j)

   If iupTableGet(itb, key) <> 0 Then '' проверяем, есть ли такой ключ в таблице
      ? key, "was already" '' выводим значение из массива с указанием, что такой значение уже встречалось
   Else
      ? key, "was not yet" '' выводим значение из массива с указанием, что такого значение еще не встречалось
   EndIf
   
   '' пример показывает, как с помощью хэш-таблицы можно быстро обработать массив строковых данных - например, удалить повторяющиеся строки

  iupTableSet(itb, key, StrPtr(aString(j)), IUPTABLE_STRING) '' вносим данные по ключу в хэш-таблицу
   '' если ключ уже встречался, значение будет перезаписано, т.е. в данном случае хэш-таблица содержит только уникальные строки из массива
Next

?
?
?
'' выводим количество элементов в таблице
? iupTableCount(itb), "count key"
''например, сравнение с размером массива ubound(массив)+1 позволит определить, есть ли в массиве повторяющиеся строки
?
?
?

'' далее перебор значений хэш-таблицы
Dim As ZString Ptr key
key = iupTableFirst(itb) '' начинаем обход таблицы с первого значения
'' в цикле последовательно выводим с помощью iupTableGetCurr все значения из таблицы
While(key)
   Dim As ZString Ptr zs
   zs = Cast(ZString Ptr,iupTableGetCurr(itb))
   ? *zs
   key = iupTableNext(itb)   
Wend

Sleep 15000
iupTableClear(itb) '' функция для очищения хэш-таблицы
iupTableDestroy(itb) '' функция уничтожения хэш-таблицы


Сообщение отредактировал WQ - Понедельник, 06.11.2017, 17:51
 
haavДата: Понедельник, 30.10.2017, 20:49 | Сообщение # 2
Генералиссимус
Группа: Администраторы
Сообщений: 1363
Репутация: 49
Статус: Offline
Кажется довольно простым, спасибо за пример!

Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
WQДата: Вторник, 07.11.2017, 23:38 | Сообщение # 3
Полковник
Группа: Проверенные
Сообщений: 215
Репутация: 7
Статус: Offline
Ошибку нашел в предыдущем коде
Надо  
Код
iupTableSet(itb, key, StrPtr(aString(j)), IUPTABLE_STRINGINDEXED)

заменить на

Код
iupTableSet(itb, key, StrPtr(aString(j)), IUPTABLE_STRING)


Добавлено (07.11.2017, 23:38)
---------------------------------------------
Хэш-таблица из IUP может содержать не только строки, но и указатели на сложные структуры, а также на указатели
на функции
Это позволяет (в теории) делать сложные манипуляции с данными вроде создания словарей, сложной сортировки, сбора строк в совокупности по какому-то признаку

Пример занесения указателя произвольного типа в хэш-таблицу:

Код
''' пример использования хэш-таблицы из библиотеки IUP
''' WQ, 2017

#Include Once "inc/iup/iup.bi"
#Include Once "inc/iup/iup_table.bi"

Type type_example
    As Integer index
    As String text
End Type

Dim itb As Itable Ptr
itb = iupTableCreate(IUPTABLE_STRINGINDEXED)

Dim As type_example anyvalue(2)

anyvalue(0).index=0
anyvalue(0).text="text AAA"

anyvalue(1).index=1
anyvalue(1).text="text BBB"

anyvalue(2).index=2
anyvalue(2).text="text CCC"

iupTableSet(itb, "key1", Cast(Any Ptr,@anyvalue(0)), IUPTABLE_POINTER) ''добавляем значение из массива, тип данных - указатель
iupTableSet(itb, "key2", Cast(Any Ptr,@anyvalue(1)), IUPTABLE_POINTER)
iupTableSet(itb, "key3", Cast(Any Ptr,@anyvalue(2)), IUPTABLE_POINTER)

Dim As ZString Ptr key
key = iupTableFirst(itb)

While(key)
    Dim As type_example anyvalue1
    anyvalue1=*Cast(type_example Ptr,iupTableGetCurr(itb))
    ? *key, anyvalue1.index, anyvalue1.text
    key = iupTableNext(itb)    
Wend

Sleep 15000
iupTableClear(itb)
iupTableDestroy(itb)


Однако в случае использования указателей необходимо проверять стабильность работы таких конструкций


Сообщение отредактировал WQ - Вторник, 07.11.2017, 23:43
 
haavДата: Воскресенье, 16.01.2022, 20:03 | Сообщение # 4
Генералиссимус
Группа: Администраторы
Сообщений: 1363
Репутация: 49
Статус: Offline
Все сообщения , не относящиеся к теме перенес в отдельную тему

Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
  • Страница 1 из 1
  • 1
Поиск: