forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Xors3D (http://forum.boolean.name/forumdisplay.php?f=126)
-   -   Проблема с Xors3D на C++ (http://forum.boolean.name/showthread.php?t=17348)

DarkMedveD 09.10.2012 11:26

Проблема с Xors3D на C++
 
Суть проблемы проста и ужасна:
Если выбрана конфигурация Debug, то каким-то странным образом Xors меняет все координаты X на Z и наоборот.
Если выбрала конфигурация Release, то все нормально.

А столкнулся я с проблемой когда сохранял данные в файл. В зависимости от конфигурации он подставляет разные данные:

Код:

int        SaveGame=xWriteFile(patch);
        int i;
        xWriteInt(SaveGame,int(Objects.size()));
        for (i=0;i<int(Objects.size());i++)
        {
                xWriteInt(SaveGame, Objects[i].Type);
                xWriteFloat(SaveGame, float(Objects[i].x));
                xWriteFloat(SaveGame, float(Objects[i].y));
                xWriteFloat(SaveGame, float(Objects[i].z));
                xWriteFloat(SaveGame, float(Objects[i].ax));
                xWriteFloat(SaveGame, float(Objects[i].ay));
                xWriteFloat(SaveGame, float(Objects[i].az));
                xWriteFloat(SaveGame, float(Objects[i].sx));
                xWriteFloat(SaveGame, float(Objects[i].sy));
                xWriteFloat(SaveGame, float(Objects[i].sz));
        }
        xCloseFile(SaveGame);

После этого я загружаю их из файла и получаю, в зависимости от конфигурации разные координаты:
Код:

        int LoadGame=xReadFile(patch);
        int size=xReadInt(LoadGame);
        int i;
        for (i=0;i<size;i++)
        {
                int type=xReadInt(LoadGame);
                Objects.push_back(Items[type]);
                Objects[i].Type=type;
                Objects[i].SetPosition(xReadFloat(LoadGame),xReadFloat(LoadGame),xReadFloat(LoadGame));
                Objects[i].TurnObject(xReadFloat(LoadGame),xReadFloat(LoadGame),xReadFloat(LoadGame));
                Objects[i].ScaleObject(xReadFloat(LoadGame)-1,xReadFloat(LoadGame)-1,xReadFloat(LoadGame)-1);
                xEntityFX(Objects[i].Mesh,0);
        }
        xCloseFile(LoadGame);


HolyDel 09.10.2012 11:48

Ответ: Проблема с Xors3D на C++
 
Код:

Objects[i].SetPosition(xReadFloat(LoadGame),xReadFloat(LoadGame),xReadFloat(LoadGame));
нельзя так делать!
порядок вычисления аргуметов - не определен.
Код:

x = xReadFloat(LoadGame);
y = xReadFloat(LoadGame);
z = xReadFloat(LoadGame);
Objects[i].SetPosition(x,y,z);


DarkMedveD 09.10.2012 15:05

Ответ: Проблема с Xors3D на C++
 
А почему нельзя?
Не все ли равно, куда считывать?

Можно сказать, конечно, что это быдлокодинг, но ведь это не причина данной проблемы.

И какую роль играет конфигурация?

jimon 09.10.2012 15:14

Ответ: Проблема с Xors3D на C++
 
Цитата:

Сообщение от DarkMedveD (Сообщение 239931)
А почему нельзя?
Не все ли равно, куда считывать?

Можно сказать, конечно, что это быдлокодинг, но ведь это не причина данной проблемы.

И какую роль играет конфигурация?

знакомься : UB (undefined behavior), он же http://ru.wikipedia.org/wiki/%D0%9D%...BD%D0%B8%D0%B5

DarkMedveD 09.10.2012 15:21

Ответ: Проблема с Xors3D на C++
 
Ох ты как.
Я даже не знал, что такое бывает.

В любом случае, технически я не могу понять, как два значения могут меняться.

Но буду избегать этого и явно показывать, разумеется.

HolyDel 09.10.2012 19:19

Ответ: Проблема с Xors3D на C++
 
Цитата:

В любом случае, технически я не могу понять, как два значения могут меняться.
Код:

someFunc(a,b)
какой из параметров будет считаться первым не знаем (UB )
Код:

someFunc(read_one_byte(),read_one_byte())
если сначала считается первый параметр - то в первом параметре идет первый байт из файла, во втором параметре второй байт из файла.
если сначала считаетася второй параметр - то в первом параметре идет второй байт из файла, а во втором - первый.

DarkMedveD 10.10.2012 10:29

Ответ: Проблема с Xors3D на C++
 
Да, почитал вчера про это, потом понял.

Просто мне казалось, что внутри функции это организовано за меня.
Но буду знать. Спасибо.

Жека 12.10.2012 09:47

Ответ: Проблема с Xors3D на C++
 
Вместо
Код:

for (i=0;i<int(Objects.size());i++)
я бы написал
Код:

for (int i=0,size=Objects.size();i<size;++i)
т.е. 1. размер получаем один раз при инициализации цикла, size=Objects.size()
2. префиксный инкремент ++i вместо i++

SBJoker 12.10.2012 11:12

Ответ: Проблема с Xors3D на C++
 
Какой профит в данном случае от использования префиксного инкремента?

HolyDel 12.10.2012 13:48

Ответ: Проблема с Xors3D на C++
 
А какой профит от постфиксного? Я придерживаюсь мнения что лучше всегда писать префиксный, если только явно не нужен постфиксный.

например завтра это превратится в:
Цитата:

for (super_slow_postfix_increment_iterator i=0,size=Objects.size();i<size;++i)
и тогда польза будет.

moka 12.10.2012 13:49

Ответ: Проблема с Xors3D на C++
 
Народ думает что т.к. префиксный это одна операция заместо двух с аллокацией временной переменной, и поэтому использует префиксный, думая что он умнее компилятора.
Хотя я тоже себе в привычку взял это..

Жека 12.10.2012 14:52

Ответ: Проблема с Xors3D на C++
 
Я считаю так же как МоКа написал. В книжке "Решение сложных задач на С++" прочитал.


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

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