Author Topic: Массивы как аргументы в SUB  (Read 2952 times)

0 Members and 1 Guest are viewing this topic.

hrytsea

  • Зашел в гости
  • *
  • Posts: 13
    • View Profile
Массивы как аргументы в SUB
« 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)

У меня где-то ошибка или это функционал кликера?
Как вариант в обход реализовать считку/запись из/в т.н. буфер обмена в виде текстового файла.
Помощь приветствуется)
« Last Edit: February 22, 2022, 05:26:23 AM by hrytsea »


Шамбамбукли вздохнул и опустил небо пониже.

Oblie1968

  • Освоившийся
  • **
  • Posts: 29
    • View Profile
Re: Массивы как аргументы в SUB
« Reply #1 on: February 22, 2022, 12:40:54 AM »
Windows 10, 21H2, Clickermann 4.14.002b

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

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

Ну и все переменные в кликермане глобальные, может, оно и вообще не надо массивы через параметры передавать? Подпрограмма их и так видит.
« Last Edit: February 22, 2022, 12:48:51 AM by Oblie1968 »

hrytsea

  • Зашел в гости
  • *
  • Posts: 13
    • View Profile
Re: Массивы как аргументы в SUB
« Reply #2 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 одни из десятка подобных массивов, по которым нужно пробегаться, нужен фунционал работы с разными массивами на выбор, для каждого прописывать свой метод запарюсь)


Шамбамбукли вздохнул и опустил небо пониже.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Массивы как аргументы в SUB
« Reply #3 on: February 22, 2022, 09:48:10 AM »
Массивы в функцию не передаются, у меня большие подозрения, что они и хранятся не как массивы, а каждый элемент хранится как отдельная переменная.

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


hrytsea

  • Зашел в гости
  • *
  • Posts: 13
    • View Profile
Re: Массивы как аргументы в SUB
« Reply #4 on: February 22, 2022, 02:44:46 PM »
Массивы в функцию не передаются, у меня большие подозрения, что они и хранятся не как массивы, а каждый элемент хранится как отдельная переменная.

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

Массивы небольшие, не более 20 элементов, но вызывается достаточно часто. Как оптимально можно обойти копирование?
« Last Edit: February 22, 2022, 02:49:44 PM by hrytsea »


Шамбамбукли вздохнул и опустил небо пониже.

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Массивы как аргументы в SUB
« Reply #5 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)
//либо, если в подпрограмме эти массивы будут изменены, то обновляем имеющиеся ранее

« Last Edit: February 22, 2022, 03:49:26 PM by dramster »

hrytsea

  • Зашел в гости
  • *
  • Posts: 13
    • View Profile
Re: Массивы как аргументы в SUB
« Reply #6 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)


Шамбамбукли вздохнул и опустил небо пониже.