PDA

Просмотр полной версии : [Вопрос] определение типа аргумента функции



Ashmy
01.11.2017, 22:23
Здравствуйте. Да-да, я знаю что по сути в Pawn'е нет типов данных, но всё же, есть ли способ условно определить тип переменной? Допустим, мы передаём в функцию неизвестное количество аргументов: часть из них - целые числа, часть - с плавающей точкой. Каким образом можно определить какой аргумент у нас целочисленный, а какой с точкой?
Единственное что приходит на ум, это с помощью цикла проверять нет ли в одном из аргументов точки, если нет - это целое число, но если аргументов будет десятка 2 и сами числа будут большими (допустим, 10-ти значимыми), это довольно сильно увеличит время выполнения функции, проще тогда уже написать две подобных функции: одна для целых чисел и вторую для чисел с точкой. Возможно, я ответил на свой же вопрос :pardon:

DeimoS
01.11.2017, 23:27
Ну взгляни на тот же sscanf или SetTimerEx. Перечисление в одном из аргументов, которое выглядит как
"ifs[]..." нужно как раз для того, чтоб можно было легко определить тип аргумента. Как-то иначе это сделать трудно

Слава КПСС
01.11.2017, 23:39
Ты сейчас пошутил? То есть как бы bool, Float, text и т.д. это не канает за тип данных?

DeimoS
01.11.2017, 23:53
Ты сейчас пошутил? То есть как бы bool, Float, text и т.д. это не канает за тип данных?

Это теги для компилятора. А вещественные числа вообще подтянуты разработчиком сампа со стороны и существуют лишь благодаря функциям, которые отдельно работают с этими числами. Вот тебе простое доказательство


main()
{
new int;
int = _:1.5;//"сбросим" тэг, дабы компилятор не ругался
printf("\n\n%0.1f\n\n", int);//Выведем нашу целочисленную переменную, используя спецификатор вещественного типа
}
В консоли ты увидишь "1.5", хотя, казалось бы, мы пытаемся просунуть в целочисленную переменную вещественный тип данных.

То же самое и с bool

main()
{
new bool:var;
var = bool:7;
printf("\n\n%d\n\n", var);//Отобразит "7", хотя, по идее, в переменную типа boolean нельзя записать значения, отличные от true/false
}

Pawn - не типизированный язык.

UPD: И да, это не означает, что нужно повсеместно использовать эту "фичу" языка. Тэги для того и были придуманы, чтоб:
1) Защитить скриптера от возможных ошибок при записи одних "типов" данных в места, не предназначенные для этого.
2) Улучшить читаемость.



Автор:
Вот тут (https://pastebin.com/M0Wu60F7) я как-то писал для одного нехорошего человека функцию, которая позволяла бы, вроде, делать форматирование запросов сразу внутри этой функции (писал уже давно и сейчас лень вникать. Но код, сразу говорю, не самый лучший, ибо это больше эксперимент, который заброшен на пол пути и не доведён до ума). И там видно как можно реализовать определение типа переданного аргумента

Ashmy
02.11.2017, 00:07
Это теги для компилятора. А вещественные числа вообще подтянуты разработчиком сампа со стороны и существуют лишь благодаря функциям, которые отдельно работают с этими числами. Вот тебе простое доказательство


main()
{
new int;
int = _:1.5;//"сбросим" тэг, дабы компилятор не ругался
printf("\n\n%0.1f\n\n", int);//Выведем нашу целочисленную переменную, используя спецификатор вещественного типа
}
В консоли ты увидишь "1.5", хотя, казалось бы, мы пытаемся просунуть в целочисленную переменную вещественный тип данных.

То же самое и с bool

main()
{
new bool:var;
var = bool:7;
printf("\n\n%d\n\n", var);//Отобразит "7", хотя, по идее, в переменную типа boolean нельзя записать значения, отличные от true/false
}

Pawn - не типизированный язык.

UPD: И да, это не означает, что нужно повсеместно использовать эту "фичу" языка. Тэги для того и были придуманы, чтоб:
1) Защитить скриптера от возможных ошибок при записи одних "типов" данных в места, не предназначенные для этого.
2) Улучшить читаемость.



Автор:
Вот тут (https://pastebin.com/M0Wu60F7) я как-то писал для одного нехорошего человека функцию, которая позволяла бы, вроде, делать форматирование запросов сразу внутри этой функции (писал уже давно и сейчас лень вникать. Но код, сразу говорю, не самый лучший, ибо это больше эксперимент, который заброшен на пол пути и не доведён до ума). И там видно как можно реализовать определение типа переданного аргумента
Мне как раз определение и нужно было для реализации функции отправки запроса, но, я уже определился с тем, как можно сделать проще и лучше. Спасибо за помощь

DeimoS
02.11.2017, 00:22
Мне как раз определение и нужно было для реализации функции отправки запроса, но, я уже определился с тем, как можно сделать проще и лучше. Спасибо за помощь

Ну так поделись с остальными своей идеей, раз уж нашёл своё решение :)

Daniel_Cortez
02.11.2017, 12:57
А вещественные числа вообще подтянуты разработчиком сампа со стороны
Не "разработчиком сампа", а лично автором Pawn. Разрабы SA-MP добавили только несколько тригонометрических функций: asin(), acos(), atan() и atan2().