Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 1 из 1
  1. #1
    Аватар для L0ndl3m
    Пользователь

    Статус
    Оффлайн
    Регистрация
    19.10.2013
    Адрес
    Ярославль
    Сообщений
    1,366
    Репутация:
    774 ±

    Самые известные баги компилятора

    Введение

    Самые известные баги стандартного компилятора "Pawno" и их исправление.

    1)

    • Код

    PHP код:
    return "Some string"
    • Проблема

    Возвращая строки напрямую компилятор падает ( краш ).

    • Решение

    Создайте для вашей строки массив, далее возвратите её ( не рекомендуется возвращать большие строки ).
    PHP код:
    static const
        
    some_text[] = "Some String";

    return 
    some_text
    2)

    • Код

    PHP код:
    string = (== 5) ? "это пять" "это не пять"
    • Проблема

    Строки конкатенируются (объединяются, соединяются) компилятором в одну, например это будет скомпилировано в одну строку "Hello World":
    PHP код:
    string "Hello" " " "World"
    Однако компилятор на засчитывает ":" как часть тернарного оператора и компилятор засчитывает это за ошибку скриптера. Обычно в таких случаях ( а обычно это так и есть ) появляется вот такая ошибка:
    Код:
    <path>\errors.pwn(11) : error 001: expected token: "-string end-", but found "-identifier-"
    Pawn compiler 3.2.3664	 	 	Copyright (c) 1997-2006, ITB CompuPhase
    1 Error.
    • Решение

    Чтобы это исправить, просто заключите строки в круглые скобки, хочу заметить, что на работоспособность кода это никак не влияет.
    PHP код:
    string = (== 5) ? ("это пять") : ("это не пять"); 
    3)
    • Код

    PHP код:
    new
        
    gGlobalVariable SomeFunction(); 
    • Проблема

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

    • Решение

    Вызовите функцию для инициализации переменной в "OnGameModeInit", "OnFilterScriptInit", или "main":
    PHP код:
    new
        
    gGlobalVariable;

    public 
    OnGameModeInit()
    {
        
    gGlobalVariable SomeFunction();
        
    // некоторый код

    4)
    • Код

    Необязателен.

    • Проблема

    Максимальная длина строки в компиляторе 512 символов ( считая с завершающим символом '\0' ).

    • Решение

    Сократить текст со строкой. Обычно люди делают это так:
    PHP код:
    format(strsizeof(str),
        
    "Очень длинная строка",
        
    other,
        
    parameters); 
    Это разделяет вызов функции на 4 строки, делая её короче. Однако это решение далеко не хорошее. Даже иногда может откуда не возьмись возникнуть падения компилятора ( краш ).

    5)
    • Код

    PHP код:
    new
        
    gVar;

    stock SomeFunction()
    {
        
    #if defined main
            
    gVar = (gVar 1);
        
    #endif
        
        
    return 1;
    }

    main()
    {
        return 
    SomeFunction() ? 1;

    • Проблема

    Данный код будет генерироваться следующим образом: Сначала сгенерируется код в функции ( SomeFunction ), далее сгенерируется код в main (изначально компилятор "не знает", что "main" инициализируется позже). В результате, по неизвестной причине, любые другие тернарные операторы в вашем скрипте неверно сгенерируются и это приведёт к падению компилятора ( краш ).

    • Решение

    Не используйте тернарный оператор для проверки на существование функции если функция ещё не определена или будет определена позже.

    Автор урока: Y_Less
    Перевод и дополнение: Londlem
    Оригинал: http://forum.sa-mp.com/showthread.php?t=355877


    Специально для: Pro-Pawn.Ru

    Копирование данной статьи без разрешения автора запрещено!

  2. 10 пользователя(ей) сказали cпасибо:
    #ball (09.07.2014) #Vito (17.07.2014) Amfy (26.10.2014) Elaid (10.11.2014) Mexanizm (30.11.2014) MR_BEN (08.07.2014) Nurick (08.07.2014) seriu (13.08.2014) Sersoftin (27.10.2014) [ForD] (21.02.2015)
 

 

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

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

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

Ваши права

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