|
28.06.2009, 12:23
|
#16
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Хитрая хитрость
Сообщение от jimon
Mr_F_
я сделал проще немного, у меня в файле содержится имя переменной и её значение
в программе где нужно я просто получаю значение по имени
таким образом если переменной не было то вернётся default значение
|
Я в подобной (судя по описанию jimon) задаче делал так:
грузил весь файл, пропарсивая каждую конструкцию в класс
class MyClass{
var acc=0;
char *name;
var value;
}
Функция запроса значения находила соотвествующей значение по имени внутри списка. Каждое обращение инкерментирует компонент acc. Таким образом, после процессинга перменых, можно прочекать экхемпляры с занулённым счётчиком доступа, чтобы избежать опчеаток в тексте (защита от дурака).
Единственное что - у меня гарнтировано всегда грузились все переменные (не было невостребованных), в противном случае защита несколько усложняется -надо сверять имя перменной с разрешёнными.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
28.06.2009, 14:38
|
#17
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Хитрая хитрость
хмм как находите переменную по имени?)
на этой странице не нашёл)
в смысле имя из файла это ж стринг будет
|
(Offline)
|
|
28.06.2009, 22:36
|
#18
|
|
Ответ: Хитрая хитрость
Mr_F_
перебираешь все переменные и сравниваешь имя
строка это набор символов, физически это масив символов, для удобства создают класс который оперирует с ним, в STL для этого используется std::string, но никто не запрещает тебе работать прямо с масивом
|
|
|
Сообщение было полезно следующим пользователям:
|
|
28.06.2009, 22:56
|
#19
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Хитрая хитрость
ну перебирать это зло)
медленно и говнокодово
я не бы не создавал эту тему если б хотел обходиться перебором.
я делал универсальней в том плане что вместо тысяч ифов мы просто делаем.
массив[номер параметра] = значение
и это действует на любой класс. биндить к элентам массива элементы класса не так паревно как ифить при загрузке.
|
(Offline)
|
|
28.06.2009, 23:14
|
#20
|
|
Ответ: Хитрая хитрость
Mr_F_
ну бери хеш от имени переменной и создавай бинарное дерево с ключами ввиде этого хеша, тогда поиск нужного значения по имени будет O(log N)
имхо твои старания напрасны, если бы у тебя было бы 2 млрд этих переменных, тогда да, а так если их не больше 2-3 тысяч - тогда и все сравнить неплохо
|
|
|
29.06.2009, 13:34
|
#21
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Хитрая хитрость
да дело скорее не в скорости выполнения а в том что хотя бы просто неприятно смотреть на код с тысячей ифов)
ведь выходит что придётся сделать сравнения:
- номер класса с классом (и так есть)
- в КАЖДОМ варианте про каждый класс - номера параметра с элементом класса
просто скроллить даже неудобно
--
кстати, что такое хеш?
|
(Offline)
|
|
29.06.2009, 13:48
|
#22
|
|
Ответ: Хитрая хитрость
Mr_F_
какая еще тысяча if'ов ?
вот смотри, код сохранения\загрузки параметров узла графа сцены в\из файл
//! Serialize
virtual void Serialize(core::ISerializeStream * SerializeStream,u1 IfTrueThanWrite)
{
SerializeStream->OpenSection("SceneNode");
if(IfTrueThanWrite)
{
SerializeStream->SetValue("NodeName",NodeName);
SerializeStream->SetValue("CurrentPosition.X",CurrentPosition.X);
SerializeStream->SetValue("CurrentPosition.Y",CurrentPosition.Y);
SerializeStream->SetValue("CurrentPosition.Z",CurrentPosition.Z);
SerializeStream->SetValue("CurrentRotation.X",CurrentRotation.X);
SerializeStream->SetValue("CurrentRotation.Y",CurrentRotation.Y);
SerializeStream->SetValue("CurrentRotation.Z",CurrentRotation.Z);
SerializeStream->SetValue("CurrentScale.X",CurrentScale.X);
SerializeStream->SetValue("CurrentScale.Y",CurrentScale.Y);
SerializeStream->SetValue("CurrentScale.Z",CurrentScale.Z);
SerializeStream->SetValue("Visible",(s8)Visible);
}
else
{
NodeName = SerializeStream->GetValuejeStringd("NodeName");
CurrentPosition.X = SerializeStream->GetValuef32("CurrentPosition.X");
CurrentPosition.Y = SerializeStream->GetValuef32("CurrentPosition.Y");
CurrentPosition.Z = SerializeStream->GetValuef32("CurrentPosition.Z");
CurrentRotation.X = SerializeStream->GetValuef32("CurrentRotation.X");
CurrentRotation.Y = SerializeStream->GetValuef32("CurrentRotation.Y");
CurrentRotation.Z = SerializeStream->GetValuef32("CurrentRotation.Z");
CurrentScale.X = SerializeStream->GetValuef32("CurrentScale.X");
CurrentScale.Y = SerializeStream->GetValuef32("CurrentScale.Y");
CurrentScale.Z = SerializeStream->GetValuef32("CurrentScale.Z");
Visible = SerializeStream->GetValues8("Visible")?true:false;
NeedToRebuildMatrix = true;
}
SerializeStream->CloseSection();
}
у меня так все обьекты сохраняют\загружают информацию
потом я просто пишу Scene->LoadScene("scene1.dat") и вся сцена загружается из этого файла
если надо - могу написать Scene->SaveScene("somefile.dat") и вся сцена сохранится в этот файл
|
|
|
Сообщение было полезно следующим пользователям:
|
|
29.06.2009, 14:40
|
#23
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Хитрая хитрость
ты же будешь сравнивать при загрузке имя параметра
|
(Offline)
|
|
29.06.2009, 14:52
|
#24
|
|
Ответ: Хитрая хитрость
Mr_F_
видишь эти строки ?
...
SerializeStream->OpenSection("SceneNode");
...
SerializeStream->CloseSection();
...
это означает что у меня древовидное разбиение информации
те - все переменные не скидываются в общую кучу, а скидываются в секцию, секция может содержать в себе другие секции и тд
в итоге получается что мы достаём переменные только из текущей секции, в одной секции редко бывает больше 100 переменных (а зачем ?), потому тут в среднем где-то 10-20 сравнений для поиска нужной информации
время затраченное на загрузку информации переменных совсем не заметно в сравнении с временем затраченным на загрузку текстур\моделей
|
|
|
Сообщение было полезно следующим пользователям:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 08:37.
|