Уроки моддинга
Основной раздел
Search
K
Links

000106. Массивы и структуры

Массивы и структуры|Всем привет! Сегодня мы будем разбирать понятие структуры и научимся с ней работать.|wmysterio|wmysterio||||Прежде всего хочу сказать, что структура - это пользовательский набор данных. Этот набор может содержать различные типы данных и функции. Синтаксис написания таков:
cs
struct StructName {
var1;
var2;
// ...
varN;
};
Создавать структуру нужно в месте, где к ней можно получить доступ. Xто бы можно получать доступ её свойствам с любого места, эти элементы должны быть открытые ( public ). В качестве примера, создадим структуру с именем PC, и добавим ей поля, которые можно сделать с этой структурой.
cs
struct PC {
public string CompName;
public int VideoCard;
public int Processor;
};
Как видим, наша структура состоит из 3-х полей - Имя Компьютера, параметры видеокарты и к-во ядер процессора. Добавим эту структуру в код c#:
cs
using System;
using GTA;
namespace TestScript {
public class Thread : Script {
struct PC {
public string CompName;
public int VideoCard;
public int Processor;
};
public Thread() { }
}
}
Как видим, структура создана до функции "Thread", что бы она была видима нашему "потоку". Теперь мы создали свой тип данных - PC, которая является структурой. В нашем "потоке" мы можем создать переменную этого типа и выполнять какие-то действия над ней. Давайте заполним её информацией:
cs
public Thread() {
PC MyComp;
MyComp.CompName = "WMYSTERIO-PC";
MyComp.VideoCard = 512;
MyComp.Processor = 2;
}
Обращение к полям структуры делается через точку. Чтобы считать данные из структуры, мы должны создать переменную того же типа, что и поле структуры:
cs
public Thread() {
// ...
string MySTR;
int A, B;
MySTR = MyComp.CompName;
A = MyComp.VideoCard;
B = MyComp.Processor;
}
По этому же принципу делались структуры и в GTA SA, адреса полей которых мы считывали через игровую память с помощью Sanny Builder. Размер структуры может быть любым и содержать любые данные, а не только целые и дробные числа. Например, структура может содержать в себе другую структуру, внутри которой массив объектов какого-то класса, а сам класс может содержать свои методы и свои структуры. В общем: иерархия может быть огромной. Главное, что бы мозги не лопнули содержать всё в памяти :) Но мы ограничимся этими примерами, так пользоваться структурами будем не часто, но знать о них вы должны. Чаще всего создают классы, но о них я расскажу, когда будем изучать ООП.
Вторая часть урока посвящена массивам. Массивы в c# более гибкие, чем в Sanny Builder, так как с ними множество вариантов работы. Массив - это совокупность элементов конкретного типа. Новый экземпляр массива задаётся оператором new. Синтаксис написания таков:
cs
int[] Array = new int[5];
Array[0] = 10;
Array[1] = 5;
Array[2] = 7;
Array[3] = 2;
Array[4] = 5;
В начале мы указываем компилятору, что мы будем создавать массив, возле типа указываем квадратные скобки. Дальше создаём новый экземпляр и в скобках указываем уже размерность нового массива. В нашем случаи массив "Array" будет состоять из 5 элементов. Ниже мы уже задаём значения для него, обращаясь по индексу. Как и в Sanny Builder, индексирование начинается с нуля.
Имея эти знания и структуру выше, мы можем сделать массив этих структур:
cs
PC[] ArrayPC = new PC[3];
Теперь мы можем обращаться к элементам массива и задавать свои значения. Следующий код является таким примером ;)
cs
using System;
using GTA;
namespace TestScript {
public class Thread : Script {
struct PC {
public string CompName;
public int VideoCard;
public int Processor;
};
public Thread() {
PC[] ArrayPC = new PC[3];
ArrayPC[0].CompName = "User1";
ArrayPC[0].Processor = 2;
ArrayPC[0].VideoCard = 512;
ArrayPC[1].CompName = "User2";
ArrayPC[1].Processor = 4;
ArrayPC[1].VideoCard = 1024;
ArrayPC[2].CompName = "User3";
ArrayPC[2].Processor = 8;
ArrayPC[2].VideoCard = 2048;
}
}
}
До этого момента мы рассматривали одномерные массивы. То есть массивы, которые содержат ( образно ) одну строку и схематично их можно нарисовать так:
Здесь 0, 1, 2 ... N - элементы массива "ArrayPC". Так, как наш массив состоит из структур, то схематично это можно обозначить так:
Но есть и многомерные массивы, которые могут содержать строки, ряды и целые кубы ( это образно. Нужно просто представить всё и мои рисунки, надеюсь, помогут вам ) данных. Схематично двухмерный массив изображается так:
У нас имеется M массивов, каждый из которых содержит по N элементов. Это и есть двумерный массив. В "народе" такие массивы часто называют матрицей, размерностью MxN. Если предположить, что количество массивов - 3, где содержаться по 2 элемента, то всего массив может содержать 3*2=6 элементов.
Объявляются двумерные массивы следующим образом:
cs
PC[,] ArrayPC = new PC[3,2];
В первых скобках указывается запятая. К-во запятых должно быть на единицу меньше, чем размерность массива. Во вторых: мы явно указываем эту размерность. Вот пример двухмерного массива:
cs
using System;
using GTA;
namespace TestScript {
public class Thread : Script {
struct PC {
public string CompName;
public int VideoCard;
public int Processor;
};
public Thread() {
PC[,] ArrayPC = new PC[3,2];
ArrayPC[0,0].CompName = "User1";
ArrayPC[0,0].Processor = 2;
ArrayPC[0,0].VideoCard = 512;
ArrayPC[1,0].CompName = "User2";
ArrayPC[1,0].Processor = 4;
ArrayPC[1,0].VideoCard = 1024;
ArrayPC[2,0].CompName = "User3";
ArrayPC[2,0].Processor = 8;
ArrayPC[2,0].VideoCard = 2048;
ArrayPC[0, 1].CompName = "User4";
ArrayPC[0, 1].Processor = 16;
ArrayPC[0, 1].VideoCard = 512;
ArrayPC[1, 1].CompName = "User5";
ArrayPC[1, 1].Processor = 16;
ArrayPC[1, 1].VideoCard = 2048;
ArrayPC[2, 1].CompName = "User6";
ArrayPC[2, 1].Processor = 1;
ArrayPC[2, 1].VideoCard = 512;
}
}
}
Запись и считывание элементов также происходит по индексу. Первое число в скобках в какую строку "матрицы" будет идти запись, второе число - в какой элемент. Вот мы создали заполненный массив структур "PC". Схематично данный пример можно изобразить так:
С количеством элементов нужно ограничиваться, так как чем больше их, тем сложнее их обработка. Если их будет слишком много, то это может привести вылету игры и даже зависанию вашего ПК. Это может произойти из за того, что все рассмотренные массивы относятся к одной большой группе - статичные. К динамичным мы перейдём немного позже, а пока на этом остановимся.
На этом урок окончен. ;)|783|1|0|60936603png313`40
`\|17216150`png`310`114
\|21297514png309199
`\|98372554`png`217`157
`||sktruktury|1511984921