Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 12 из 12 ПерваяПервая ... 2101112
Показано с 111 по 116 из 116
  1. #111
    Аватар для Fallen A.
    Пользователь

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

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

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

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

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

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

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

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

 

 
Страница 12 из 12 ПерваяПервая ... 2101112

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

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

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

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

Ваши права

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