Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 8 из 8
  1. #1
    Аватар для Salik_Davince
    Пользователь

    Статус
    Оффлайн
    Регистрация
    18.02.2014
    Сообщений
    93
    Репутация:
    1 ±

    Двумерные, трехмерные массивы

    Приветствую всех, решил взяться за свою наработку в кое каком инклуде, и то ли я что либо делаю не так то ли не знаю как правильно использовать энум в двухмерных и трехмерных массивах.

    Как я использую -

    1. enum materialedObj {
    2. mcID,
    3. mcObjectID,
    4. mcTexturedName[MAX_TEXTURED_INDEX][32],
    5. mcMovedtype
    6. }
    7.  
    8. new MaterialedObj[MAX_MATERIALED_OBJECTS][materialedObj];
    9.  
    10.  
    11. --- Первый пример использования
    12.  
    13. strcat(MaterialedObj[ID][mcTexturedTxdname][freeSlot], txdname);
    14.  
    15. ---- Второй
    16.  
    17. SetObjectMaterial(MaterialedObj[mciter][mcObjectID], MaterialedObj[mciter][mcTexturedIndex][i], MaterialedObj[mciter][mcTexturedModelid][i], MaterialedObj[mciter][mcTexturedTxdname][i], MaterialedObj[mciter][mcTexturedName][i], MaterialedObj[mciter][mcMaterialcolor][i]);


    [x] Я думаю вы поняли суть всего кода, вот при использвании вызывает ошибки, я делаю что либо не так?
    Последний раз редактировалось Salik_Davince; 10.02.2023 в 17:46.

  2. #2
    Аватар для Shaolinka
    Пользователь

    Статус
    Оффлайн
    Регистрация
    19.01.2020
    Сообщений
    69
    Репутация:
    8 ±
    В енуме нельзя замутить двумерный массив. Мути трёхмерный, то бишь:

    PHP код:
    new g_material_texture[MAX_MATERIALED_OBJECTS][MAX_TEXTURED_INDEX][32];

    strcat(g_material_texture[ID][freeSlot], txdname); 
    Насчёт второго примера, то я слегка не понял о чём речь, ибо какая-то часть элементов отсутствует в перечислении, ввиду того слегка не понятно что к чему. Но, если это данные, ограничивающиеся MAX_TEXTURED_INDEX, то тебе уж проще мутить трёхмерный массив, обращаясь к твоему перечислению

  3. #3
    Аватар для Salik_Davince
    Пользователь

    Статус
    Оффлайн
    Регистрация
    18.02.2014
    Сообщений
    93
    Репутация:
    1 ±
    Ну в данном случае, это система материалов для объектов, нанесение, сохраняет в массив все, и после удаления можно будет пересоздать данный объект со старыми данными, ну это пример.

    А что касается реализации, то при сохранении все сохраняет, так как все без текстового формата переменные, т.e int либо float, а в примере где используется название текстуры я тобишь хотел сделать её так же упрощенной, MaterialedObj[ID][mcTexturedTxdname][slot]

    Она по сути выглядит правдоподобно, но она трёхмерная, а мой массив двумерный который создается, если я сделаю его трёхмерным т.e -


    new MaterialedObj[MAX_MATERIALED_OBJECTS][MAX_TEXTURED_INDEX][materialedObj];

    То при использовании другие данные будут забаганы, т.e будут требовать использования индекса, и будет пустой массив последий (трёхмерный), блять я сам запутался, кароче видимо с enum такое не канает? и делать отдельный массив для texturename ?

  4. #4
    Аватар для Shaolinka
    Пользователь

    Статус
    Оффлайн
    Регистрация
    19.01.2020
    Сообщений
    69
    Репутация:
    8 ±
    Цитата Сообщение от Salik_Davince Посмотреть сообщение
    Ну в данном случае, это система материалов для объектов, нанесение, сохраняет в массив все, и после удаления можно будет пересоздать данный объект со старыми данными, ну это пример.

    А что касается реализации, то при сохранении все сохраняет, так как все без текстового формата переменные, т.e int либо float, а в примере где используется название текстуры я тобишь хотел сделать её так же упрощенной, MaterialedObj[ID][mcTexturedTxdname][slot]

    Она по сути выглядит правдоподобно, но она трёхмерная, а мой массив двумерный который создается, если я сделаю его трёхмерным т.e -


    new MaterialedObj[MAX_MATERIALED_OBJECTS][MAX_TEXTURED_INDEX][materialedObj];

    То при использовании другие данные будут забаганы, т.e будут требовать использования индекса, и будет пустой массив последий (трёхмерный), блять я сам запутался, кароче видимо с enum такое не канает? и делать отдельный массив для texturename ?
    Это, по сути, единственный работоспособный вариант, с трёхмерным массивом для сохранения имени текстуры. Собственно, ключевую работу системы уловил: основная загвоздка в том, что остальные данные, кроме названия текстуры, должны ограничиваться MAX_MATERIALED_OBJECTS и по итогу, добавив для них ещё одну меру: MAX_TEXTURED_INDEX, логика уже будет работать иным образом. Вообщем, решение выше уже дал.

  5. #5
    Аватар для Salik_Davince
    Пользователь

    Статус
    Оффлайн
    Регистрация
    18.02.2014
    Сообщений
    93
    Репутация:
    1 ±
    С этим более разобрался, а как задавать значение всему массиву в enum ?

    Тобишь - это даёт ошибку:

    1. enum materialedCP {
    2. mcID,
    3. mcTexturedIndex[MAX_TEXTURED_INDEX] = {-1, ...},//error 029: invalid expression, assumed zero
    4. mcAreaID
    5. };


    Либо нужно просто сделать так ?

    1. mcTexturedIndex[MAX_TEXTURED_INDEX] = -1


    И будет ли равна каждая ячейка -1, в ниже указанном варианте ?

  6. #6
    Аватар для Shaolinka
    Пользователь

    Статус
    Оффлайн
    Регистрация
    19.01.2020
    Сообщений
    69
    Репутация:
    8 ±
    Автозаполнение массива в енуме отсутствует, если уж и хочется присвоить структуре определённые значения по-умолчанию, то стоит прибегать к использованию массива, обращающегося к перечислению и, в том же таки массиве, описывать данные. То бишь как-то так:

    PHP код:
    enum materialedCP {
        
    mcID,
        
    mcTexturedIndex[MAX_TEXTURED_INDEX],
        
    mcAreaID
    };

    new 
    g_material_default_values[materialedCP] = 
    {
        {-
    1},
        {-
    1, ...},
        {-
    1}
    };

    stock ClearMaterialData(id)
        return 
    /* массив, обращающийся к структуре с материалами[id] */ g_material_default_values;

    ClearMaterialData(...); 
    Насчёт второго, то нет, такова вариация не применит значение ко всем ячейкам
    Последний раз редактировалось Shaolinka; 11.02.2023 в 22:09.

  7. #7
    Аватар для Leogin
    Пользователь

    Статус
    Оффлайн
    Регистрация
    07.06.2022
    Сообщений
    13
    Репутация:
    1 ±
    Есть еще костыль
    1. enum materialedObj {
    2. mcID,
    3. mcObjectID,
    4. mcTexturedName[MAX_TEXTURED_INDEX * 32],
    5. mcMovedtype
    6. };
    7.  
    8. new MaterialedObj[MAX_MATERIALED_OBJECTS][materialedObj];



    Записываем:
    1. strmid(MaterialedObj[ID][mcTexturedName][MAX_TEXTURED_INDEX * freeSlot], txdname, 0, MAX_TEXTURED_INDEX);


    Читаем:
    1. new str[MAX_TEXTURED_INDEX];
    2. strmid(str, MaterialedObj[mciter][mcTexturedName][MAX_TEXTURED_INDEX * i], MAX_TEXTURED_INDEX * i, MAX_TEXTURED_INDEX * i + MAX_TEXTURED_INDEX);
    3. SetObjectMaterial(MaterialedObj[mciter][mcObjectID], MaterialedObj[mciter][mcTexturedIndex][i], MaterialedObj[mciter][mcTexturedModelid][i], MaterialedObj[mciter][mcTexturedTxdname][i], str, MaterialedObj[mciter][mcMaterialcolor][i]);

  8. #8
    Аватар для punkochel
    Пользователь

    Статус
    Оффлайн
    Регистрация
    08.12.2018
    Адрес
    Россия
    Сообщений
    146
    Репутация:
    25 ±
    Можно создать массив со всеми использующимися текстурами (либо таблицу в БД) и в enum создать двумерных массив для хранения индексов текстур. Это будет даже более правильнее ибо константы в виде названия текстур будут в единственном экземпляре (в массиве или в БД).

    UPD:
    Это можно представить как если бы для проектирования колес автомобиля мы для каждого из четырех колес создавали бы отдельный макет/проект, при условии что все четыре колеса должны быть одинаковыми.
    Просто незачем хранить не уникальные значения для каждого типа предмета. Дублирование данных является дурным тоном, ибо при последующем изменении обязательно что-то забудете изменить и возникнут ошибки там, где их не должно было быть.
    Последний раз редактировалось punkochel; 12.02.2023 в 15:00.

 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •