Author Topic: Как передать в CALL("Plugin.DLL",...) неизвестное заранее количество чисел?  (Read 2713 times)

0 Members and 3 Guests are viewing this topic.

ya12

  • Активный участник
  • ***
  • Posts: 165
    • View Profile
Как передать в CALL("Plugin.DLL", число1, число2, ..., числоN) неизвестное заранее количество чисел?

Через текстовый файл не желательно из-за частого вызова Plugin.DLL. Одно число изменяется постоянно, остальные считываются 1 раз из файла, 1 раз изменяются и все это передается в плагин.

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
А от чего зависит это количество? Если это массив, то вот похожая тема http://crapware.aidf.org/forum/index.php?topic=3905.0 . Только костылики  :(

Впринципе для длл можно отправлять просто какоето максимально возможное количество элементов. А задействованы будут только те, которые нужны, остальные прописать нулями к примеру.



Ты бы показал пример хоть какой, было бы нагляднее.
« Last Edit: September 08, 2018, 08:52:26 PM by dramster »

ya12

  • Активный участник
  • ***
  • Posts: 165
    • View Profile
Это границы области за которые не должен забегать бот, поэтому переменная часть может быть от 4 пар координат + непроходимые участки внутри области. DLL раз в несколько секунд по координатам строит в TBitMap внешние и внутренние линии, заливает определенным цветом рабочую область. Во круг координат бота(или его цели) определяем цвет и узнаем внутри он или снаружи.

Костылики с записью в файл не подойдут, тогда проще читать переменную часть из файла.
Буду передавать максимально возможное количество, а лишнее забивать 0.
« Last Edit: September 08, 2018, 10:53:23 PM by ya12 »

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
 Так а чем не подходит вариант что я описал выше?
 Пишем все нужные параметры в массив, будь они в файле или еще где. И не важно сколько их, пишем в начало массива. Потом дописываем в этот массив какоето число пустых элементов (0 или -1). Это число элементов = максимуму который возможен, будь то 100, 200 или 1000. И вызываем длл с этими всеми параметрами. В этой библиотеке уже читаем только те первые параметры, которые не "пустые".
Если этих параметров может быть реально много, то я думаю, ничего страшного не случится. Вызов можно в инклуд засунуть, чтоб не мешалась перед носом длиннющая строка.


Что то типа:
Code: (clickermann) [Select]
TFREADARR ("par.txt", $arr) //читаем все параметры из файла, сколько их, нам не извесно
//если они не в файле, то просто пишем по очереди в этот массив.

FOR($a=ARRSIZE($arr) ,$a < 20)   //добавляем параметры до 20 элементов, возможно это и не требуется, на всякий случай
  ARRPUSH($arr, 0)                        //если их может быть больше, пишем больше
END_CYC
 
//ну и вызов их всех
CALL("Plugin.DLL",$arr[0],$arr[1],$arr[2],$arr[3],$arr[4],$arr[5],$arr[6],$arr[7],$arr[8],$arr[9],$arr[10],$arr[11],$arr[12],$arr[13],$arr[14],$arr[15],$arr[16],$arr[17],$arr[18],$arr[19])

//а в самой длл, просто читаем попорядку параметры до то того у которого значение =0 (можно записывать не 0, а какое другое ненармальное значение, типа -1)

Мне больше ничего в голову не пришло  :(. Ну и плюс еще те, что ты сам предложил выше - передача через .ини или через другой файл.


К стати, таким способом можно и строки передавать  ::). Жаль что в ответ библиотека может отдать только 4 байта :P, но опять же, никто передачу через файл не запрещает.


добавлено:
Пока писал, вижу ты уже и сам решил, что так будет проще.
Буду передавать максимально возможное количество, а лишнее забивать 0.

« Last Edit: September 08, 2018, 11:23:56 PM by dramster »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Не нужно ничего забивать нулями, это лишняя трата времени, тем более кликером.
Нужно выделить первый параметр под число-количество активных параметров.
Остаётся заполнять нужные остальной мусор бросать как есть.

И неужели в делфи нет возможности передавать разное количество параметров? В питоне есть. И позиционных *args, и именованных **kwargs
« Last Edit: September 09, 2018, 08:06:20 PM by Vint »


dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
И неужели в делфи нет возможности передавать разное количество параметров? В питоне есть. И позиционных *args, и именованных **kwargs
:-\ Я даже и не знаю, но судя по написанному в справке
Quote
Все что вам необходимо знать - это формат экспортной функции, которую вызывает кликер. Она выглядит так в стандарте С++:
int execute(int* _arr, int _size)
эта функция int. В дэлфи - integer, ...ну какбы одно и тоже.
Можно попробовать конечно...



Попробовал передать int64. Кликерман не принимает такое (возврат = 0), хоть функция и выполняется верно.
« Last Edit: September 09, 2018, 10:55:30 PM by dramster »

ya12

  • Активный участник
  • ***
  • Posts: 165
    • View Profile
Остаётся заполнять нужные остальной мусор бросать как есть.


Если не дать значений всем элементам массива, то интерпретатор при обращении выдает ошибку.

Code: (clickermann) [Select]
print($arr[102])  //$arr[102] ранее не вызывался и ничему не равен

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Если не дать значений всем элементам массива, то интерпретатор при обращении выдает ошибку.
Я не сказал не давать изначально, я сказал "не обновлять каждый раз".
Ну есть, допустим 500 значений. Массив создаём честно занеся все 500.
Первая отправка, действительных 300 - обновляем 300 и проставляем количество.
Вторая отправка, действительных 100 - обновляем 100 и проставляем количество (не нужно оставшиеся затирать, там остаются старые значения)