Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 16 из 22 ПерваяПервая ... 6 14 15 16 17 18 ... ПоследняяПоследняя
Показано с 151 по 160 из 216
  1. #151
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от tnc Посмотреть сообщение
    ...
    Спасибо, что сообщили, и да, похоже на баг. Проявляется в версиях 3.10.1 - 3.10.10, отсутствует в 3.2.3664.
    1. const TD_0 = 0;
    2. enum { TD_1 = 1 };
    3. new Text: textdraws[10];
    4.  
    5. main()
    6. {
    7. textdraws[TD_0] = TextDrawCreate(0.0, 0.0, "-"); // на этой строке нет никаких предупреждений/ошибок
    8. textdraws[TD_1] = TextDrawCreate(0.0, 0.0, "-"); // warning 213: tag mismatch: expected tag none ("_"), but found "Text"
    9. }

    Судя по всему, проблема в том, что если в качестве индекса для ячейки массива используется элемент перечисления (вместо обычной константы, объявленной с помощью ключевого слова const), то тег такого элемента "перезаписывает" тег массива, из-за чего компилятор думает, что у ячейки массива тег "_:", а не "Text:".
    В принципе такая перезапись тега может быть использована, когда элемент перечисления принадлежит именованному массиву:
    1. enum ePlayerInfo
    2. {
    3. Float:pHealth
    4. };
    5. new player_info[MAX_PLAYERS][ePlayerInfo];
    6. // ...
    7. // `player_info` имеет тег `_:` (т.е. без тега), но результирующий тег
    8. // перезаписывается тегом из `pHealth`
    9. player_info[playerid][pHealth] = 100.0;

    что абсолютно логично, но соль в том, что, оказывается, это правило почему-то распространяется и на элементы анонимных перечислений (т.е. как в первом примере), чего по идее быть не должно, и таки этого нет в стоковом 3.2.3664.
    Пока что я создал issue на GitHub: https://github.com/pawn-lang/compiler/issues/514
    Исправление должно быть очень простым (достаточно добавить всего одну проверку, чтобы результирующий тег перезаписывался только если элемент перечисления принадлежит к именованному enum), но пока что желательно дождаться ответа от разработчиков; возможно, Y_Less что-нибудь возразит.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  2. #152
    Аватар для Salik_Davince
    Пользователь

    Статус
    Оффлайн
    Регистрация
    18.02.2014
    Сообщений
    93
    Репутация:
    1 ±
    Кстати можно вопрос, где можно увидеть списки параметров для компилятора?

    Вот у меня в моде некоторые функции используются до их объявления (прим.) -
    1. function PlayerConnect(playerid) {
    2. checkBan(playerid);
    3. }
    4.  
    5. stock checkBan(playerid) {
    6. code...
    7. }


    Знаю так кодить плохо, и компилятор выдаёт ошибку, но как разрешить такое через параметры или как можно вообще сделать такое?


    ---EDIT

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

    DoNothing(){}
    Вроде-бы должно было исправиться, да? Но скачал-поставил, то же самая проблема.
    Последний раз редактировалось Salik_Davince; 19.04.2020 в 22:04.

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от Salik_Davince Посмотреть сообщение
    Кстати можно вопрос, где можно увидеть списки параметров для компилятора?
    Открыть командную строку и в ней запустить pawncc без параметров - компилятор перечислит все возможные параметры и их описание (правда, на английском; возможно, кто-то раньше и делал перевод на русский язык, но я таких не припоминаю, за исключением одной совместной с Tracker1 работы, которая безнадёжно устарела).


    Цитата Сообщение от Salik_Davince Посмотреть сообщение
    Знаю так кодить плохо, и компилятор выдаёт ошибку, но как разрешить такое
    Не понимаю, о чём вы. В Pawn из коробки поддерживается использование функций до их объявления. Разве что компилятор может выдать предупреждение, если такая функция имеет тег (пример: функция возвращает здоровье игрока, т.е. значение с тегом "Float:"), но ошибок по идее быть не должно. Если компилятор выдаёт ошибку, дело может быть в макросах, которые "притворяются" функциями - их как раз нельзя использовать до объявления.


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

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

    Статус
    Оффлайн
    Регистрация
    18.02.2014
    Сообщений
    93
    Репутация:
    1 ±
    В Pawn из коробки поддерживается использование функций до их объявления.
    В данном случае что-то идёт не так, я ставил опции, -Z+, -Z, прагму - #pragma compat 1
    Но ошибки похожи на те что ниже ссылкой, точно такие же, только практически везде

    https://github.com/pawn-lang/compiler/pull/397

    Такой же баг, ошибки 017 // error 017: undefined symbol "abs... (функции)"

    И так практически по всем функциям, (stock, некоторые паблики), могу выдать мод для проверки, поймете о чем я.

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

    Статус
    Оффлайн
    Регистрация
    18.02.2014
    Сообщений
    93
    Репутация:
    1 ±
    Странно, является ли это багом компилятора? Либо что-то я сделал не так.

    Создал enum

    1. enum pTemp
    2. {
    3. tempID,
    4. tempName[MAX_PLAYER_NAME],
    5. tempGun[2]
    6. };
    7.  
    8. new PlayerTemp[MAX_PLAYERS][pTemp];


    То если я внутри свитча (switch)'a присваиваю название переменной PlayerTemp (tempName) через скобки другое название игроку (прим.) -

    1. switch(params)
    2. {
    3. case 1: PlayerTemp[playerid][tempName] = "Неизвестный";//(error 047: array sizes do not match, or destination array is too small)
    4. case 2: PlayerTemp[playerid][tempName] = "Известный";//(error 047: array sizes do not match, or destination array is too small)
    5. }


    То идет варнинг (error 047: array sizes do not match, or destination array is too small) -

    При логировании через printf - tempName пустая -
    1. printf("PlayerTemp[playerid][tempName] = %s", PlayerTemp[playerid][tempName]);//PlayerTemp[playerid][tempName] =



    -------------


    Но если это сделать через format - то все отлично (прим) -

    1. format(PlayerTemp[playerid][tempName], MAX_PLAYER_NAME, "Неизвестный");


    Никаких ошибок, через логирование printf'a выводит что PlayerTemp[playerid][tempName] = Неизвестный

    1. printf("PlayerTemp[playerid][tempName] = %s", PlayerTemp[playerid][tempName]);//PlayerTemp[playerid][tempName] = Неизвестный

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

    Статус
    Оффлайн
    Регистрация
    05.10.2019
    Адрес
    Планета Земля
    Сообщений
    318
    Репутация:
    7 ±
    Цитата Сообщение от Salik_Davince Посмотреть сообщение
    Странно, является ли это багом компилятора? Либо что-то я сделал не так.

    Создал enum

    1. enum pTemp
    2. {
    3. tempID,
    4. tempName[MAX_PLAYER_NAME],
    5. tempGun[2]
    6. };
    7.  
    8. new PlayerTemp[MAX_PLAYERS][pTemp];


    То если я внутри свитча (switch)'a присваиваю название переменной PlayerTemp (tempName) через скобки другое название игроку (прим.) -

    1. switch(params)
    2. {
    3. case 1: PlayerTemp[playerid][tempName] = "Неизвестный";//(error 047: array sizes do not match, or destination array is too small)
    4. case 2: PlayerTemp[playerid][tempName] = "Известный";//(error 047: array sizes do not match, or destination array is too small)
    5. }


    То идет варнинг (error 047: array sizes do not match, or destination array is too small) -

    При логировании через printf - tempName пустая -
    1. printf("PlayerTemp[playerid][tempName] = %s", PlayerTemp[playerid][tempName]);//PlayerTemp[playerid][tempName] =



    -------------


    Но если это сделать через format - то все отлично (прим) -

    1. format(PlayerTemp[playerid][tempName], MAX_PLAYER_NAME, "Неизвестный");


    Никаких ошибок, через логирование printf'a выводит что PlayerTemp[playerid][tempName] = Неизвестный

    1. printf("PlayerTemp[playerid][tempName] = %s", PlayerTemp[playerid][tempName]);//PlayerTemp[playerid][tempName] = Неизвестный
    Ты сейчас конечно бред сказал. Ты не можешь переуказать содержимое массива после его создания, только форматировать, так всегда в pawn было.

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

    Статус
    Оффлайн
    Регистрация
    01.09.2019
    Сообщений
    121
    Репутация:
    26 ±
    Цитата Сообщение от SteveStage Посмотреть сообщение
    Ты сейчас конечно бред сказал. Ты не можешь переуказать содержимое массива после его создания, только форматировать, так всегда в pawn было.
    Вообще можно через = приравнивать строки, если размер строк равен.

    ТС:

    PHP код:
    enum pTemp
    {
        
    tempID,
        
    tempName[MAX_PLAYER_NAME 1],
        
    tempGun[2]
    };
        
    new 
    PlayerTemp[MAX_PLAYERS][pTemp];

    main()
    {
        static const 
    name[][MAX_PLAYER_NAME 1] = 
        {
            
    "Неизвестный",
            
    "Известный"
        
    };
        
    PlayerTemp[0][tempName] = name[0];


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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от tnc Посмотреть сообщение
    Вообще можно через = приравнивать строки, если размер строк равен.
    Наверное, всё-таки, не "приравнивать", а "присваивать"? И да, присвоение возможно не только если размер массива-приёмника равен, но ещё и если он больше размера присваиваемого значения.


    Цитата Сообщение от Salik_Davince Посмотреть сообщение
    Создал enum

    1. enum pTemp
    2. {
    3. tempID,
    4. tempName[MAX_PLAYER_NAME],
    5. tempGun[2]
    6. };
    7.  
    8. new PlayerTemp[MAX_PLAYERS][pTemp];


    То если я внутри свитча (switch)'a присваиваю название переменной PlayerTemp (tempName) через скобки другое название игроку (прим.) -

    1. switch(params)
    2. {
    3. case 1: PlayerTemp[playerid][tempName] = "Неизвестный";//(error 047: array sizes do not match, or destination array is too small)
    4. case 2: PlayerTemp[playerid][tempName] = "Известный";//(error 047: array sizes do not match, or destination array is too small)
    5. }


    То идет варнинг (error 047: array sizes do not match, or destination array is too small)
    Компилятор всё делает правильно. Соль в том, что PlayerTemp[playerid][tempName] - это не массив, а только ячейка массива.
    enum - это не аналог struct из C/C++, это обычный оператор для перечислений, возможности которого были немного расширены по сравнению с enum в тех же C и C++.
    Т.е., такое перечисление:
    1. enum
    2. {
    3. eFieldA[10],
    4. eFieldB
    5. };

    и такое:
    1. enum
    2. {
    3. eFieldA,
    4. eFieldB = eFieldA + 10
    5. };

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

  9. #159
    Аватар для arcttic
    Пользователь

    Статус
    Оффлайн
    Регистрация
    30.05.2018
    Сообщений
    9
    Репутация:
    0 ±
    PHP код:
    static ac_KickWithCode(playeridip_address[], typecodecode2 0
    Связан с античитом, никто не сталкивался с подобным?

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

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от arcttic Посмотреть сообщение
    PHP код:
    static ac_KickWithCode(playeridip_address[], typecodecode2 0
    Связан с античитом, никто не сталкивался с подобным?
    Что это такое и как это связано с темой обсуждения (компилятор)?
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

 

 
Страница 16 из 22 ПерваяПервая ... 6 14 15 16 17 18 ... ПоследняяПоследняя

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

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

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

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

Ваши права

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