Создание динамического массива структур

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Правильно ли я понимаю, для того, чтобы создать динамический массив структур уже во время работы плагина, то делаем так:
C-подобный:
KeyValues kv;

enum struct Class
{
    char hello[256];
    ...
}

Class[] cl = new Class[];

public void OnPluginStart()
{
    получаем структуру kv в kv... и доходим до места обхода
    int f = 0;
    do
    {
        StrCopy(cl[f].Hello, sizeof(Class::Hello), "World");
        f++;
    } while(kv.GotoFirstSubKey());
}
получится ли заполнять все hello каждого элемента массива структур Class пока идет цикл?
Возможно неправильно написал, т.к. не работал со структурами в таком виде

Вот вроде как решение нашел, но не знаю, будет ли работать
C-подобный:
KeyValues kv;

enum struct Class
{
    char hello[256];
    ...
}

Class[] cl;

public void OnPluginStart()
{
    int f = 0;
    do
    {
        f++;
    } while(kv.GotoFirstSubKey());
    
    
    cl = new Class[f];
    ...
    дальше уже можно работать с каждым элементом массива
}
 
Последнее редактирование:

xstage

🏹
Сообщения
726
Реакции
754
Если делаем таким образом, нам все равно надо знать размер, просто он вычисляется во время работы плагина и не известен во время компиляции.
C-подобный:
Class[] cl = new Class[];
Т.е тебе придется сначала сосчитать сколько тебя надо места, потом создать что-то на подобии такого
C-подобный:
Class[] cl = new Class[iLength];
А потом уже его заполнять.

Я бы лучше использовал ArrayList, он для этого и создан.
C-подобный:
enum struct Class
{
    char hello[256];
}

ArrayList g_hList;

public void OnPluginStart()
{
    g_hList = new ArrayList(sizeof(Class));

    int f = 0;
    Class e;
    
    do
    {
        strcopy(e.hello, sizeof(Class::hello), "World");
        g_hList.PushArray(e);
        
        f++;
    } while(kv.GotoFirstSubKey());
}
 

Palonez

бб братки
Сообщения
3,035
Реакции
1,837
Если делаем таким образом, нам все равно надо знать размер, просто он вычисляется во время работы плагина и не известен во время компиляции.
C-подобный:
Class[] cl = new Class[];
Т.е тебе придется сначала сосчитать сколько тебя надо места, потом создать что-то на подобии такого
C-подобный:
Class[] cl = new Class[iLength];
А потом уже его заполнять.

Я бы лучше использовал ArrayList, он для этого и создан.
C-подобный:
enum struct Class
{
    char hello[256];
}

ArrayList g_hList;

public void OnPluginStart()
{
    g_hList = new ArrayList(sizeof(Class));

    int f = 0;
    Class e;
  
    do
    {
        strcopy(e.hello, sizeof(Class::hello), "World");
        g_hList.PushArray(e);
      
        f++;
    } while(kv.GotoFirstSubKey());
}
Я обновил тему, посмотри. Нашел тут: C#. Динамическое выделение памяти. Оператор new. Выделение памяти для типов-значений, структур, перечислений, объектов классов. Выделение памяти для массивов | BestProg между 6 и 7 пунктом
Сообщения автоматически склеены:

Моя основная задача была просто объявить нужный мне массив структур. Твой вариант тоже неплохой, но так структуры будут получается хранится внутри массива, до тех пор, пока не создашь новый массив структур и присвоишь ему значения массива
 

xstage

🏹
Сообщения
726
Реакции
754
Я обновил тему, посмотри. Нашел тут: C#. Динамическое выделение памяти. Оператор new. Выделение памяти для типов-значений, структур, перечислений, объектов классов. Выделение памяти для массивов | BestProg между 6 и 7 пунктом
Сообщения автоматически склеены:

Моя основная задача была просто объявить нужный мне массив структур. Твой вариант тоже неплохой, но так структуры будут получается хранится внутри массива, до тех пор, пока не создашь новый массив структур и присвоишь ему значения массива
Структуры это тоже массивы в SourcePawn. А если брать глобальную область, то там не получится объявить динамический массив, компилятор тупо не даст это сделать.
 

DeathScore13

пирожок. пирожочек.
Сообщения
734
Реакции
403
глобальная область видимости и константные массивы записываются в .data секцию и их размер не может быть расширен во время работы плагина. это вам не c#
 
Сверху Снизу