PDA

Просмотр полной версии : [Вопрос] Двумерные, трехмерные массивы



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

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


enum materialedObj {
mcID,
mcObjectID,
mcTexturedName[MAX_TEXTURED_INDEX][32],
mcMovedtype
}

new MaterialedObj[MAX_MATERIALED_OBJECTS][materialedObj];


--- Первый пример использования

strcat(MaterialedObj[ID][mcTexturedTxdname][freeSlot], txdname);

---- Второй

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] Я думаю вы поняли суть всего кода, вот при использвании вызывает ошибки, я делаю что либо не так?

Shaolinka
10.02.2023, 18:12
В енуме нельзя замутить двумерный массив. Мути трёхмерный, то бишь:



new g_material_texture[MAX_MATERIALED_OBJECTS][MAX_TEXTURED_INDEX][32];

strcat(g_material_texture[ID][freeSlot], txdname);



Насчёт второго примера, то я слегка не понял о чём речь, ибо какая-то часть элементов отсутствует в перечислении, ввиду того слегка не понятно что к чему. Но, если это данные, ограничивающиеся MAX_TEXTURED_INDEX, то тебе уж проще мутить трёхмерный массив, обращаясь к твоему перечислению

Salik_Davince
10.02.2023, 21:02
Ну в данном случае, это система материалов для объектов, нанесение, сохраняет в массив все, и после удаления можно будет пересоздать данный объект со старыми данными, ну это пример.

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

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


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

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

Shaolinka
11.02.2023, 14:33
Ну в данном случае, это система материалов для объектов, нанесение, сохраняет в массив все, и после удаления можно будет пересоздать данный объект со старыми данными, ну это пример.

А что касается реализации, то при сохранении все сохраняет, так как все без текстового формата переменные, т.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, логика уже будет работать иным образом. Вообщем, решение выше уже дал.

Salik_Davince
11.02.2023, 17:33
С этим более разобрался, а как задавать значение всему массиву в enum ?

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

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

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

mcTexturedIndex[MAX_TEXTURED_INDEX] = -1

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

Shaolinka
11.02.2023, 22:05
Автозаполнение массива в енуме отсутствует, если уж и хочется присвоить структуре определённые значения по-умолчанию, то стоит прибегать к использованию массива, обращающегося к перечислению и, в том же таки массиве, описывать данные. То бишь как-то так:



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(...);


Насчёт второго, то нет, такова вариация не применит значение ко всем ячейкам

Leogin
12.02.2023, 09:37
Есть еще костыль
enum materialedObj {
mcID,
mcObjectID,
mcTexturedName[MAX_TEXTURED_INDEX * 32],
mcMovedtype
};

new MaterialedObj[MAX_MATERIALED_OBJECTS][materialedObj];


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

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

punkochel
12.02.2023, 14:54
Можно создать массив со всеми использующимися текстурами (либо таблицу в БД) и в enum создать двумерных массив для хранения индексов текстур. Это будет даже более правильнее ибо константы в виде названия текстур будут в единственном экземпляре (в массиве или в БД).

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