# 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;

 }
 }
}
```

До этого момента мы рассматривали одномерные массивы. То есть массивы, которые содержат ( образно ) одну строку и схематично их можно нарисовать так:

![](https://github.com/wmysterio/scm-scripting-lessons/blob/main/_pu/1/60936603.png)

Здесь **0, 1, 2** ... **N** - элементы массива "ArrayPC". Так, как наш массив состоит из структур, то схематично это можно обозначить так:

![](https://github.com/wmysterio/scm-scripting-lessons/blob/main/_pu/1/17216150.png)

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

![](https://github.com/wmysterio/scm-scripting-lessons/blob/main/_pu/1/21297514.png)

У нас имеется 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". Схематично данный пример можно изобразить так:

![](https://github.com/wmysterio/scm-scripting-lessons/blob/main/_pu/1/98372554.png)

С количеством элементов нужно ограничиваться, так как чем больше их, тем сложнее их обработка. Если их будет слишком много, то это может привести вылету игры и даже зависанию вашего ПК. Это может произойти из за того, что все рассмотренные массивы относятся к одной большой группе - **статичные**. К динамичным мы перейдём немного позже, а пока на этом остановимся.

На этом урок окончен. ;)|783|1|0|60936603`png`313\`40

```
`\|17216150`png`310`114
```

`\|21297514`png`309`199

```
`\|98372554`png`217`157
```

\`||sktruktury|1511984921


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://lessons.sannybuilder.com/00300/00100/000106.-massivy-i-struktury.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
