Вопросы

KlasterK
Освоившийся

В format и sscanf есть конструкция "{Float, _}:...". Первую часть конструкции я понимаю, теги. Но что значит "..."? Можно ли эту конструкцию использовать в своих функциях, и как обращатся к ней? Я в какой-то функции видел "Float:oper1, ...", получается, нужно обращатся через oper1, oper2, oper3?

Поделиться сообщением


Ссылка на сообщение

2 ответа на этот вопрос

  • 0
Sleash
Завсегдатый

{Float,_}:.. обозначает неопределённое кол-во параметров, к примеру в том же использовании sscanf при вводе команды:

/goto 36 // тут только 1 параметр
/sethp 36 0 // тут уже 2 параметра

Не думаю, что это можно использовать в ваших фанкция (вроде как {Float,_}:.. идёт только для плагинов), но вы можете использовать вместо этого массив:

stock multiprint(texts[])
{
    for(i = 0; i < sizeof texts; i++) {
        print(texts[i]);
    } return 1;
}
// use:
main() {
    new a = rand(110);
    multiprint({1"asd", a, 32.7});
    return 1;
}

Вроде так

Поделиться сообщением


Ссылка на сообщение
  • 0
Cawfee
Великий Гуру
  В 8/23/2023 в 14:30, Sleash сказал:

вроде как {Float,_}:.. идёт только для плагинов

Читать далее...  

Есть лишь одна синтаксема языка Pawn, которая не имеет никакого смысла без подключения сторонних программ, и эта синтаксема – ключевое слово native.

 

  В 8/23/2023 в 07:05, KlasterK сказал:

{Float, _}:...

Читать далее...  

Для начала имеет смысл сказать пару слов о тегах. Для того, чтобы переменная или параметр функции могли принимать значение, принадлежащее определенному множеству значений, на уровне компилятора есть такая замечательная вещь как теги, использование которых, очевидно, помогает защитить себя от непреднамеренных ошибок. По умолчанию у всех переменных есть тег "_:", написание которого необязательно. Однако вы можете создавать свои собственные теги, чтобы, как уже было сказано, ограничить множество принимаемых значений.

 

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

  открыть спойлер

 

Отмечу, что присвоение тегированной переменной значения, не входящего в множество допустимых значений, влечет предупреждение компилятора о несовпадении тегов (tag mismatch). Однако, несмотря на предупреждение, переменная eShape получает значение SOME_VALUE2, эквивалентное нулю (что совпадает со значением TRIANGLE), и в окне консоли мы видим слово "Треугольник".

  открыть спойлер

 

Кроме того, можно попытаться присвоить и литерал. Однако в приведенном ниже примере вы все также можете увидеть предупреждение компилятора о несовпадении тегов. В окне консоли можно увидеть слово "Овал".

  открыть спойлер

 

Кроме того, можно попытаться смешать тегированные и нетегированные переменные, что также повлечет предупреждение компилятора, но в целом будет работать. В окне консоли можно увидеть слово "Квадрат".

  открыть спойлер

 

В примерах выше я никак не пытался удовлетворить компилятор в части несоответствия тегов. Однако, если вы хотите явным образом работать с переменными, теги которых не совпадают, вы можете искусственно изменить тег переменной или параметра функции. И таким образом, например, можем либо явно тегировать литералы, либо сбросить теги переменных.

new EShape:eShape = CIRCLE + EShape:1 + 1// 0 + 1 + 1 = 2

В случае, если вы хотите выполнить сравнение двух переменных, имеющих разные теги, вы также можете привести их к общему тегу (например, тег по умолчанию):

  открыть спойлер

 

 

Кроме того, из школьного курса математики вам должно быть известно, что фигурные скобки есть множество, а элементы внутри этих скобок – элементы множества. Выражение "{Float,_}:" содержит множество тегов, которые могут быть получены как аргументы функции. Вам ничто не мешает вписать в это множество и свои собственные теги:

someFunction({Float,_,EShape, ESomeEnum}:...) {
    // тело функции
}

main() {

    new EShape:eShape = CIRCLE;
    new ESomeEnum:eSomeEnum = SOME_VALUE1;

    someFunction(eShape, eSomeEnum);
}

Кроме того, вы можете и не перечислять все теги, что не понравится компилятору: он выдаст предупреждение, поскольку функция не ожидает получить на вход переменные, снабженные неизвестными для нее тегами.

someFunction({Float,_}:...) {
    // тело функции
}

main() {

    new EShape:eShape = CIRCLE;
    new ESomeEnum:eSomeEnum = SOME_VALUE1;

    someFunction(eShape, eSomeEnum);
}

Однако для разрешения возникшей проблемы можно просто привести переменные к тегу по умолчанию:

someFunction({Float,_}:...) {
    // тело функции
}

main() {

    new EShape:eShape = CIRCLE;
    new ESomeEnum:eSomeEnum = SOME_VALUE1;

    someFunction(_:eShape, _:eSomeEnum);
}

 

Теперь что касается самих параметров. Как вы уже могли заметить по функциям вроде printf, SendClientMessage и прочим – все они могут получать на вход переменное число аргументов: либо ни одного, либо не меньше некоторого натурального числа N. Поскольку программист на этапе написания программы и сам не имеет понятия, сколько аргументов в конкретном случае будет передано в функцию, работа с параметрами функции идет посредством обращения в стек: указываем порядковый номер параметра и вытаскиваем из стека значение этого параметра. Узнать, сколько передано параметров в функцию, можно при помощи функции numargs, а обратиться к некоторому параметру – с помощью функции getarg. Ниже приведен пример использования функции с переменным числом аргументов.

 

  открыть спойлер

 

Результат в консоли представлен далее.

  открыть спойлер

 

Но, будем честны, мне сложно представить ситуацию, при которой появляется необходимость в написании функции с переменным числом аргументов.

Поделиться сообщением


Ссылка на сообщение
Гость
Эта тема закрыта для публикации ответов.
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Похожий контент

    • whccompany
      От whccompany
      World Hosting Corporations 
                                                                GTA Game Host 
                                               CRMP PC& Mobile Project 
                                           Rostov Role Play | Rostov RP 
      Друзья, нашему проекту срочно требуется маппер для масштабного маппинга, нам требуется сделать:
      1) Городской маппинг (удалить города и создать новые города, сначало необходимо создать город Ростов-на-Дону ; посёлок Коксовый и село Ряженое, создать используя стоковые фотографии из Яндекса и Гугла)
      2) Фракционный маппинг ( Текстуры + Экстерьер + Интерьер )
      3) Маппинг работ ( Текстуры + Экстерьеры + Интерьеры )
      Бюджет до 60 000 рублей
      Возможно заключение трудового контракта 
      Пишите: ВКонтакте

    • gooding
      От gooding
      Всем здравствуйте, уважаемые читатели. Я много времени потратил на доработку данного игрового мода, чтобы его выставить на форум.
      Лог доработок можно посмотреть внизу, а скриншоты игрового мода внизу и верху.
       
       

    • gooding
      От gooding


      Скачать файл PAR RP | Уникальный мод без багов
      Всем здравствуйте, уважаемые читатели. Я много времени потратил на доработку данного игрового мода, чтобы его выставить на форум.
      Лог доработок можно посмотреть внизу, а скриншоты игрового мода внизу и верху.
       
       

      Добавил gooding Добавлено 20.11.2024 Категория Моды Автор GOODING (Я)  
    • Kalinin
      От Kalinin
      1. Набираю команду для создания CRMP сервера.
      2. Вакансии  которые свободны. Связь через TG @kalinin_sql
      Нам нужны;
      1.Кодеры
      2.Маперы
      3.СММ
      Так-же дружная работа. По поводу зарплаты будем обговаривать все лично в беседе ТГ