stock UpMoney(playerid) { static const Cash[] = "%i"; new Str_Cash[15]; format(Str_Cash, sizeof(Str_Cash), Cash, Player[playerid][pMoney]); PlayerTextDrawSetString(playerid, MoneyA_TD[playerid], Str_Cash); return true; }
// Ко всем переменным new Text:Money_TD[1]; new PlayerText:MoneyA_TD[MAX_PLAYERS]; // В OnPlayerConnect MoneyA_TD[playerid] = CreatePlayerTextDraw(playerid, 513.3333, 82.1481, "1234567890"); PlayerTextDrawLetterSize(playerid, MoneyA_TD[playerid], 0.4483, 1.5667); PlayerTextDrawTextSize(playerid, MoneyA_TD[playerid], 22.0000, 0.0000); PlayerTextDrawAlignment(playerid, MoneyA_TD[playerid], 1); PlayerTextDrawColor(playerid, MoneyA_TD[playerid], -1); PlayerTextDrawBackgroundColor(playerid, MoneyA_TD[playerid], 255); PlayerTextDrawFont(playerid, MoneyA_TD[playerid], 0); PlayerTextDrawSetProportional(playerid, MoneyA_TD[playerid], 1); PlayerTextDrawSetShadow(playerid, MoneyA_TD[playerid], 0); // В OnGameModeInit Money_TD[0] = TextDrawCreate(460.0000, -54.0666, "lite:money"); TextDrawTextSize(Money_TD[0], 186.0000, 293.0000); TextDrawAlignment(Money_TD[0], 1); TextDrawColor(Money_TD[0], -1); TextDrawBackgroundColor(Money_TD[0], 255); TextDrawFont(Money_TD[0], 4); TextDrawSetProportional(Money_TD[0], 0); TextDrawSetShadow(Money_TD[0], 0);
public OnPlayerConnect(playerid) { new string[85]; GetPlayerName(playerid, Player[playerid][pName], MAX_PLAYER_NAME); f("SELECT `Level` FROM `Accounts` WHERE `Name` = '%s'", GN(playerid)); mysql_function_query(ConnectMySQL, string, true, "PlayerRegition","d", playerid); // Clear(playerid); TextDrawShowForPlayer(playerid, logotip_TD[0]); // Вставишь сюда код TD, я написал какой код PlayerTextDrawShow(playerid, MoneyA_TD[playerid]); TextDrawShowForPlayer(playerid, Money_TD[0]); return true; }
Автор: minimiller
Перевод и редактирование: DJ_WEST
Список ошибок:
- Код: Выделить всё
/*001*/ "expected token: "%s", but found "%s"n",
/*002*/ "only a single statement (or expression) can follow each "case"n",
/*003*/ "declaration of a local variable must appear in a compound blockn",
/*004*/ "function "%s" is not implementedn",
/*005*/ "function may not have argumentsn",
/*006*/ "must be assigned to an arrayn",
/*007*/ "operator cannot be redefinedn",
/*008*/ "must be a constant expression; assumed zeron",
/*009*/ "invalid array size (negative or zero)n",
/*010*/ "invalid function or declarationn",
/*011*/ "invalid outside functionsn",
/*012*/ "invalid function call, not a valid addressn",
/*013*/ "no entry point (no public functions)n",
/*014*/ "invalid statement; not in switchn",
/*015*/ ""default" case must be the last case in switch statementn",
/*016*/ "multiple defaults in "switch"n",
/*017*/ "undefined symbol "%s"n",
/*018*/ "initialization data exceeds declared sizen",
/*019*/ "not a label: "%s"n",
/*020*/ "invalid symbol name "%s"n",
/*021*/ "symbol already defined: "%s"n",
/*022*/ "must be lvalue (non-constant)n",
/*023*/ "array assignment must be simple assignmentn",
/*024*/ ""break" or "continue" is out of contextn",
/*025*/ "function heading differs from prototypen",
/*026*/ "no matching "#if..."n",
/*027*/ "invalid character constantn",
/*028*/ "invalid subscript (not an array or too many subscripts): "%s"n",
/*029*/ "invalid expression, assumed zeron",
/*030*/ "compound statement not closed at the end of filen",
/*031*/ "unknown directiven",
/*032*/ "array index out of bounds (variable "%s")n",
/*033*/ "array must be indexed (variable "%s")n",
/*034*/ "argument does not have a default value (argument %d)n",
/*035*/ "argument type mismatch (argument %d)n",
/*036*/ "empty statementn",
/*037*/ "invalid string (possibly non-terminated string)n",
/*038*/ "extra characters on linen",
/*039*/ "constant symbol has no sizen",
/*040*/ "duplicate "case" label (value %d)n",
/*041*/ "invalid ellipsis, array size is not knownn",
/*042*/ "invalid combination of class specifiersn",
/*043*/ "character constant exceeds range for packed stringn",
/*044*/ "positional parameters must precede all named parametersn",
/*045*/ "too many function argumentsn",
/*046*/ "unknown array size (variable "%s")n",
/*047*/ "array sizes do not match, or destination array is too smalln",
/*048*/ "array dimensions do not matchn",
/*049*/ "invalid line continuationn",
/*050*/ "invalid rangen",
/*051*/ "invalid subscript, use "[ ]" operators on major dimensionsn",
/*052*/ "multi-dimensional arrays must be fully initializedn",
/*053*/ "exceeding maximum number of dimensionsn",
/*054*/ "unmatched closing bracen",
/*055*/ "start of function body without function headern",
/*056*/ "arrays, local variables and function arguments cannot be public (variable "%s")n",
/*057*/ "unfinished expression before compiler directiven",
/*058*/ "duplicate argument; same argument is passed twicen",
/*059*/ "function argument may not have a default value (variable "%s")n",
/*060*/ "multiple "#else" directives between "#if ... #endif"n",
/*061*/ ""#elseif" directive follows an "#else" directiven",
/*062*/ "number of operands does not fit the operatorn",
/*063*/ "function result tag of operator "%s" must be "%s"n",
/*064*/ "cannot change predefined operatorsn",
/*065*/ "function argument may only have a single tag (argument %d)n",
/*066*/ "function argument may not be a reference argument or an array (argument "%s")n",
/*067*/ "variable cannot be both a reference and an array (variable "%s")n",
/*068*/ "invalid rational number precision in #pragman",
/*069*/ "rational number format already definedn",
/*070*/ "rational number support was not enabledn",
/*071*/ "user-defined operator must be declared before use (function "%s")n",
/*072*/ ""sizeof" operator is invalid on "function" symbolsn",
/*073*/ "function argument must be an array (argument "%s")n",
/*074*/ "#define pattern must start with an alphabetic charactern",
/*075*/ "input line too long (after substitutions)n",
/*076*/ "syntax error in the expression, or invalid function calln",
/*077*/ "malformed UTF-8 encoding, or corrupted file: %sn",
/*078*/ "function uses both "return" and "return <value>"n",
/*079*/ "inconsistent return types (array & non-array)n",
/*080*/ "unknown symbol, or not a constant symbol (symbol "%s")n",
/*081*/ "cannot take a tag as a default value for an indexed array parameter (symbol "%s")n",
/*082*/ "user-defined operators and native functions may not have statesn",
/*083*/ "a function may only belong to a single automaton (symbol "%s")n",
/*084*/ "state conflict: one of the states is already assigned to another implementation (symbol "%s")n",
/*085*/ "no states are defined for function "%s"n",
/*086*/ "unknown automaton "%s"n",
/*087*/ "unknown state "%s" for automaton "%s"n",
/*088*/ "number of arguments does not match definitionn"
Разбор ошибок
Рассмотрим пример нахождения и самостоятельного решения ошибок при компиляции.
Допустим у нас есть ошибка:
C:AMXXexample.sma(107) : error 035: argument type mismatch (argument 2)
Теперь давайте попытаемся разобрать эту ошибку по частям:
1) C:AMXXexample.sma – это директория, где находится исходник (.sma) нашего плагина.
2) (107) – это номер строки, в которой есть ошибка. Большинство современных редакторов текста имеют панель с пронумерованными строками (Notepad++, AMXX-Studio и другие).
3) error 035 – это код ошибки (список ошибок указан выше).
4) argument type mismatch – это описание ошибки с кодом, указанным до этого. В данном случае нам говорится, что “аргумент имеет неверный тип”.
5) (argument 2) – это более подробное описание ошибки. В данном случае нам указывается, что ошибка во 2 аргументе.
Итого, получаем: в файле example.sma, который находится в директории C:AMXX, в строке под номером 107 есть ошибка с кодом 035, которая означает, что аргумент 2 имеет неверный тип данных.
Решение ошибок
Теперь попытаемся исправить нашу ошибку. Идем в строку под номером 107 и видим следующий код:
- Код: Выделить всё
client_print(0, "Welcome to the server!")
Идем на Вы должны зарегистрироваться, чтобы видеть ссылки.
и читаем описание функции:
client_print – Sends a message to a player.
Syntax:
client_print ( index, type, const message[], … )id is a player index from 1 to 32. If 0, the message will be sent to all players.
The type is one of three types:
print_chat – chat text
print_console – console message
print_notify – console in dev mode
print_center – center say
Смотрим синтаксис команды client_print и видим, что первый аргумент index – это номер игрока (id), который может быть от 1 до 32, если же он 0, то сообщение будет отсылаться всем игрокам на сервере. Второй аргумент type – это тип сообщения, который может быть:
print_chat – текст в чат
print_console – текст в консоль
print_notify – текст в консоль в режиме разработчика
print_center – текст по центру
Третий аргумент message – это и есть текст нашего сообщения. Теперь вернемся, к нашему, коду. Мы видим, что у нас нет второго аргумента (тип сообщения), а сразу идет текст сообщения, исправляем на:
client_print(0, print_center, “Welcome to the server!”)
Теперь компиляция прошла успешно.
Описание ошибок:
error 001: expected token: “X”, but found “Y”
Ошибка означает, что не найден X, когда найден Y. Наиболее часто возникает, когда забывают поставить недостающие знаки ; { } ( ).
Пример ошибки:
- Код: Выделить всё
public Function(id)
{
if (is_user_bot(id)
return PLUGIN_HANDLED// код
return PLUGIN_CONTINUE
}
error 017: undefined symbol “X”
Ошибка означает, что X – неизвестный сивол/команда/переменная/функция. Поэтому такую функцию или переменную нужно объявить перед использованием. Например, функция is_user_hacker не существует.
Пример ошибки:
- Код: Выделить всё
public Function(id)
{
if (is_user_hacker(id))
return PLUGIN_HANDLED// код
return PLUGIN_CONTINUE
}
error 032: array index out of bounds (variable X)
Ошибка означает, что в мы вышли за предел размера массива X.
Пример ошибки:
- Код: Выделить всё
new s_Name[32]
s_Name[33] = "*"
error 033: array must be indexed (variable X)
Ошибка означает, что массив должен быть проиндексирован. Например, мы не указали размер массива при его объявлении.
Пример ошибки:
- Код: Выделить всё
new s_String = "My string"
error 035: argument type mismatch (argument X)
Ошибка означает, что аргумент X имеет неверный тип данных. Например, когда вместо целочисленного аргумента передаем строку.
Пример ошибки:
- Код: Выделить всё
public Function1(id)
{
Function2(id, "10")
}public Function2(id, count)
{
// код
}
error 040: duplicate “case” label (value X)
Ошибка означает, что имеется дубль оператора case со значением X.
Пример ошибки:
- Код: Выделить всё
public Function(id)
{
switch(count)
{
case 1: count += 1
case 2: count += 2
case 2: count += 3
}
}
error 075: input line too long (after substitutions)
Ошибка означает, что указанная строка слишком длинная. Например, около 500 символов.
Пример ошибки:
- Код: Выделить всё
public Function(id)
{
server_print("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")
}
error 078: function uses both “return” and “return <value>”
Ошибка означает, что функция использует, как return, так и return <значение>.
Пример ошибки:
- Код: Выделить всё
public Function(id)
{
if (is_user_alive(id))
returnreturn PLUGIN_HANDLED
}
error 088: number of arguments does not match definition
Ошибка означает, что количество переданных аргументов не соответсвует количеству объявленных аргументов.
Пример ошибки:
- Код: Выделить всё
public Function1(id)
{
Function2(id)
}public Function2(id, count)
{
// код
}
Не пишите мне в ЛС: если вам нужна помощь на бесплатной основе. Любые вопросы на форум.
Переменная:
new text:textlogo[MAX_PLAYERS][1];
в public OnPlayerConnect
textlogo[playerid][0] = TextDrawCreate(550.416442, -31.629640, “mp_testrp-pack:Logotip”);
TextDrawLetterSize(textlogo[playerid][0], 0.000000, 0.000000);
TextDrawTextSize(textlogo[playerid][0], 114.166671, 94.370361);
TextDrawAlignment(textlogo[playerid][0], 1);
TextDrawColor(textlogo[playerid][0], -1);
TextDrawSetShadow(textlogo[playerid][0], 0);
TextDrawSetOutline(textlogo[playerid][0], 0);
TextDrawFont(textlogo[playerid][0], 4);
textlogo[playerid][1] = TextDrawCreate(556.666992, 28.518495, “suc-rp.ru”);
TextDrawLetterSize(textlogo[playerid][1], 0.199166, 1.677777);
TextDrawTextSize(textlogo[playerid][1], -6.666666, 3.629629);
TextDrawAlignment(textlogo[playerid][1], 1);
TextDrawColor(textlogo[playerid][1], 16711935);
TextDrawSetShadow(textlogo[playerid][1], 0);
TextDrawSetOutline(textlogo[playerid][1], 0);
TextDrawBackgroundColor(textlogo[playerid][1], -1061109505);
TextDrawFont(textlogo[playerid][1], 2);
TextDrawSetProportional(textlogo[playerid][1], 1);
И появление текст драва
TextDrawShowForPlayer(playerid, textlogo[playerid][0]);
TextDrawShowForPlayer(playerid, textlogo[playerid][1]);
Список часто встречаемых ошибок в pawno
Данная тема содержет наиболее распространенные ошибки и предупреждения в pawno при создании скриптов sa-mp
Когда компилятор находит ошибку в файле, то выводится сообщение, в таком порядке:
- Имя файла
- номер строки компилятора были обнаружены ошибки в скобках, непосредственно за именем
- класс error (ошибка, фатальная ошибка или предупреждение)
- номер ошибки
- описание ошибки
Например:
hello.pwn(3) : error 001: expected token: ";", but found "{"
Примечание: эта ошибка может быть на линии, над линией, что показано, так как компилятор не всегда может установить ошибку перед проанализировав полное выражение.
Категории ошибок
Ошибки разделяются на три класса:
Ошибки (errors)
- Описание ситуации когда компилятор не может скомпилировать код
- Ошибки номеруются от 1 до 99
Критические ошибки (Fatal errors)
- Критические ошибки и описание, от которых компилятор не может восстановиться.
- Парсинг прерывается (нет отклика программы).
- Критические ошибки номеруются от 100 до 199.
Предупреждения ( Warings )
- Предупреждения указывают на возможную причину возникновения багов, вылетов.
- Предупреждения номеруются от 200 до 299.
Распространенные ошибки
001: expected token (ожидаемый знак)
Обязательный знак отсутствует
Пример:
error 001: expected token: ";", but found "return" main() { print("test") // тут должна быть точка с запятой ";" return 1; }
002: only a single statement (or expression) can follow each “case” (только одно выражение может быть в одной строке с “case”
В каждом case оператора switch без фигурных скобок может содержаться только один оператор если больше нужно ставить скобки.
Пример:
error 002: only a single statement (or expression) can follow each "case"
main() { switch(x) { case 0: print("hello"); print("hello"); } return 1; }
Так же могут быть еще и предупреждения и дополнительные ошибки:
error 002: only a single statement (or expression) can follow each "case" warning 215: expression has no effect error 010: invalid function or declaration
Вот так это можно исправить:
main() { switch(x) { case 0: { print("hello"); print("hello"); } } return 1; }
004: function “x” is not implemented (Функция “x” не используется
Часто бывает что в функции выше пропущена скобка.
025: function heading differs from prototype
Это проиходит когда в функции не совпадают аргументы.
К примеру:
forward MyFunction(playerid); public MyFunction(player, vehicleid);
Исправляем:
forward MyFunction(playerid, vehicleid); public MyFunction(playerid, vehicleid);
035: argument type mismatch (argument x) (не совпадение типов аргумента(ов)
К примеру когда в место playerid – integer аргумента стоит “playerid” – string или 0.5 – float
Пример:
error 035: argument type mismatch (argument 1)
Kick("playerid"); // Как видите в место целого числа (integer) стоит строка
Исправляем:
Kick(playerid);
046: unknown array size (variable x)
Не указан размер массива.
Пример:
new string[]; string = "pawno";
Исправляем:
new string[6]; string = "pawno";
047: array sizes do not match, or destination array is too small
Размер массива мал или не совпадает.
- Многомерные массивы должны иметь одинаковый размер
- Одномерные массив к которому присваивают(правый должен иметь больше размер чем левый.
new destination[8]; new msg[] = "Hello World!"; destination = msg;
В приведенном выше коде размер строки “Hello world!” ровна 12 байт а массив к которому присваиваем имеет размер 8 байт из этого и складывается ошибка.
Если увеличить размер массива destination до 13 байт то ошибка исправится.
new destination[13]; new msg[] = "Hello World!"; destination = msg;
055: start of function body without function header
Начало тела функции без функции заголовка.
Критические ошибки (FATAL ERRORS)
100: cannot read from file: "<file>"
Компилятор не может найти или прочитать указанный файл, убедитесь что он находится по адресу (<папка с сервером>pawnoinclude).
Пример:
#include <a_sam>
Исправляем:
#include <a_samp>
Совет
Не нужно открывать ваш код дважды, не нужно тыкать несколько раз на файл. Откройте сначала редактор, потом ваш проект.
Предупреждения( Warnings )
202: number of arguments does not match definition
Описание ошибки довольно понятное, это значит что вы используете слишком мало или слишком много аргументов в функции, обычно это признак того что функция используется не правильно, обратитесь к документации.
Функция GetPlayerHealth согласно официальному источнику wiki.sa-mp.com имеет два аргумента playerid и Float:health ссылка
Пример:
GetPlayerHealth(playerid);
Исправляем:
new Float:health; GetPlayerHealth(playerid, health);
203: symbol is never used: “symbol”
Вы создали переменную или функцию и она ни где не используется тогда ищите в окне компилятора это предупреждение, это не как не влияет на код и не угражает ему, так что если вы удалите переменную или функцию которая не используется, то вы сэкономите память.
Пример:
stock SomeFunction() { // Blah }
204: symbol is assigned a value that is never used: “symbol”
Это предупреждение аналогично к предыдущему, разница в том что к переменной что то присвоено и оно не как не используется, это безопасно 🙂
209: function should return a value
Функция ничего не возвращает, вы создали её:
SomeFunction() { // Blah }
Решили её присвоить к чему нибудь к примеру:
new result = SomeFunction(); // ожидает 1
Вот так исправить
SomeFunction() { // Blah return 1; }
211: possibly unintended assignment
Если вы введете оператор присваивания в условии и оно не будет в круглых скобках то будет предупреждение
if(vehicle = GetPlayerVehicleID(playerid)) // ошибка if(vehicle == GetPlayerVehicleID(playerid)) // все норм if((vehicle = GetPlayerVehicleID(playerid))) // все норм, так значение функции присвоится к переменной потом выражение вычесляется { то есть это как if(IsPlayerConnected(playerid)}
213: tag mismatch ( несовпадение тегов)
Это происходит когда:
- Тип переменной указан не верно или не имеет его
- Выражения по обе стороны бинарного оператора имеют разные теги
- В пременную возвращен не верный тип переменной или не имеющий его.
- Индексирование массива, который требует тегами индекс без тега или неправильное имя тега
Часто это бывает на 3d текстах или тексдравах Text3D, Text
Не правильно:
new health; GetPlayerHealth(playerid, health);
Правильно:
new Float:health; GetPlayerHealth(playerid, health);
217: loose indentation
Компилятор выдаст ошибку если не соблюдены отступы.
Правильно:
if(condition) { action(); result(); }
Не правильно:
if(condition) { action(); result(); }
Отступы делаются по нажатью кнопки TAB это практика в программировании для удобного чтения кода.
219: local variable “foo” shadows a variable at a preceding level
Локальная переменная в тени глобальной то есть над локальной переменной создана точно такая же глобальная. В практике программирования префиксом глобальной переменной является “g” в начале переменной к примеру
new gPlayerMoney
любыми способами избегайте их.
К примеру:
new team[MAX_PLAYERS]; // объявляем глобальную переменную function(playerid) { new team[MAX_PLAYERS]; // создаем еще одну, и получаем статью 219 кодекса ошибок :D team[playerid] = random(5); }
Решение:
Просто переименуйте локальную переменную team.
225: unreachable code ( недоступный код )
Это происходит тогда когда вы пишите какой нибудь код после return, после return’а код не выполняется и он считается бесполезным
Пример:
#include <zcmd.inc>
CMD:jetpack(playerid, params[]) { #pragma unused params if(IsPlayerAdmin(playerid)) { SetPlayerSpecialAction(playerid, SPECIAL_ACTION_USEJETPACK); return 1; // завершаем процесс } else { SendClientMessage(playerid, -1, "Вы не администратор"); return 1; // завершаем процесс } SendClientMessage(playerid, -1, "Вы ввели команду /jp"); // Этот код не доступен он не будет выполнятся. }
Решение:
CMD:jetpack(playerid, params[]) { #pragma unused params if(IsPlayerAdmin(playerid)) { SetPlayerSpecialAction(playerid, SPECIAL_ACTION_USEJETPACK); } else { SendClientMessage(playerid, -1, "Вы не администратор"); } SendClientMessage(playerid, -1, "Вы ввели команду /jp"); // этот код запустится return 1; // завершаем процесс }
235: public function lacks forward declaration (symbol “symbol”)
Отсутствует forward.
Не правильно:
public MyFunction() { }
Правильно:
forward MyFunction(); public MyFunction() { }
Надеюсь эта статья поможет вам в языке программирования, желаю вам не повторять ошибок дважды и что бы ваш код был быстрым, надежным!
Оставляйте ваши отзывы, ставьте плюсы, пишите недостатки ошибки, недостатки статьи или их недочеты. Удачи в мире PAWNO!