Введение
Самые известные баги стандартного компилятора "Pawno" и их исправление.
1)
PHP код:
return "Some string";
Возвращая строки напрямую компилятор падает ( краш ).
Создайте для вашей строки массив, далее возвратите её ( не рекомендуется возвращать большие строки ).
PHP код:
static const
some_text[] = "Some String";
return some_text;
2)
PHP код:
string = (a == 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 = (a == 5) ? ("это пять") : ("это не пять");
3)
PHP код:
new
gGlobalVariable = SomeFunction();
Вызывая функцию для инициализации глобальной переменной компилятор падает ( краш ).
Вызовите функцию для инициализации переменной в "OnGameModeInit", "OnFilterScriptInit", или "main":
PHP код:
new
gGlobalVariable;
public OnGameModeInit()
{
gGlobalVariable = SomeFunction();
// некоторый код
}
4)
Необязателен.
Максимальная длина строки в компиляторе 512 символов ( считая с завершающим символом '\0' ).
Сократить текст со строкой. Обычно люди делают это так:
PHP код:
format(str, sizeof(str),
"Очень длинная строка",
other,
parameters);
Это разделяет вызов функции на 4 строки, делая её короче. Однако это решение далеко не хорошее. Даже иногда может откуда не возьмись возникнуть падения компилятора ( краш ).
5)
PHP код:
new
gVar;
stock SomeFunction()
{
#if defined main
gVar = (gVar ? 0 : 1);
#endif
return 1;
}
main()
{
return SomeFunction() ? 0 : 1;
}
Данный код будет генерироваться следующим образом: Сначала сгенерируется код в функции ( SomeFunction ), далее сгенерируется код в main (изначально компилятор "не знает", что "main" инициализируется позже). В результате, по неизвестной причине, любые другие тернарные операторы в вашем скрипте неверно сгенерируются и это приведёт к падению компилятора ( краш ).
Не используйте тернарный оператор для проверки на существование функции если функция ещё не определена или будет определена позже.
Автор урока: Y_Less
Перевод и дополнение: Londlem
Оригинал: http://forum.sa-mp.com/showthread.php?t=355877
Специально для: Pro-Pawn.Ru
Копирование данной статьи без разрешения автора запрещено!