Просмотр полной версии : [Вопрос] Двумерные, трехмерные массивы
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(...);
Насчёт второго, то нет, такова вариация не применит значение ко всем ячейкам
Есть еще костыль
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:
Это можно представить как если бы для проектирования колес автомобиля мы для каждого из четырех колес создавали бы отдельный макет/проект, при условии что все четыре колеса должны быть одинаковыми.
Просто незачем хранить не уникальные значения для каждого типа предмета. Дублирование данных является дурным тоном, ибо при последующем изменении обязательно что-то забудете изменить и возникнут ошибки там, где их не должно было быть.
Powered by vBulletin® Version 4.2.0 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot