forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   Хитрая хитрость (http://forum.boolean.name/showthread.php?t=8571)

impersonalis 28.06.2009 12:23

Ответ: Хитрая хитрость
 
Цитата:

Сообщение от jimon (Сообщение 109293)
Mr_F_
я сделал проще немного, у меня в файле содержится имя переменной и её значение
в программе где нужно я просто получаю значение по имени
таким образом если переменной не было то вернётся default значение :)

Я в подобной (судя по описанию jimon) задаче делал так:
грузил весь файл, пропарсивая каждую конструкцию в класс
class MyClass{
var acc=0;
char *name;
var value;
}
Функция запроса значения находила соотвествующей значение по имени внутри списка. Каждое обращение инкерментирует компонент acc. Таким образом, после процессинга перменых, можно прочекать экхемпляры с занулённым счётчиком доступа, чтобы избежать опчеаток в тексте (защита от дурака).
Единственное что - у меня гарнтировано всегда грузились все переменные (не было невостребованных), в противном случае защита несколько усложняется -надо сверять имя перменной с разрешёнными.

Mr_F_ 28.06.2009 14:38

Ответ: Хитрая хитрость
 
хмм как находите переменную по имени?)
на этой странице не нашёл)
в смысле имя из файла это ж стринг будет

jimon 28.06.2009 22:36

Ответ: Хитрая хитрость
 
Mr_F_
перебираешь все переменные и сравниваешь имя
строка это набор символов, физически это масив символов, для удобства создают класс который оперирует с ним, в STL для этого используется std::string, но никто не запрещает тебе работать прямо с масивом

Mr_F_ 28.06.2009 22:56

Ответ: Хитрая хитрость
 
ну перебирать это зло)
медленно и говнокодово

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

я делал универсальней в том плане что вместо тысяч ифов мы просто делаем.
массив[номер параметра] = значение
и это действует на любой класс. биндить к элентам массива элементы класса не так паревно как ифить при загрузке.
:)

jimon 28.06.2009 23:14

Ответ: Хитрая хитрость
 
Mr_F_
ну бери хеш от имени переменной и создавай бинарное дерево с ключами ввиде этого хеша, тогда поиск нужного значения по имени будет O(log N)
имхо твои старания напрасны, если бы у тебя было бы 2 млрд этих переменных, тогда да, а так если их не больше 2-3 тысяч - тогда и все сравнить неплохо

Mr_F_ 29.06.2009 13:34

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

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

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

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

кстати, что такое хеш? :)

jimon 29.06.2009 13:48

Ответ: Хитрая хитрость
 
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 14:40

Ответ: Хитрая хитрость
 
Цитата:

какая еще тысяча if'ов ?
ты же будешь сравнивать при загрузке имя параметра

jimon 29.06.2009 14:52

Ответ: Хитрая хитрость
 
Mr_F_
видишь эти строки ?
Код:

...
SerializeStream->OpenSection("SceneNode");
...
SerializeStream->CloseSection();
...

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

время затраченное на загрузку информации переменных совсем не заметно в сравнении с временем затраченным на загрузку текстур\моделей


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot