Автор Тема: [Массивы] Autoit + Lua = Ассоциативный масив  (Прочитано 4048 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн tecae [?]

  • Новичок
  • *
  • Сообщений: 5
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
AutoIt: 3.3.14.2
Версия: 1.0

(нажмите для показа/скрытия)

Категория:  Разное

Описание: Организация взаимодействия Lua и Autoit для реализации ассоциативного массива

Код/Пример:
(нажмите для показа/скрытия)

Файл: Архив
« Последнее редактирование: Март 17, 2016, 15:34:17 от tecae »

Русское сообщество AutoIt

[Массивы] Autoit + Lua = Ассоциативный масив
« Отправлен: Март 15, 2016, 21:02:46 »

Оффлайн Pahuchiy [?]

  • Новичок
  • *
  • Сообщений: 35
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: [Массивы] Autoit + Lua = Ассоциативный масив
« Ответ #1, Отправлен: Март 06, 2017, 00:13:15 »
перехожу с луа на autoit и без асс. массивов тяжело. Никак не могу разобраться как использовать приведёный код. Плиз, напишите ПРОСТОЙ пример использования.

Оффлайн Prog [?]

  • Осваивающий
  • **
  • Сообщений: 265
  • Репутация: 28
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: [Массивы] Autoit + Lua = Ассоциативный масив
« Ответ #2, Отправлен: Март 06, 2017, 17:55:57 »
Ассоциативный массив
Код: AutoIt [Выделить]
$Map_NoElementCheck = 0
$Map_ElementCheck = 1

$dll=DllOpen("MapDLL.dll")

$Map=DllCall($dll, "PTR", "Lib_NewMap")
$Map=$Map[0]
ConsoleWrite("$Map = " & $Map & @CRLF)

for $i=1 to 100
   $Key = "Key_" & $i
   $Ret = DllCall($dll, "int", "Lib_AddMapElement", "PTR", $Map, "WSTR", $Key, "Int", $Map_ElementCheck)
   if $Ret[0]<>0 Then
      DllCall($dll, "int", "SetData_Integer", "PTR", $Map, "WSTR", "", "Int", $i)
   endif
next


$Ret = DllCall($dll, "Int", "GetData_Integer", "PTR", $Map, "WSTR", "Key_2")
ConsoleWrite("Key_2 = " & $Ret[0] & @CRLF)

$Ret = DllCall($dll, "int", "Lib_MapSize", "PTR", $Map)
$Count = $Ret[0]
ConsoleWrite("Count element = " & $Count & @CRLF)

DllCall($dll, "int", "Lib_ResetMap", "PTR", $Map)


for $i=1 to $Count

   $Ret = DllCall($dll, "int", "Lib_NextMapElement", "PTR", $Map)
   if $Ret[0]<>0 Then
      $Ret = DllCall($dll, "Int", "GetData_Integer", "PTR", $Map, "WSTR", "")
      ConsoleWrite($Ret[0] & @CRLF)
   endif
next

Описание функций http://www.purebasic.com/documentation/map/index.html


Внимание: Для просмотра прикреплённых файлов необходимо Войти или Зарегистрироваться

Оффлайн Alofa [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1111
  • Репутация: 155
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: [Массивы] Autoit + Lua = Ассоциативный масив
« Ответ #3, Отправлен: Март 06, 2017, 23:08:14 »
... Никак не могу разобраться как использовать приведёный код.
И не надо вдаваться в это... Это не код - это свалка для личного пользования автора.

OffTopic
Ассоциативный массив ...
Для сравнения:
(нажмите для показа/скрытия)
(нажмите для показа/скрытия)
Prog, а оно того стоит - тащить за скриптом .DLL?
« Последнее редактирование: Март 06, 2017, 23:21:11 от Alofa »

Русское сообщество AutoIt

Re: [Массивы] Autoit + Lua = Ассоциативный масив
« Ответ #3 Отправлен: Март 06, 2017, 23:08:14 »

Оффлайн Prog [?]

  • Осваивающий
  • **
  • Сообщений: 265
  • Репутация: 28
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: [Массивы] Autoit + Lua = Ассоциативный масив
« Ответ #4, Отправлен: Март 07, 2017, 00:27:12 »
Падение скорости из-за DllCall...
В этом участке кода
Код: AutoIt [Выделить]
for $i=1 to 20000
   $Key = "Key_" & $i
   $Ret = DllCall($dll, "int", "Lib_AddMapElement", "PTR", $Map, "WSTR", $Key, "Int", $Map_ElementCheck)
   if $Ret[0]<>0 Then
      DllCall($dll, "int", "SetData_Integer", "PTR", $Map, "WSTR", "", "Int", $i)
   endif
next

90% времени тратится на выполнение DllCall и только 10% на работу функции в dll.

Оффлайн tecae [?]

  • Новичок
  • *
  • Сообщений: 5

  • Автор темы
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: [Массивы] Autoit + Lua = Ассоциативный масив
« Ответ #5, Отправлен: Март 12, 2017, 13:08:31 »
перехожу с луа на autoit и без асс. массивов тяжело. Никак не могу разобраться как использовать приведёный код. Плиз, напишите ПРОСТОЙ пример использования.

Код: AutoIt [Выделить]
;#Region Обязательно СТАРТ    ---------------------------------------------------------------------------------------------<<<<<
#include "luau._au3"            ; функции LUA
#include "lua_AssocArrays._au3" ; функции ассоциативного массива

Local $USE_Lua_INTRFC = True ; ДЛЯ ОТЛАДКИ

($USE_Lua_INTRFC = False And Not _lua_init()) ? $USE_Lua_INTRFC = False : $USE_Lua_INTRFC = True
If $USE_Lua_INTRFC = True Then
    ;   Использование Lua интерфейса Активация
    ConsoleWrite("+ _lua_init() = OK")
    _lua_open_state() ; создаем глобальное состояние
    _lua_open_libs()  ; открыть библиотеки STD LUA

   ; файл  comon.lua содержит  AssocArray = {} - тут и хранятся все созданые нами масисы

    ConsoleWrite("---- [" & _lua_open_script(@ScriptDir & "\comon.lua") & @CRLF)
;#EndRegion Обязятельно СТАРТ ---------------------------------------------------------------------------------------------<<<<<
;#Region ТУТ ПОЛЬЗУЕМСЯ МАССИВАМИ




    ConsoleWrite("----------------------------AssocArray--------------------------------------" & @CRLF)
    Local $assocAr = 0  ; переменная далее будет масивом

    Local $DontArr = 0  ; переменная не масив для примера

   ; Создать асс. масив
    _LUA_AssocArrayCreate($assocAr)
    ConsoleWrite("+                   Assoc arr create! index = " & $assocAr & @CRLF)


   ; Проверить асс. массив ли в переменной
    _LUA_AssocArrayVerify($assocAr)
    ConsoleWrite("+                  is arr   = " & $assocAr & @CRLF) ; масив
    _LUA_AssocArrayVerify($DontArr)
    ConsoleWrite("+                 not arr   = " & $DontArr & @CRLF) ; не масив для примера



   ; Вставить ключь значение в асс. масив если присутствует перезаписать значение
    _LUA_AssocArrayAssign($assocAr, 100, "025")


    _LUA_AssocArrayAssign($assocAr, 15, "025") ; создать ключ значение


    _LUA_AssocArrayAssign($assocAr, 15, "166668552") ; перезапись


    _LUA_AssocArrayAssign($assocAr, 14, "025")




   ; Проверить есть ли ключ в асс. масиве
    ConsoleWrite("+                 is key   = " & _LUA_AssocArrayExists($assocAr, 100) & @CRLF) ; существующее
    ConsoleWrite("+                 is not key   = " & _LUA_AssocArrayExists($assocAr, 22) & @CRLF) ; несуществующее


   ; удалить по ключу
    _LUA_AssocArrayDelete($assocAr, 100)


   ; вернуть масив ключей
    Local $tempArr = _LUA_AssocArrayKeys($assocAr)
    For $i=1 to UBound($tempArr)-1
        ConsoleWrite("+   Ключ = " & $tempArr[$i]& " --->")
        ConsoleWrite("+   Значение  = " &_LUA_AssocArrayGet($assocAr, $tempArr[$i])& @CRLF) ; получить значение по ключу
    Next

    ConsoleWrite("------------------------------------------------------------------" & @CRLF)




;#EndRegion ТУТ ПОЛЬЗУЕМСЯ МАССИВАМИ
;#Region Обязятельно ПОСЛЕ ЗАВЕРШЕНИЯ    ---------------------------------------------------------------------------------------------<<<<<
    _lua_close_state() ; закрывает глобальное состояние

    If _lua_del_init() Then
        ConsoleWrite("+ _lua_del_init() = OK")
    Else
        ConsoleWrite("! _lua_del_init() = ERROR")
    EndIf

Else
    ConsoleWrite("! _lua_init() = ERROR ; окружение Lua не доступно !!!!")
EndIf
;#EndRegion Обязательно ПОСЛЕ ЗАВЕРШЕНИЯ    ---------------------------------------------------------------------------------------------<<<<<

 



Внимание: Для просмотра прикреплённых файлов необходимо Войти или Зарегистрироваться

Русское сообщество AutoIt

Re: [Массивы] Autoit + Lua = Ассоциативный масив
« Ответ #5 Отправлен: Март 12, 2017, 13:08:31 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
6 Ответов
3704 Просмотров
Последний ответ Ноябрь 13, 2009, 12:35:59
от Kaster
15 Ответов
5563 Просмотров
Последний ответ Март 27, 2011, 23:37:06
от Yashied
2 Ответов
4173 Просмотров
Последний ответ Июнь 22, 2011, 13:10:25
от Vlasssov
1 Ответов
3735 Просмотров
Последний ответ Май 18, 2011, 09:20:56
от RUVATA
0 Ответов
2214 Просмотров
Последний ответ Май 17, 2011, 16:30:24
от Yashied
0 Ответов
3605 Просмотров
Последний ответ Июль 30, 2011, 13:14:35
от Redline
9 Ответов
3483 Просмотров
Последний ответ Июль 12, 2012, 22:20:04
от CreatoR
1 Ответов
3382 Просмотров
Последний ответ Сентябрь 20, 2012, 06:00:32
от madmasles
3 Ответов
754 Просмотров
Последний ответ Январь 13, 2015, 08:59:52
от Ciber SLasH
18 Ответов
6796 Просмотров
Последний ответ Май 04, 2017, 12:36:40
от roma351234567890