Автокликер Clickermann :: Форум

Основной раздел => Общие вопросы => Topic started by: hrytsea on February 21, 2022, 09:10:06 PM

Title: Массивы как аргументы в SUB
Post by: hrytsea on February 21, 2022, 09:10:06 PM
Windows 10, 21H2, Clickermann 4.14.002b

При передаче массивов как аргументов для подпрограммы, последняя видит только первый элемент массива.

Code: (clickermann) [Select]
sub(locator, $name, $color, $param)
    print(arrsize($name)) // возвращает 1
    print(arrsize($color)) // возвращает 1
    for($i = 0, $i < arrsize($color), $param) // $param = кол-во цветов для одного элемента (1 или 2)
        getscreen()
        contrast(4)
        print("Checking: " , $_xmouse-20, "," , $_ymouse-20 , "," , $_xmouse+20 , "," , $_ymouse+20 , "," , $color[$i])
        if_pixel_in($_xmouse - 20, $_ymouse - 20, $_xmouse + 20, $_ymouse + 20, $color[$i])
            print("Checking: " , $_xmouse-20, "," , $_ymouse-20 , "," , $_xmouse+20 , "," , $_ymouse+20 , "," , $color[$i+$param-1] )
            if_pixel_in($_xmouse - 20, $_ymouse - 20, $_xmouse + 20, $_ymouse + 20, $color[$i+$param-1])
                print("Вижу: ", $name[int($i/$param)])
            end_if
        end_if
        waitms(rnd(200,500))
        print()
        print("----------------------")
        print()
    end_cyc
end_sub

print(arrsize($menuN)) // возвращает 5
print(arrsize($menuC)) // возвращает 10

locator($menuN, $menuC, 2)

У меня где-то ошибка или это функционал кликера?
Как вариант в обход реализовать считку/запись из/в т.н. буфер обмена в виде текстового файла.
Помощь приветствуется)
Title: Re: Массивы как аргументы в SUB
Post by: Oblie1968 on February 22, 2022, 12:40:54 AM
Windows 10, 21H2, Clickermann 4.14.002b

При передаче массивов как аргументов для подпрограммы, последняя видит только первый элемент массива.

У меня где-то ошибка или это функционал кликера?
Как вариант в обход реализовать считку/запись из/в т.н. буфер обмена в виде текстового файла.
Помощь приветствуется)
Массивы в функцию не передаются, у меня большие подозрения, что они и хранятся не как массивы, а каждый элемент хранится как отдельная переменная.
С буфером обмена кликерман работает, см. TOCLIP и FROMCLIP. Есть некоторые траблы, но в целом работает.
В твоём случае я бы посмотрел на STRSEPARATE, обратной к ней функции почему-то нет, но она легко реализуется. Если, конечно, массивы не очень большие.

Ну и все переменные в кликермане глобальные, может, оно и вообще не надо массивы через параметры передавать? Подпрограмма их и так видит.
Title: Re: Массивы как аргументы в SUB
Post by: hrytsea on February 22, 2022, 05:36:26 AM
Windows 10, 21H2, Clickermann 4.14.002b

При передаче массивов как аргументов для подпрограммы, последняя видит только первый элемент массива.

У меня где-то ошибка или это функционал кликера?
Как вариант в обход реализовать считку/запись из/в т.н. буфер обмена в виде текстового файла.
Помощь приветствуется)
Массивы в функцию не передаются, у меня большие подозрения, что они и хранятся не как массивы, а каждый элемент хранится как отдельная переменная.

Реализовал задумку так: Записываю массивы в файлы, передаю в подпрограмму названия файлов, считываю массивы из файлов внутри подпрограммы.

Code: (Clickermann) [Select]
   
sub(locator, $n, $c, $param)
    tfreadarr($n, $nam)
    tfreadarr($c, $col)
   
    for($i = 0, $i < arrsize($col), $param)
        getscreen()
        contrast(4)
        if_pixel_in($_xmouse - 20, $_ymouse - 20, $_xmouse + 20, $_ymouse + 20, $col[$i])
            if_pixel_in($_xmouse - 20, $_ymouse - 20, $_xmouse + 20, $_ymouse + 20, $col[$i+$param-1])
                print("Вижу: ", $nam[int($i/$param)])
            end_if
        end_if
        waitms(10)
    end_cyc
end_sub

tfclear("name.txt")
tfclear("color.txt")
tfwritearr("name.txt", $menuN)
tfwritearr("color.txt", $menuC)
locator("name.txt", "color.txt", 2)


Ну и все переменные в кликермане глобальные, может, оно и вообще не надо массивы через параметры передавать? Подпрограмма их и так видит.

menuN и menuC одни из десятка подобных массивов, по которым нужно пробегаться, нужен фунционал работы с разными массивами на выбор, для каждого прописывать свой метод запарюсь)
Title: Re: Массивы как аргументы в SUB
Post by: Vint on February 22, 2022, 09:48:10 AM
Массивы в функцию не передаются, у меня большие подозрения, что они и хранятся не как массивы, а каждый элемент хранится как отдельная переменная.

Массивы не передаются. И нет, они хранятся именно как массивы, не как отдельные переменные. Просто в кликере никто не реализовывал передачу ссылкой, там нигде ссылки не применяются. Обычные аргументы передаются копией. Подозреваю, решение было принято просто на это забить до поры. Массивы копировать - очень долго, при больших массивах и/или частых вызовах подпрограммы, такой подход будет до неприличия медленным и тормозным.
Title: Re: Массивы как аргументы в SUB
Post by: hrytsea on February 22, 2022, 02:44:46 PM
Массивы в функцию не передаются, у меня большие подозрения, что они и хранятся не как массивы, а каждый элемент хранится как отдельная переменная.

Массивы не передаются. И нет, они хранятся именно как массивы, не как отдельные переменные. Просто в кликере никто не реализовывал передачу ссылкой, там нигде ссылки не применяются. Обычные аргументы передаются копией. Подозреваю, решение было принято просто на это забить до поры. Массивы копировать - очень долго, при больших массивах и/или частых вызовах подпрограммы, такой подход будет до неприличия медленным и тормозным.

Массивы небольшие, не более 20 элементов, но вызывается достаточно часто. Как оптимально можно обойти копирование?
Title: Re: Массивы как аргументы в SUB
Post by: dramster on February 22, 2022, 03:46:01 PM
В версии 4.14 массивы копируются очень просто - ARRCONCAT ($arr_in, $arr1, $arr2, ... )

Code: (clickermann) [Select]

sub(locator, $param)
   print(arrsize($name)) // возвращает 1
   print(arrsize($color)) // возвращает 1
   for($i = 0, $i < arrsize($color), $param) // $param = кол-во цветов для одного элемента (1 или 2)
      getscreen()
      contrast(4)
      print("Checking: " , $_xmouse-20, "," , $_ymouse-20 , "," , $_xmouse+20 , "," , $_ymouse+20 , "," , $color[$i])
      if_pixel_in($_xmouse - 20, $_ymouse - 20, $_xmouse + 20, $_ymouse + 20, $color[$i])
         print("Checking: " , $_xmouse-20, "," , $_ymouse-20 , "," , $_xmouse+20 , "," , $_ymouse+20 , "," , $color[$i+$param-1] )
         if_pixel_in($_xmouse - 20, $_ymouse - 20, $_xmouse + 20, $_ymouse + 20, $color[$i+$param-1])
            print("Вижу: ", $name[int($i/$param)])
         end_if
      end_if
      waitms(rnd(200,500))
      print()
      print("----------------------")
      print()
   end_cyc
   
end_sub

print(arrsize($menuN)) // возвращает 5
print(arrsize($menuC)) // возвращает 10

ARRCONCAT ($name, $menuN)   //копируем массивы
ARRCONCAT ($color, $menuC)
locator(2)
undefine($name) //удаляем массивы
undefine($color)
//либо, если в подпрограмме эти массивы будут изменены, то обновляем имеющиеся ранее

Title: Re: Массивы как аргументы в SUB
Post by: hrytsea on February 23, 2022, 12:37:55 AM
В версии 4.14 массивы копируются очень просто - ARRCONCAT ($arr_in, $arr1, $arr2, ... )

Code: (clickermann) [Select]

sub(locator, $param)
   print(arrsize($name)) // возвращает 1
   print(arrsize($color)) // возвращает 1
   for($i = 0, $i < arrsize($color), $param) // $param = кол-во цветов для одного элемента (1 или 2)
      getscreen()
      contrast(4)
      print("Checking: " , $_xmouse-20, "," , $_ymouse-20 , "," , $_xmouse+20 , "," , $_ymouse+20 , "," , $color[$i])
      if_pixel_in($_xmouse - 20, $_ymouse - 20, $_xmouse + 20, $_ymouse + 20, $color[$i])
         print("Checking: " , $_xmouse-20, "," , $_ymouse-20 , "," , $_xmouse+20 , "," , $_ymouse+20 , "," , $color[$i+$param-1] )
         if_pixel_in($_xmouse - 20, $_ymouse - 20, $_xmouse + 20, $_ymouse + 20, $color[$i+$param-1])
            print("Вижу: ", $name[int($i/$param)])
         end_if
      end_if
      waitms(rnd(200,500))
      print()
      print("----------------------")
      print()
   end_cyc
   
end_sub

print(arrsize($menuN)) // возвращает 5
print(arrsize($menuC)) // возвращает 10

ARRCONCAT ($name, $menuN)   //копируем массивы
ARRCONCAT ($color, $menuC)
locator(2)
undefine($name) //удаляем массивы
undefine($color)
//либо, если в подпрограмме эти массивы будут изменены, то обновляем имеющиеся ранее


Благодарю! 8)