Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 12 из 14 ПерваяПервая ... 2 10 11 12 13 14 ПоследняяПоследняя
Показано с 111 по 120 из 135
  1. #111
    Аватар для Fallen A.
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.09.2015
    Адрес
    Минск, БССР
    Сообщений
    231
    Репутация:
    18 ±
    Многое, о чем ты говоришь - для меня темный лес, т.к. с c++ не знаком. Однако, рискну предположить, что можно реализовать без хранения и просто при сборке проекта проверять каждую функцию. Если я чего-то недопонимаю, то поправьте меня.

  2. #112
    Аватар для Геннадий Литвинов
    Пользователь

    Статус
    Оффлайн
    Регистрация
    29.08.2019
    Адрес
    Казахстан
    Сообщений
    8
    Репутация:
    0 ±
    Вот если ещё табулирование было как NotePad + то вообще класс было бы ...

  3. #113
    Аватар для Pa4enka
    Пользователь

    Статус
    Оффлайн
    Регистрация
    22.04.2016
    Адрес
    Украина
    Сообщений
    92
    Репутация:
    13 ±
    Цитата Сообщение от Геннадий Литвинов Посмотреть сообщение
    Вот если ещё табулирование было как NotePad + то вообще класс было бы ...
    Эм.. что? Здесь обсуждается компилятор, а не редактор кода.

  4. #114
    Аватар для vvw
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.08.2019
    Сообщений
    43
    Репутация:
    6 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Да, приходила в голову подобная идея, как для SetTimerEx()/CallLocalFunction()/CallRemoteFunction(), так и для format()/printf(), тем более в популярных компиляторах для C/C++ (MSVC, GCC, Clang) нечто подобное уже давно есть.
    С точки зрения пользователя да, вроде бы простая и полезная фича, но вот как это примерно может выглядеть с точки зрения разработчика:
    • В компиляторах для тех же C/C++ такая возможность реализуется через нестандартные расширения. Например, в glibc заголовок функции printf() объявлен с постфиксом "__attribute__((format(printf, 1, 2)))".
    • Следовательно, в компиляторе Pawn сначала потребуется реализовать оператор __attribute (возможность создания этого оператора уже обсуждалась в одном из issue в репо компилятора год назад, поэтому я более чем уверен, что мейнтейнеры будут настаивать именно на таком варианте). У этого оператора одним из возможных аргументов будет format, а у того, в свою очередь параметром будет либо printf (т.е. "__attribute format printf"), либо тот формат спецификаторов, который применим к SetTimerEx()/CallLocalFunction()/CallRemoteFunction() - и если с названием "printf" всё очевидно, для этого формата я понятия не имею, как его можно назвать.
    • Также непонятно, где можно было бы хранить информацию о нестандартном атрибуте функции (т.е. флаги присутствия атрибутов, позицию форматной строки, и позицию, с которой начинаются соответствующие аргументы). Создавать для этой цели отдельные поля в структуре symbol - такое себе быдлокодерское решение, т.к. это увеличит расход памяти под все виды идентификаторов, т.е. и под функции, и под переменные, и под константы.

    И это только те подводные камни, которые я сейчас смог вспомнить сходу; уверен, при попытке реализации всплывёт ещё больше проблем. Я ни в коем случае не утверждаю, что идея сама по себе плохая, но то, что воплотить её будет затруднительно - факт. Я могу взяться за её реализацию, но позже, как только закончу с другими экспериментальными фичами, коих у меня уже скопилось несколько штук в локальном репо.
    В структуре symbol для функции уже предоставлен список аргументов со всеми тегами и прочим. Нам нужно лишь сделать универсальный оператор __attribute (format(...)), который будет сообщать строку с форматом и началом переменного кол-ва аргументов (variadic args). Хранить строки вероятно в отдельном списке. Номер ячейки из списка хранить в union x, записав stacksize и идентификатор из таблицы в виде структуры struct func. Памяти будет использовано гораздо меньше, чем мы бы создавали на каждый символ в отдельном поле.

    Дополнительный список лучше сделать из-за переменного кол-ва аргументов (их может очень быть много). Можно сделать union для других attribute-параметров.

    P.S. мб где-то сказал глупость, но я это так себе представляю.

    Цитата Сообщение от Fallen A. Посмотреть сообщение
    Pawn не так уж и плох, как язык выходного дня.
    Ты прав, он годится только для handmade проектов.
    Последний раз редактировалось vvw; 11.09.2019 в 03:39.

  5. #115
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,065
    Репутация:
    2449 ±
    Цитата Сообщение от vvw Посмотреть сообщение
    Ты прав, он годится только для handmade проектов.
    Так SA-MP - это по сути и есть handmade-проект.

    Цитата Сообщение от vvw Посмотреть сообщение
    Нам нужно лишь сделать универсальный оператор __attribute (format(...)), который будет сообщать строку с форматом и началом переменного кол-ва аргументов (variadic args).
    Я примерно так и описывал его в своём посте выше, разве что без скобок (они не являются обязательными в defined, sizeof и tagof, поэтому для __attribute есть смысл обеспечить ту же логику).

    Цитата Сообщение от vvw Посмотреть сообщение
    В структуре symbol для функции уже предоставлен список аргументов со всеми тегами и прочим. Хранить строки вероятно в отдельном списке. Номер ячейки из списка хранить в union x, записав stacksize и идентификатор из таблицы в виде структуры struct func. Памяти будет использовано гораздо меньше, чем мы бы создавали на каждый символ в отдельном поле.
    Переменная stacksize объявлена как long - это означает, что в зависимости от компилятора/целевой платформы её размер может быть не только 4, но и 8 байт. Если её и новую переменную объединить в struct, то в сумме их размер может превысить размер struct array.

    Как бы то ни было, я только что создал PR'ы с двумя новыми фичами - __addressof и __fallthrough (последняя, к слову, почему-то не очень нравится мейнтейнерам). На следующих выходных попробую реализовать __attribute, если время позволит.
    Индивидуально в PM и Skype по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  6. 2 пользователя(ей) сказали cпасибо:
    DeimoS (15.09.2019) vvw (15.09.2019)
  7. #116
    Аватар для vvw
    Пользователь

    Статус
    Оффлайн
    Регистрация
    09.08.2019
    Сообщений
    43
    Репутация:
    6 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Переменная stacksize объявлена как long - это означает, что в зависимости от компилятора/целевой платформы её размер может быть не только 4, но и 8 байт. Если её и новую переменную объединить в struct, то в сумме их размер может превысить размер struct array.
    По сути для оператора __attribute нужно будет выделять поле в структуре symbol (указатель, ибо оператор опционален, чтобы хранить всю структуру в symbol), ибо (почти) каждый символ может быть реализован с помощью этого оператора, а специфичную информацию нужно где-то хранить.

    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Как бы то ни было, я только что создал PR'ы с двумя новыми фичами - __addressof и __fallthrough (последняя, к слову, почему-то не очень нравится мейнтейнерам). На следующих выходных попробую реализовать __attribute, если время позволит.
    Они просто очень любят goto. =) Идея с __addressof очень понравилась
    Последний раз редактировалось vvw; 16.09.2019 в 04:53.

  8. #117
    Аватар для tnc
    Пользователь

    Статус
    Оффлайн
    Регистрация
    01.09.2019
    Сообщений
    16
    Репутация:
    1 ±
    Не нашел в коде константу, которая отвечает за смещение часового пояса . Она есть? (Это было бы полезно, если делать версии мода датой [__date, __time])

    P.S: Если ее нет, то я сделаю PR.
    Последний раз редактировалось tnc; 23.09.2019 в 17:07.

  9. #118
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,065
    Репутация:
    2449 ±
    Цитата Сообщение от tnc Посмотреть сообщение
    Не нашел в коде константу, которая отвечает за смещение часового пояса . Она есть? (Это было бы полезно, если делать версии мода датой [__date, __time])

    P.S: Если ее нет, то я сделаю PR.
    Нет, и впервые вообще приходится слышать о необходимости в чём-то подобном (причём, не только в Pawn, но и даже в C/C++, из которых, собственно, и позаимствованы идеи с __date, __time, __file и __line).
    Можно поподробнее о том, как такая константа должна использоваться? Может быть я что-то не так понял.
    Индивидуально в PM и Skype по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  10. #119
    Аватар для tnc
    Пользователь

    Статус
    Оффлайн
    Регистрация
    01.09.2019
    Сообщений
    16
    Репутация:
    1 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Нет, и впервые вообще приходится слышать о необходимости в чём-то подобном (причём, не только в Pawn, но и даже в C/C++, из которых, собственно, и позаимствованы идеи с __date, __time, __file и __line).
    Можно поподробнее о том, как такая константа должна использоваться? Может быть я что-то не так понял.
    Допустим: использовать дату компиляции скрипта в роле версии мода. Если я живу в Екатеринбурге (допустим), то offset + 2 от Москвы. Как раз таки использую дату компиляции мода для версии мода и появилась проблема, что у второго разработчика не московское время, а нужно чтобы показывалось московское.
    Последний раз редактировалось tnc; 23.09.2019 в 19:06.

  11. #120
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,065
    Репутация:
    2449 ±
    Использовать дату и время для версионирования - очень плохая идея. Это не исключает возможности того, что вы и второй разработчик можете в одно и то же (или почти одно и то же) время сделать две разные версии мода с разным новым функционалом/багфиксами. Обычно для таких целей используют хеши коммитов из системы контроля версий, к примеру Git (т.е. можно организовать сборку с помощью файла *.bat или shell-скрипта, и в него перед сборкой добавить вызов git с целью узнать хеш текущего коммита и записать результат в файл *.inc).

    Либо вы можете попытаться решить проблему "в лоб", реализовав новую константу в компиляторе, но я очень сомневаюсь, что такое примут в апстрим, не говоря уже о том, что я понятия не имею, как вы будете писать тесты, чтобы они корректно воспроизводились во всех часовых поясах.
    Индивидуально в PM и Skype по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

 

 
Страница 12 из 14 ПерваяПервая ... 2 10 11 12 13 14 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •