Pawn. Подробнее о переменных и массивах

Переменная в 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] - выведет 'Колбаска'
Перейти к верхней панели