Да, действительно, в стоковом есть директива #assert. Я добавил в статью небольшое замечание об отличии #assert от #error.
Странно, я почему-то думал, что его приняли - спутал с каким-то другим, видимо. Добавил примечание в статье.
Вид для печати
Следует обновить статью, поскольку фикс был принят.
Кроме того, теперь можно обновить библиотеки, в которых есть обход данной ошибки, чтобы не генерировать бесполезный байт-код.
Скорее всего это опечатка, ведь в Pawn нет препроцессорной директивы '#elif', ибо вместо неё есть '#elseif'.
Следует заметить, что в инклюдах генерируется полный путь к файлу, а в исходных файлах только лишь название этого файла.
Можно было бы определить наличие фикса по значению в константе __PawnBuild, но его так и не повысили.
Да, действительно. Исправил.
Не совсем. Допустим, что сервер находится в папке "C:\MyServer". Для исходного файла выдаётся полное имя.
Пример:
Для инклуда, подключенного с указанием относительного пути, выдаёт относительный путь:Код:C:\MyServer\gamemodes\main.pwn
PHP код:
#include "../include/test.inc"
Для остальных способов подключения в __file тоже полное имя:Код:../include/test.inc
PHP код:
#include <test>
#include "test.inc"
#include <test.inc>
#include "test"
#include test
Код:C:\MyServer\pawno\include\test.inc
Похоже, компилятор не правильно компилирует конструкцию вида -
Выдаёт:PHP код:
if(clickedid == TD_join[3])
if(--model_number < 0) model_number = 7;
else if(clickedid == TD_join[4])
if(++model_number >= 8) model_number = 0;
Однако, если скомпилировать вот так:PHP код:
warning 217: loose indentation
Ошибка пропадает, однако вторая часть конструкции:PHP код:
if(clickedid == TD_join[3]) if(--model_number < 0) model_number = 7;
else if(clickedid == TD_join[4]) if(++model_number >= 8) model_number = 0;
Работает некорректно (точнее вовсе не работает).PHP код:
else if(clickedid == TD_join[4]) if(++model_number >= 8) model_number = 0;
Версия последняя:
Если кто пользуется данным компилятором, проверьте проблему.PHP код:
Pawn compiler 3.10.2 Copyright (c) 1997-2006, ITB CompuPhase
Компилятор всё делает правильно. Оператор else относится к последнему встреченному if, а не к первому.
Если сделать правильное выравнивание, код будет выглядеть так:
Или даже так:PHP код:
if(clickedid == TD_join[3])
if(--model_number < 0) model_number = 7;
else if(clickedid == TD_join[4])
if(++model_number >= 8) model_number = 0;
Если же вы хотите, чтобы код в else относился к первому if, выделяйте тело ветвления фигурными скобками:PHP код:
if(clickedid == TD_join[3])
if(--model_number < 0) model_number = 7;
else
if(clickedid == TD_join[4])
if(++model_number >= 8) model_number = 0;
UPD: Насколько помню, такая задача в стиле "Найди ошибку" даже есть в ЕГЭ по информатике. Или, по крайней мере, была там 5 лет тому назад.PHP код:
if(clickedid == TD_join[3])
{
if(--model_number < 0) model_number = 7;
}
else if(clickedid == TD_join[4])
{
if(++model_number >= 8) model_number = 0;
}