Добавлен , опубликован

Основы программирования Корсаров

Содержание:
Вы уже знакомы с переменными и их возможностями. Но часто бывает так, что нужно хранить целый набор однотипных данных. И использование для этого простых переменных не самое удобное решение.

Фиксированные массивы

Предположим, нам нужны переменные, чтобы хранить в них скорость доступных кораблей:
float shipSpeed1;   // создаём переменные с похожими именами для каждого корабля
float shipSpeed2;
float shipSpeed3;
// ...
float shipSpeed27;
Не самый удобный способ, согласитесь. А как потом к ним обращаться в коде - вообще не понятно. Как раз для решения подобных задач и существуют массивы.
Массив - это совокупный тип данных, который позволяет получить доступ ко всем переменным одного и того же типа данных через использование одного идентификатора.
Реализация описанной выше задачи посредством массива будет выглядеть следующим образом:
float shipSpeed[27];    // создаём фиксированный массив из 27 переменных типа float
Как и при объявлении обычной переменной, сначала указывается тип данных и имя, а затем используются квадратные скобки [], чтобы обозначить, что это переменная массива (а не обычная переменная). В скобках указывается количество выделяемых элементов (это называется длиной или размером массива).
Массив, размер которого известен на момент компиляции программы, называется фиксированным (или «массивом фиксированной длины»). При создании массива shipSpeed, компьютер выделит память для 27 переменных с плавающей запятой.
Каждая переменная в составе массива называется элементом массива. Для доступа к ним используется имя массива вместе с оператором индекса [] и параметром, который называется индексом и который сообщает какой элемент мы хотим выбрать.
ВАЖНО В программировании отсчёт всегда начинается с 0, а не с 1.
В массиве длиной N элементы будут пронумерованы от 0 до N-1. Это называется диапазоном массива.
Это означает, что обращение к первому элементу массива, который мы создали будет выглядеть так:
shipSpeed[0] = 12.4;
Помимо присвоения значения каждому элементу массива по отдельности, существует метод инициализации массивов с помощью списка инициализаторов:
int myArray[4] = { 12, 9, 198, 6 };
ОСОБЕННОСТЬ скриптовой части Корсаров такова, что работает этот метод только в глобальной области видимости (за пределами функции).
Для присвоения каких-то постоянных данных на уровне скрипта этого, в принципе, достаточно. А в динамике вы всё равно будете, в большинстве задач, перебирать элементы массива циклом.
Например, мы хотим найти корвет в массиве кораблей:
for (int i = 0, i < 10, i++)
{
    if (ships[i] == "corvette")
    {
        // ...
    }
}
Как правило, цикл с массивом используется для решения одной из трёх задач:
  • Вычислить значение (например, среднее или сумму всех значений);
  • Найти значение (например, самое большое или самое маленькое);
  • Отсортировать элементы массива (например, по возрастанию или по убыванию).

Размер массива

Для того, чтобы выполнить перебор всех элементов массива, мы должны знать его длину. Для этого разработчики Storm Engine дали нам специальную функцию GetArraySize(ref Array). Она возвращает целое число, а в качестве аргумента принимает ссылку на массив.
int myArr[3];

for (int i = 1, i <= GetArraySize(&myArr), i++)
{
    if (myArr[i - 1] == "someData") // не забываем, что массив длиной N имеет индексы от 0 до N-1
    {
        // ...
    }
}
О том, что такое передача ссылок, мы поговорим в следующем уроке. Здесь я просто обозначу, что символ амперсанда перед именем элемента - означает ссылку на него.

Динамические массивы

Динамическим называется массив, который не имеет фиксированной длины.
ОСОБЕННОСТЬ в том, что в скрипты динамических массивов не завезли.
Так зачем я создал этот раздел?
Программисты Акеллы прекрасно понимали проблему фиксированных массивов. Рано или поздно вы сталкиваетесь с ситуацией, когда размера объявленного массива становится недостаточно. А ОСОБЕННОСТЬ Storm Engine такова, что он не умеет переинициализировать уже созданные массивы. То есть, если пользователь уже играет в ваше дополнение, а вы выпустили новую версию, в которой увеличилось кол-во кораблей - игроку придётся начать новую игру, потому что в его сохранении массив кораблей останется прежним. И он неизбежно получит ошибку, когда игра попытается обратиться к кораблю, которого нет в его сохранении.
Вообще, патч сейва - обширная и глубокая тема, требующая отдельной статьи. Скорее всего, я вообще зря это здесь затронул.
Тем не менее, существует функция SetArraySize(ref Array, int Size), которая позволяет изменить размер уже созданного массива.
Это не панацея, но в некоторых ситуациях может пригодиться.
int myArr[3];

SetArraySize(&myArr, 5);

myArr[4] = 12; 
Данная функция увеличивает размер переданного массива, не изменяя при этом существующие элементы.
То есть, все присвоенные ранее значения останутся не тронутыми.
Но здесь тоже есть нюанс - если изначальная длина массива указана меньше 2 - SetArraySize() не отработает.
int myArr[1];
SetArraySize(&myArr, 5);	// не сработает

int anotherArr[2];
SetArraySize(&myArr, 5);	// а это уже работает

`
ОЖИДАНИЕ РЕКЛАМЫ...
5
В качестве динамических массивов можно использовать атрибутную систему. В движке атрибуты - это отдельный класс, напоминающий рекурсивный ассоциативный массив.
Ответы (1)
22
Rosarak, мысль интересная.
Для ситуаций, когда очень нужно и без этого никак - вполне себе решение.
30
В программировании отсчёт всегда начинается с 0, а не с 1.
Lua с тобой не согласится.
Ответы (7)
22
nazarpunk, луа на своем франзуском диалекте и своими проприетарными проблемами.
1С вон вообще на русском написан. Его тоже будем в один ряд с типовыми ЯП ставить?
30
avuremybe, ты дал общее определение "в программировании". Lua напрямую к нему относится и в нём индексация начинается с единицы.
22
nazarpunk, потому что она ложила на общие принципы программирования?))
По ней можно такие же статьи писать, с красными плашками
30
avuremybe, можно хоть один пример, где Lua на какие-то там принципы положил? И желательно с обоснованием.
22
nazarpunk, на общепринятые.
Про нумерацию с единицы ты уже упомянул.
Есть еще кейворды на французском, типа nil :D
30
avuremybe, кто их общепринял? Вон, SQL вообще на это ваше общепринятие ложил и почему-то никто на него ругается.
22
nazarpunk, ну общество же. Отсюда и слово такое "общепринятый".
Так разве кто-то отрицает специфичность SQL? Да, он очень специфичен. Но на нем и задачи выполняются не совсем классического направления программирования.
22
Вышла новая версия! Прокрутить к ресурсу
  • Особенноси работы ф-ции SetArraySize()
Чтобы оставить комментарий, пожалуйста, войдите на сайт.