Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 14 из 22 ПерваяПервая ... 4 12 13 14 15 16 ... ПоследняяПоследняя
Показано с 131 по 140 из 216
  1. #131
    Аватар для Pa4enka
    Пользователь

    Статус
    Оффлайн
    Регистрация
    22.04.2016
    Адрес
    Украина
    Сообщений
    157
    Репутация:
    35 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    А как компилятор должен определять "правильное" значение? Ведь значением по умолчанию не обязательно "0" может быть.
    Здесь смысл не в 1/0, а в том что в одном блоке существует два присвоение одной и той же переменной. То есть, значение было ранее присвоено, но где-то ниже переопределено ещё раз(без всяких проверок и тд).
    Последний раз редактировалось Pa4enka; 22.01.2020 в 21:32.

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от Pa4enka Посмотреть сообщение
    Интересно, а возможно ли расширить функционал компилятора до возможности определять повторяющиеся присвоения переменной в определенном блоке кода? Данное предложения похоже на warning 210, ибо так же анализирует код с его логической стороны.
    Не только можно, но и я его уже реализовал ещё осенью прошлого года (и, к слову о warning 210, многие куски кода таки были позаимствованы оттуда), просто дело так и не дошло до PR, да и не уверен, есть ли вообще смысл что-то предлагать сейчас разработчикам компилятора, если они до сих пор не решаются принять warning 210, и при этом не могут дать вразумительного аргумента против этой фичи (ИМХО, "инициализация нулём по умолчанию хорошо определена" - очень сомнительный аргумент, т.к. этому в официальной документации (Pawn Language Guide) посвящено всего одно предложение (которое дословно так и переводится "все переменные по умолчанию равны нулю"), без какого-либо объяснения, чем оправдана такая логика и чем это лучше предупреждений о неинициализированных переменных).

    Касаемо самой проблемы, я так понимаю, можно упростить пример до
    1. main()
    2. {
    3. new x = 0;
    4. x = 1; // warning 240: previously assigned value is unused
    5. return x;
    6. }

    На днях, как будет время (может быть даже на этих выходных), попробую сделать PR с этой фичей, а заодно и issue по switch-выражениям.



    Цитата Сообщение от DeimoS Посмотреть сообщение
    А как компилятор должен определять "правильное" значение? Ведь значением по умолчанию не обязательно "0" может быть.
    Эм... никак? Ибо компилятор не может знать о контексте применения кода, это задача пользователя.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

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

    Статус
    Оффлайн
    Регистрация
    22.04.2016
    Адрес
    Украина
    Сообщений
    157
    Репутация:
    35 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    На днях, как будет время (может быть даже на этих выходных), попробую сделать PR
    Nice job ;)

    Будем надеяться, что разработчики таки примут предложение от юзеров и внесут изменение в компилятор. А если же этого не случится - будем использовать твой вариант на постоянной основе.

    И да, я думаю комьюнити оценит любые доработки. Тем более, мы не платим за его использование и имеем право выбора. А экспериментировать и обсуждать никто не запрещал)

  4. #134
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Эм... никак? Ибо компилятор не может знать о контексте применения кода, это задача пользователя.
    Я, собственно, о том и хотел сказать :) Хотел так же про "warning 240" от тебя написать и описать все "подводные камни", которые мы обсуждали, но решил, что ты сам напишешь о нём, если вдруг решишь ответить.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

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

    Статус
    Оффлайн
    Регистрация
    01.09.2019
    Сообщений
    121
    Репутация:
    26 ±
    @Daniel_Cortez, не планируешь в своем форке сделать инициализацию "саб-массивов" через прогрессию? (...)

    1. new array_3d[5][3][3] =
    2. {
    3. {
    4. {1, 2, 3},
    5. {4, 5, ...},
    6. ...
    7. },
    8. {
    9. {1, 2, 3},
    10. ...
    11. },
    12. ...
    13. };
    14.  
    15.  
    16. main()
    17. {
    18. for (new i = 0; i < sizeof(array_3d); i++)
    19. {
    20. for (new j = 0; j < sizeof(array_3d[]); j++)
    21. {
    22. for (new g = 0; g < sizeof(array_3d[][]); g++)
    23. {
    24. printf("array_value: %d", array_3d[i][j][g]);
    25. }
    26. }
    27. }
    28. }


    Сейчас это выдает ошибку при компиляции:

    error 001: expected token: "{", but found "..."
    error 001: expected token: "}", but found ";"

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от tnc Посмотреть сообщение
    @Daniel_Cortez, не планируешь в своем форке сделать инициализацию "саб-массивов" через прогрессию?
    Во-первых, нет, не планирую, ибо понятия не имею, как работает тот спагетти-код для инициализации массивов.
    Во-вторых, нет никакого "моего форка", была только пара-тройка неофициальных релизов с исправленными багами. Даже если бы я и захотел создать свой форк, была бы проблема с тем, как отличить его от форка Zeex'а - в последнем есть константы "__Pawn" и "__PawnBuild", но мне пришлось бы вводить свои константы и свою нумерацию версий, чтобы избежать "пересечений" с тем форком, не говоря уже о том, чтобы убедить скриптеров по всему миру переписать свои скрипты с учётом этих новых констант (в то время, как ещё со стокового компилятора 3.2.3664 не все хотят слезать).

    Цитата Сообщение от DeimoS Посмотреть сообщение
    Хотел так же про "warning 240" от тебя написать и описать все "подводные камни", которые мы обсуждали, но решил, что ты сам напишешь о нём, если вдруг решишь ответить.
    Не припоминаю, чтобы мы обсуждали какие-то "подводные камни" по warning 240. Разве что единственный недостаток, что моя реализация пока что обнаруживает неиспользуемые присвоения только к одиночным переменных. Для массивов потребовалось бы гораздо больше изменений как в структурах хранения данных, так и в логике компилятора.

    Как бы то ни было, пока что я оставлю реализацию как есть, т.е. только для одиночных переменных. Если примут её в таком виде, то тогда и только тогда будет смысл пытаться что-то химичить с массивами, иначе это будет просто пустая трата времени.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

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

    Статус
    Оффлайн
    Регистрация
    01.09.2019
    Сообщений
    121
    Репутация:
    26 ±
    А что конкретно не понятно? Да это усложняет чтение кода, но это было бы круто, если бы была такая возможность инициализации массивов. Это идею предлагал и @ziggi
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    ибо понятия не имею, как работает тот спагетти-код для инициализации массивов.

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Вышла новая версия 3.10.10.

    Скачать: https://github.com/Zeex/pawn/releases/tag/v3.10.10

    Примечание: Начиная с данной версии требуется использовать модифицированные инклуды SA-MP, иначе у вас появится куча новых warning 239 (т.к. в стандартных инклудах не исправлена проблема с const-корректностью). Просто скачайте их по этой ссылке (click) и скопируйте инклуды из архива в папку "pawno/include".

    Изменения:
    • Добавлены новые директивы #pragma unread и #pragma unwritten, которые позволяют подавить предупреждения о том, что значение символа (переменной/константы/функции) нигде не считывается или не изменяется соответственно.
      Принцип работы этих директив схож с уже существующей #pragma unused, однако позволяют подавлять отдельно только предупреждения о том, что значение символа не считывается, и отдельно, что не изменяется, тем самым лучше показывая намерения скриптера.

    • Добавлена директива #pragma nodestruct, которая инструктирует компилятор не вызывать деструктор при уничтожении локальной переменной.
      Примечание (DC): Да, оказывается, в Pawn для переменных с любым тегом, кроме "_", можно создать деструктор - функцию, которая автоматически вызывается по окончании существования локальных переменных с заданным тегом.

    • Исправлен выход за пределы массива в коде упаковки данных (функция encode_cell()), который в редких случаях мог спровоцировать отключение сжатия файла *.amx с выводом сообщения "warning 232: output file is written, but with compact encoding disabled".

    • Добавлен оператор __addressof (#445).

    • Препроцессорный листинг (файл *.lst) теперь записывается после второго прохода препроцессора, т.е. именно в таком виде, в каком код в дальнейшем компилируется.

    • Обеспечено игнорирование неизвестных препроцессорных директив внутри #if/endif (#427).

    • Серия исправлений и улучшений, связанных с оператором __emit:
      • Добавлены псевдо-опкоды, которые можно использовать в макросах с операндами любого типа:
        • load.u.pri/alt - загрузить значение операнда (может быть выражением) в PRI/ALT.
        • stor.u.pri/alt - сохранить значение PRI/ALT в операнд.
        • addr.u.pri/alt - загрузить адрес операнда в PRI/ALT.
        • push.u - сохранить значение (может быть выражением) в стек.
        • push.adr.u - сохранить адрес операнда в стек.
        • zero.u - обнулить операнд.
        • inc.u/dec.u - увеличить/уменьшить значение операнда на 1.

        Пример использования:
        1. #define getval(%0) __emit(load.u.pri %0)
        2. #define addrof(%0) __emit(addr.u.pri %0)
        3.  
        4. const global_const = 0x1234;
        5. new global_var = 0x5678;
        6.  
        7. main()
        8. {
        9. const local_const = 0x4321;
        10. new local_var = 0x8765;
        11. static local_static_var = 0x9ABC;
        12. static local_static_array[2];
        13.  
        14. printf("%08x", getval(global_const)); // 00001234
        15. printf("%08x", getval(global_var)); // 00005678
        16. printf("%08x", getval(local_const)); // 00004321
        17. printf("%08x", getval(local_var)); // 00008765
        18. printf("%08x", getval(local_static_var + global_const)); // 0000ACF0
        19. printf("%08x", addrof(global_var)); // 00000000
        20. printf("%08x", addrof(local_var)); // 00004094
        21. printf("%08x", addrof(local_static_var)); // 00000004
        22. printf("%08x", addrof(local_static_array[1])); // 0000000C
        23. }

      • Компилятор теперь выдаёт ошибку, если смещение в стеке или адрес данных не кратен размеру ячейки (т.е. 4 байтам).
        1. __emit load.s.pri 5; // error 011: stack offset/data address must be a multiple of cell size

      • Устранено падение, возникавшее когда с помощью __emit вызывается нативная функция, которая ранее ещё нигде не вызывалась.

      • Удалена проверка значений операндов (индексов) для инструкций lctrl и sctrl.

      • Опкоды stor.s.pri/alt, inc.s, dec.s, и zero.s больше не принимают аргументы функций, переданные по ссылке.

      • Разрешены отрицательные смещения для аргументов типа "локальная переменная" (такие смещения требуются для доступа к аргументам функций).

      • Исправлено множество случаев, когда при несоответствии типов аргументов в сообщениях об ошибках выводились неправильные названия типов.

      • Удалёно ключевое слово emit, оставлено только __emit (для соответствия новому правилу, согласно которому новые операторы должны начинаться с "__").


    • Исправлено падение компилятора, происходившее при использовании #error и #warning без указания текста ошибки/предупреждения.

    • Исправлено падение компилятора, когда после #pragma option параметр был длиннее 31 символа.

    • Исправлен неправильный вывод названия массива, когда оператор sizeof использовался на массиве неопределённого размера.
      1. Func(const arr[])
      2. {
      3. // До исправления: warning 224: indeterminate array size in "sizeof" expression (symbol "")
      4. // После: warning 224: indeterminate array size in "sizeof" expression (symbol "arr")
      5. return sizeof(arr);
      6. }

    • Исправлены ложные предупреждения о const-корректности (warning 239) в функциях, имеющих несколько реализаций для разных состояний автоматонов (state).

    • Исправлен баг, из-за которого компилятор при опечатке предлагал переменную до того, как она была реализована (#374).
      1. GetValue()
      2. {
      3. return value; // error 017: undefined symbol "value"; did you mean "value"?
      4. // Очевидно, что переменная "value" не должна быть видна отсюда, т.к. она объявлена только ниже.
      5. }
      6.  
      7. new value = 0;
      8.  
      9. main()
      10. {
      11. GetValue();
      12. }

    • Исправлен баг, из-за которого компилятор при опечатке не предлагал функцию, если ошибка допущена перед реализацией функции (#397).
      1. main()
      2. {
      3. // Здесь компилятор должен предложить функцию "DoNothing", но он этого не делает,
      4. // хоть в Pawn функции и могут вызываться до своего объявления и реализации.
      5. DoNothin(); // error 017: undefined symbol "DoNothin"
      6. }
      7.  
      8. DoNothing(){}


    • Устранено падение компилятора из-за попытке при опечатки предложить переменную с пустым названием (#451).

    • Исправлено некорректное сообщение об ошибке, выдаваемое, когда переменная, имеющая состояние, используется вне своей области видимости (т.е. вне функции, имеющей то же состояние).
      1. new var <state_a>;
      2.  
      3. main()
      4. {
      5. // До исправления: test.pwn(5) : error 017: undefined symbol "var"; did you mean "var"?
      6. // После: test.pwn(5) : error 017: undefined symbol "var"; state variable out of scope
      7. var = 5;
      8. }

    • Исправлено некорректное сообщение об ошибке, выдаваемое, когда функции, принимающей массив, передаётся ячейка массива, переданного из другой функции по ссылке.
      1. Func2(const arr[3])
      2. {
      3. return arr[0];
      4. }
      5.  
      6. Func1(const arr[])
      7. {
      8. // До исправления: error 007: operator cannot be redefined
      9. // После: error 047: array sizes do not match, or destination array is too small
      10. Func2(arr[0]);
      11. }
      12.  
      13. main()
      14. {
      15. static const arr[1];
      16. Func1(arr);
      17. }

    • Исправлена некорректная фатальная ошибка (error 106), выдаваемая, когда компактное кодирование (LEB128) файла *.amx неэффективно и разница между сжатыми и несжатыми данными составляет меньше 63 байт (вместо ошибки компилятор должен выдавать только предупреждение, что компактное кодирование оказалось невыгодно и файл записан несжатым (warning 232)).
      1. main()
      2. {
      3. // Примечание: При компактном кодировании '0xAABBCCDD' плохо сжимается
      4. // и занимает 5 байт вместо 4, тем самым делая сжатие неэффективным.
      5. static const a[32] = { 0xAABBCCDD, ... };
      6. return a[0];
      7. // До исправления: fatal error 106: compiled script exceeds the maximum memory size (1521262808 bytes)
      8. // После: warning 232: output file is written, but with compact encoding disabled
      9. }

    • Исправлена фатальная ошибка, возникавшая при компиляции кода, в котором используется хотя бы одна из встроенных строковых констант (__file, __date, __time) и есть хотя бы одна функция, имеющая состояния.
      1. #include <a_samp>
      2.  
      3. public OnGameModeInit()<automaton1:STATE1>{}
      4.  
      5. main()
      6. {
      7. // /home/travis/build/Zeex/pawn/source/compiler/sc4.c:76: writeleader: Assertion `glb_declared==0' failed.
      8. printf("File: %s", __file);
      9. }

      Баг не проявлялся под Windows, однако ему были подвержены релизы компилятора для Linux и OS X.

    • Исправлен баг с возможностью для локальных переменных инициализироваться самими собой.
      1. main()
      2. {
      3. // До исправления: нет сообщения об ошибках
      4. // После: error 017: undefined symbol "test"
      5. new test = test;
      6. }

      Что интересно, до исправления компилятор не выдавал даже предупреждения о том, что переменная в данном примере никак не использоована. Это связано с тем, что при такой инициализации компилятор засчитывал и чтение, и запись в переменную, и потому считал, что она полноценно используется.


    • Исправлен баг с игнорированием тегов в анонимных enum.
      1. enum // Название не указано, тег тоже (следовательно,
      2. { // все константы внутри enum будут с тегом "_")
      3. Float:DRAW_DISTANCE = 100.0
      4. // ДО ИСПРАВЛЕНИЯ: код скомпилируется, но компилятор молча проигнорирует тег "Float:",
      5. // и если кто-то попытается использовать эту константу, то вместо вещественного "100.0"
      6. // получит целочисленное "_:100.0" (т.е. "1120403456", ибо приведение тега - это не конверсия).
      7. // ПОСЛЕ ИСПРАВЛЕНИЯ: error 001: expected token: "-identifier-", but found "-label-"
      8. };
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  9. 6 пользователя(ей) сказали cпасибо:
    DeimoS (09.02.2020) execution (09.02.2020) L0ndl3m (25.02.2020) Osetin (14.02.2020) Pa4enka (09.02.2020) SteveStage (09.02.2020)
  10. #139
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    (Если вы ещё не видели, выше пост с релизом компилятора 3.10.10).

    От себя добавлю, что процесс работы над компилятором всё ещё оставляет желать лучшего:
    • Мейнтейнеры подготовили релиз только после того, как я вчера "как бы невзначай" напомнил им, что прошло уже полтора года и, может быть, пора бы уже что-нибудь выкатить. (Я мог бы и раньше это сделать, создав отдельный issue, но это, как минимум, выглядело бы некрасиво.)
    • Куча PR'ов, находящихся в очереди на принятие, были попросту проигнорированы перед релизом - включая даже те из них, которые уже были рассмотрены и одобрены.


    В ближайшее время попробую подготовить неофициальный билд с теми PR'ами, которые не расширяют сам язык Pawn и не ломают совместимость.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  11. #140
    Аватар для SteveStage
    Пользователь

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    • Исправлен баг с игнорированием тегов в анонимных enum.
      1. enum // Название не указано, тег тоже (следовательно,
      2. { // все константы внутри enum будут с тегом "_")
      3. Float:DRAW_DISTANCE = 100.0
      4. // ДО ИСПРАВЛЕНИЯ: код скомпилируется, но компилятор молча проигнорирует тег "Float:",
      5. // и если кто-то попытается использовать эту константу, то вместо вещественного "100.0"
      6. // получит целочисленное "_:100.0" (т.е. "1120403456", ибо приведение тега - это не конверсия).
      7. // ПОСЛЕ ИСПРАВЛЕНИЯ: error 001: expected token: "-identifier-", but found "-label-"
      8. };
    Объяснишь поконкретнее?) Т.е. теперь тэг энума (_:) не распространяется на его составляющие? Или что имелось ввиду?
    Последний раз редактировалось SteveStage; 09.02.2020 в 00:18.

 

 
Страница 14 из 22 ПерваяПервая ... 4 12 13 14 15 16 ... ПоследняяПоследняя

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

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

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

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

Ваши права

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