Всем привет! Сегодня мы будем разбирать понятие "структура" и научимся с ней работать. Прежде всего хочу сказать, что структура - это пользовательский набор данных. Этот набор может содержать различные типы данных и функции. Синтаксис написания таков:
struct StructName {
     var1;
     var2;
     ...
     varN;
};
Создавать структуру нужно в месте, где к ней можно получить доступ. Все элементы структуры должны быть публичные, что бы можно получать доступ с любого места. В качестве примера, создадим структуру с именем PC, и припишем ей свойства, которые можно сделать с этой структурой.
struct PC {
     public string CompName;
     public int VideoCard;
     public int Processor;
};
Как видим, наша структура состоит из 3-х свойств - Имя Компьютера, параметры видеокарты и к-во ядер процессора. Добавим эту структуру в код c#:
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, которая является структурой. В нашем потоке мы можем создать переменную этого типа и выполнять какие-то действия над ней. Давайте заполним её информацией:
public Thread() {
     PC MyComp;

     MyComp.CompName = "WMYSTERIO-PC";
     MyComp.VideoCard = 512;
     MyComp.Processor = 2;
     
}
Обращение к полям структуры делается через точку. Что бы считать данные с структуры, мы должны создать переменную того же типа, что и поле структуры и считать данные:
public Thread() {
     ...
     string MySTR;
     int A, B;

     MySTR = MyComp.CompName;
     A = MyComp.VideoCard;
     B = MyComp.Processor;  

}
По этому же принципу делались структуры и в GTA SA, адреса полей которых мы считывали через игровую память с помощью SannyBuilder. Размер структуры может быть любым и содержать любые данные, а не только целые и дробные числа. Например структура может содержать в себе другую структуру, внутри которой массив объектов какого-то класса, а сам класс может содержать свои методы и свои структуры. В общем иерархия может быть огромной. Главное, что бы мозги не лопнули содержать всё в памяти smile Но мы ограничимся и этими примерами, так как мы не часто будем пользоваться структурами, но знать о них вы должны.

Вторая часть урока посвящена массивам. Массивы в c# более гибкие, чем в SannyBuilder, так как с ними множество вариантов работы. Массив - это совокупность элементов конкретного типа. Новый экземпляр массива задаётся оператором new. Синтаксис написания таков:
int[] Array = new int[5];

Array[0] = 10;
Array[1] = 5;
Array[2] = 7;
Array[3] = 2;
Array[4] = 5;
В начале мы указываем компилятору, что мы будем создавать массив, возле типа указываем квадратные скобки. Дальше создаём новый экземпляр и в скобках указываем уже размерность нового массива. В нашем случаи массив Array будет состоять из 5 элементов. Ниже мы уже задаём значения для него, обращаясь по индексу. Как и в SannyBuilder, индексирование начинается с нуля.

Имея эти знания и структуру выше, мы можем сделать массив этих структур:
PC[] ArrayPC = new PC[3];
Теперь мы можем обращаться к элементам массива и задавать свои значения. Следующий код является таким примером ;)
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 элементов.

Объявляются двумерные массивы следующим образом:
PC[,] ArrayPC = new PC[3,2];
В первых скобках указывается запятая. К-во запятых должно быть на единицу меньше, чем размерность массива. Во вторых мы явно указываем эту размерность. Вот пример двухмерного массива:
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. Схематично данный пример можно изобразить так:

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

На этом урок окончен. ;)

SanKing   (22.05.13 18:58)
Спасибо за урок.

wmysterio   (25.05.13 14:34)
Незачто smile

Надеюсь, кому-то понадобится в будущем этот материал
Вход на сайт

Поиск
Категории раздела
Мини-чат
Пожалуйста, все вопросы по скриптингу задавать на форуме!
Наш опрос
Как Вы относитесь к ситуации с OpenIV?
Всего ответов: 1
Активность на сайте
Пожертвования
Кошельки WebMoney:
U859420971000
R407741810602
Z331072372430
E314272616890
Друзья сайта
Полезные ресурсы
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Сегодня нас посетили:
wmysterio
Реклама