Хэш-таблица из IUP
|
|
WQ | Дата: Понедельник, 30.10.2017, 20:24 | Сообщение # 1 |
Полковник
Группа: Проверенные
Сообщений: 215
Статус: 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
Статус: Offline
| Кажется довольно простым, спасибо за пример!
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
WQ | Дата: Вторник, 07.11.2017, 23:38 | Сообщение # 3 |
Полковник
Группа: Проверенные
Сообщений: 215
Статус: 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
Статус: Offline
| Все сообщения , не относящиеся к теме перенес в отдельную тему
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
|