Введение в программирование на SourcePawn. Часть 6.

Сообщения
207
Реакции
420
Помог
10 раз(а)
Введение в программирование на SourcePawn. Массивы.

Массивы - некий упорядоченный набор переменных одного типа. В SourcePawn массивы бывают двух типов:
  • Фиксированного размера. При инициализации, у него указывается строгий размер. При этом компилятор для этих массивов по прежнему разрешает использовать свою инструкцию sizeof().
  • Динамического размера. По сути, то же самое, но компилятор уже на таких не даёт применять sizeof(): он сам не знает размер массива, который в итоге выйдет.
У всех этих массивов есть один существенный недостаток: его нельзя в случае необходимости увеличить в размере. Для этого есть отдельный тип массивов, но там применяется Handle, и рассмотрим мы его позже.

Посмотрим теперь, как объявляются массивы.
Код:
int iArray[64]; // массив фиксированного размера
int[] iData; // массив динамического размера. он может быть когда угодно инициализирован, и размер его достоверно не известен.
Массив фиксированного размера сразу же инициализируется. В случае с динамическим, надо применить ещё new.
Код:
int[] iData = new int[64]; // массив размером 64

// следующую махинацию компилятор Вам сделать не разрешит. это надо иметь ввиду.
int[] iData;
// вызов неких функций...
iData = new int[64];
Динамические массивы используются при создании массива размером из некой переменной. Компилятор не разрешит Вам проинициализировать массив фиксированного размера, если его размер берётся из переменной, а вот динамического - разрешит.
Код:
int iSize = 64;

// error 161: brackets after variable name indicate a fixed-size array, but a dynamic size was given - did you mean to use 'new int[size]' syntax?
int iData[iSize];

// all ok.
int[] iData = new int[iSize];
Как Вы видите, компилятор любезно сообщит, если Вы применяете не тот тип массивов, который надо.
Однако в случае с константными размерами - не сообщит. Ему в принципе всё равно.

Применение
Когда используются массивы? Для хранения некоторых данных одного типа.
Самый банальный пример, как делать не стоит, и как лучше:
Код:
// не красиво, но верно, допустимо.
ConVar g_hCvar1;
ConVar g_hCvar2;
ConVar g_hCvar3;
ConVar g_hCvar4;
ConVar g_hCvar5;
ConVar g_hCvar6;
// ...
ConVar g_hCvar100;

// намного проще и элегантнее.
ConVar g_hCvars[100];
Следует иметь ввиду, что не смотря на объявляемый размер 100, получить доступ к конкретно 100-ому элементу по индексу 100 не выйдет. Отсчёт в массивах начинается с нуля (0), и сотый элемент расположился на 99 индексе.

Ещё один пример: хранение состояния успешности авторизации в неком плагине.
Код:
bool g_bAuthorized[MAXPLAYERS+1];
+1 здесь служит как "костыль для упрощения", чтобы обращаться напрямую по индексу игрока, и не использовать нулевой индекс никак.

Вот рассматриваем мы здесь объявление, применение массивов, а как обращаться к нужному индексу так и не решили. Так рассмотрим.
Для обращения к нужному индексу массива используются "брекеты" ([ и ]). В самих брекетах указывается необходимый индекс элемента.
Например, iArray[1] вернёт значение, хранящееся в первом индексе (или втором).

Рассмотрим практические примеры использования в теме циклов. Там куда больше практики возможной будет.
 
Последнее редактирование:
Сообщения
198
Реакции
273
Помог
5 раз(а)
Немного оффтоп по нулевому индексу:
Его порой удобно юзать для задания дефолтной конфигурации.
 
Сообщения
2,751
Реакции
3,015
Помог
61 раз(а)
не забыть про инструкцию препроцессора:
Код:
new bool: var1[32] = { false, true, ... };
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу