Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > C++

Ответ
 
Опции темы
Старый 28.06.2009, 12:23   #16
impersonalis
Зануда с интернетом
 
Аватар для impersonalis
 
Регистрация: 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
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: Хитрая хитрость

хмм как находите переменную по имени?)
на этой странице не нашёл)
в смысле имя из файла это ж стринг будет
__________________
бложик | geom.io | твиттер | faded | демо 1 2 | роботы | лайтмаппер
(Offline)
 
Ответить с цитированием
Старый 28.06.2009, 22:36   #18
jimon
 
Сообщений: n/a
Ответ: Хитрая хитрость

Mr_F_
перебираешь все переменные и сравниваешь имя
строка это набор символов, физически это масив символов, для удобства создают класс который оперирует с ним, в STL для этого используется std::string, но никто не запрещает тебе работать прямо с масивом
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
impersonalis (28.06.2009)
Старый 28.06.2009, 22:56   #19
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: Хитрая хитрость

ну перебирать это зло)
медленно и говнокодово

я не бы не создавал эту тему если б хотел обходиться перебором.

я делал универсальней в том плане что вместо тысяч ифов мы просто делаем.
массив[номер параметра] = значение
и это действует на любой класс. биндить к элентам массива элементы класса не так паревно как ифить при загрузке.
__________________
бложик | geom.io | твиттер | faded | демо 1 2 | роботы | лайтмаппер
(Offline)
 
Ответить с цитированием
Старый 28.06.2009, 23:14   #20
jimon
 
Сообщений: n/a
Ответ: Хитрая хитрость

Mr_F_
ну бери хеш от имени переменной и создавай бинарное дерево с ключами ввиде этого хеша, тогда поиск нужного значения по имени будет O(log N)
имхо твои старания напрасны, если бы у тебя было бы 2 млрд этих переменных, тогда да, а так если их не больше 2-3 тысяч - тогда и все сравнить неплохо
 
Ответить с цитированием
Старый 29.06.2009, 13:34   #21
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: Хитрая хитрость

да дело скорее не в скорости выполнения а в том что хотя бы просто неприятно смотреть на код с тысячей ифов)

ведь выходит что придётся сделать сравнения:

- номер класса с классом (и так есть)
- в КАЖДОМ варианте про каждый класс - номера параметра с элементом класса

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

кстати, что такое хеш?
__________________
бложик | geom.io | твиттер | faded | демо 1 2 | роботы | лайтмаппер
(Offline)
 
Ответить с цитированием
Старый 29.06.2009, 13:48   #22
jimon
 
Сообщений: n/a
Ответ: Хитрая хитрость

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") и вся сцена сохранится в этот файл
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Mr_F_ (29.06.2009)
Старый 29.06.2009, 14:40   #23
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: Хитрая хитрость

какая еще тысяча if'ов ?
ты же будешь сравнивать при загрузке имя параметра
__________________
бложик | geom.io | твиттер | faded | демо 1 2 | роботы | лайтмаппер
(Offline)
 
Ответить с цитированием
Старый 29.06.2009, 14:52   #24
jimon
 
Сообщений: n/a
Ответ: Хитрая хитрость

Mr_F_
видишь эти строки ?
...
SerializeStream->OpenSection("SceneNode");
...
SerializeStream->CloseSection();
...
это означает что у меня древовидное разбиение информации
те - все переменные не скидываются в общую кучу, а скидываются в секцию, секция может содержать в себе другие секции и тд
в итоге получается что мы достаём переменные только из текущей секции, в одной секции редко бывает больше 100 переменных (а зачем ?), потому тут в среднем где-то 10-20 сравнений для поиска нужной информации

время затраченное на загрузку информации переменных совсем не заметно в сравнении с временем затраченным на загрузку текстур\моделей
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Mr_F_ (29.06.2009)
Ответ


Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 01:59.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com