Что нового

Передача списка аргументов в функцию

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Всем доброго время суток.
Хотелось бы узнать о том, кто и как решает подобного рода задачи?

Код:
int printf (форматная строка, список аргументов);

Задача в следующем.
Нужно импортировать функцию printf в Autoit и передать ей список аргументов.

Например так:
Код:
Func _Printf($s_Format, ???)
   ;...
EndFunc ;==>_Printf


Можно решить эту задачу так:
Код:
Func _Printf($s_Format, ???)

   For $i = 1 To @NumParams
	  ;...
   Next
   ;...
EndFunc ;==>_Printf

Однако нам заранее неизвестно максимальное количество аргументов printf.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Я за 2 вариант, максимальное число ограничить каким нибудь разумным пределом.
 
A

Alofa

Гость
Согласитесь, неприглядно будет выглядеть не только сама функция, но и ее вызов в которой, к примеру, 200 аргументов.
На ум приходит использование в качестве входных параметров массивов или структур или строки на подобии тегов структур.
Или сделать не вашим - не нашим: создать функцию с двумя обязательными и четырьмя необязательными аргументами, к примеру, и включить поддержку принятия во второй структуры с игнорированием всех последующих параметров.
 
Автор
Garrett

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
inververs
Именно так я и поступаю, но меня всё время тянет отписаться разработчикам, по поводу внедрения что-то типа ByList.
Ну, например, можно было бы сделать так:
Код:
_Printf("Да здравствует %d %s!\n", 1, "Мая")

Func _Printf($s_Format,  ByList $Args)

   $a_Ret = DllCall(..., "int", "printf", "str", $s_Format,  GetList($Args))

   Return $a_Ret[0]
EndFunc ;==>_Printf




Добавлено:
Сообщение автоматически объединено:

Alofa
Не всё так просто. :smile:
Нужно будет проверять значение из массива на type, а потом ещё сформировать параметры для передачи их в DllCall.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Garrett
Мне кажется разработчики давно закинули разработку.
 
Верх