Переменная в Pawn (как и в большинстве языков) — это поименованная, либо адресуемая область памяти, имя или адрес которой можно использовать для осуществления доступа к данным, находящимся в переменной или по данному адресу.
Если заглянуть «под капот» Pawn, то мы увидим, что на самом деле в этом языке отсутствует типизация. В действительности каждая переменная является одной четырёхбайтовой ячейкой. Но, для простоты повествования, опустим подробности и будем считать, что в Pawn для переменных отведено несколько типов.
Переменные бывают нескольких типов: целые(Integer), дробные(Float), строковые(Char).
Они создаются следующим образом:
new x; // переменная типа Integer(целое число) new Float:x; // переменная типа Float(число с плавающей запятой, проще - дробное) new x[12]; // переменный массив типа char(в каждой ячейке массива один символ)
И эта статья о том, как работать с каждым типом.
Integer — целый
new x; // создаем целую переменную x, по умолчанию x равен нулю. x = 5; // присваиваем переменной x значение 5.
new x, y, z; // создаем 3 целых переменных x = 5; y = 7; z = x + y; // после выполнения программы z будет равен 12
Есть специальные операторы, для работы с целыми числами, рассмотрим основные:
new x = 5, y = 8; x += y; // присвоим переменной x значение x + y // эту строку можно было записать и так: x = x + y; // существуют аналогичные операторы например: -=,+=,*= и др. // результат программы будет 13 x++; // прибавляем к x один, это можно записать так: x += 1; или так: x = x + 1; // существуют аналогичный оператор: --
Float — дробный
Всё также как и в работе с целыми числами, только создание переменной сопровождается указателем Float, а присваиваемое значение должно быть дробное.
new Float:x = 1.0, Float:y = 1.1; x += y; // результат: 2.1
Char — символьный
new x[10]; // создаем массив в 10 ячеек. x = "Петя"; print(x); // в консоль выведется Петя. // в этой строке можно выдернуть любой символ:) printf("%c", x[1]); // выведет 'е'
Существует множество функций для работ с числами и строками, их можно узнать на вики проекта са-мп.
Массивы
Создать числовой массив очень просто:
new x[10]; // мы создали массив в 10 ячеек, от нулевой до девятой // присваиваем элементам с номерами 0 и 1 значения 5 и 8 соответственно x[0] = 5; x[1] = 8; x[3] = x[0] + x[1]; // в x[3] будет находится 13
Числа в массивы можно внести при инициализации оного:
new x[5] = {5, 3, 4, 7, 94}; // тогда при выполнении x[0] += x[1] + x[3]; // x[0] будет равен 15
Каждая ячейка такого массива имеет размер 4 байта, иногда это не нужно поэтому применяется следующее:
new x[5 char]; // теперь 1 ячейка имеет размер 1 байт // в 1 ячейку вместится число от 0 до 255.
Работать с подобными массивами можно так:
// числа new x[5 char]; x{0} = 4; x{2} = 3; x{1} = x{0} + x{1}; printf("%d", x{0}); // строки new y[5 char]; // выделим 5 байт на строку (4 символа + 1 завершающий) y = !"test"; // в такие переменные строки нужно записывать в упакованном виде, это делается с помощью знака восклицания // и когда нам понадобится значение переменной, мы должны распаковать строку new string[5]; // создадим обычный массив на 5 ячеек strunpack(string, y); // распакуем в него запакованную строку printf("%s", string);
Запаковка строк очень полезна тогда, когда нужно хранить большое количество данных в одном массиве, например для хранения названий транспорта.
Многомерные массивы
Существуют двухмерные, трехмерные и четырёхмерные массивы, создать их можно так:
new x[2][3] = { {5, 7, 2}, {2, 5, 9} }; // мы создали двухмерный массив и сразу в него вбили числа // x[0][1] равен 7 // x[1][0] равен 2
Иногда требуется использовать конструктор enum для большего удобства:
enum test { param1, param2, param3 } new x[2][test]; // таким образом к массиву можно обращаться более человечно x[0][param1] = 1;
Это очень удобно, если у вас в массиве находятся данные разных типов, пример:
enum food { pos, Float:cost, bool:enabled, name[32] } new x[2][food] = { {5, 342.5435, false, "Колбаска"}, {87, 3.122, true, "Пончик"} }; // x[0][name] - выведет 'Колбаска'