|
Xors3D Графический движок с поддержкой DirectX9 |
09.10.2012, 11:26
|
#1
|
ПроЭктировщик
Регистрация: 26.12.2008
Адрес: Usa
Сообщений: 151
Написано 5 полезных сообщений (для 6 пользователей)
|
Проблема с 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);
|
(Offline)
|
|
09.10.2012, 11:48
|
#2
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Проблема с 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);
|
(Offline)
|
|
Эти 3 пользователя(ей) сказали Спасибо HolyDel за это полезное сообщение:
|
|
09.10.2012, 15:05
|
#3
|
ПроЭктировщик
Регистрация: 26.12.2008
Адрес: Usa
Сообщений: 151
Написано 5 полезных сообщений (для 6 пользователей)
|
Ответ: Проблема с Xors3D на C++
А почему нельзя?
Не все ли равно, куда считывать?
Можно сказать, конечно, что это быдлокодинг, но ведь это не причина данной проблемы.
И какую роль играет конфигурация?
|
(Offline)
|
|
09.10.2012, 15:14
|
#4
|
|
Ответ: Проблема с Xors3D на C++
Сообщение от DarkMedveD
А почему нельзя?
Не все ли равно, куда считывать?
Можно сказать, конечно, что это быдлокодинг, но ведь это не причина данной проблемы.
И какую роль играет конфигурация?
|
знакомься : UB (undefined behavior), он же http://ru.wikipedia.org/wiki/%D0%9D%...BD%D0%B8%D0%B5
|
|
|
Сообщение было полезно следующим пользователям:
|
|
09.10.2012, 15:21
|
#5
|
ПроЭктировщик
Регистрация: 26.12.2008
Адрес: Usa
Сообщений: 151
Написано 5 полезных сообщений (для 6 пользователей)
|
Ответ: Проблема с Xors3D на C++
Ох ты как.
Я даже не знал, что такое бывает.
В любом случае, технически я не могу понять, как два значения могут меняться.
Но буду избегать этого и явно показывать, разумеется.
|
(Offline)
|
|
09.10.2012, 19:19
|
#6
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Проблема с Xors3D на C++
В любом случае, технически я не могу понять, как два значения могут меняться.
|
какой из параметров будет считаться первым не знаем (UB )
someFunc(read_one_byte(),read_one_byte())
если сначала считается первый параметр - то в первом параметре идет первый байт из файла, во втором параметре второй байт из файла.
если сначала считаетася второй параметр - то в первом параметре идет второй байт из файла, а во втором - первый.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо HolyDel за это полезное сообщение:
|
|
10.10.2012, 10:29
|
#7
|
ПроЭктировщик
Регистрация: 26.12.2008
Адрес: Usa
Сообщений: 151
Написано 5 полезных сообщений (для 6 пользователей)
|
Ответ: Проблема с Xors3D на C++
Да, почитал вчера про это, потом понял.
Просто мне казалось, что внутри функции это организовано за меня.
Но буду знать. Спасибо.
|
(Offline)
|
|
12.10.2012, 09:47
|
#8
|
Дэвелопер
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений (для 886 пользователей)
|
Ответ: Проблема с 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++
|
(Offline)
|
|
12.10.2012, 11:12
|
#9
|
Злобный Админ
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений (для 9,330 пользователей)
|
Ответ: Проблема с Xors3D на C++
Какой профит в данном случае от использования префиксного инкремента?
__________________
|
(Offline)
|
|
12.10.2012, 13:48
|
#10
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: Проблема с Xors3D на C++
А какой профит от постфиксного? Я придерживаюсь мнения что лучше всегда писать префиксный, если только явно не нужен постфиксный.
например завтра это превратится в:
for (super_slow_postfix_increment_iterator i=0,size=Objects.size();i<size;++i)
|
и тогда польза будет.
|
(Offline)
|
|
12.10.2012, 13:49
|
#11
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Проблема с Xors3D на C++
Народ думает что т.к. префиксный это одна операция заместо двух с аллокацией временной переменной, и поэтому использует префиксный, думая что он умнее компилятора.
Хотя я тоже себе в привычку взял это..
|
(Offline)
|
|
12.10.2012, 14:52
|
#12
|
Дэвелопер
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений (для 886 пользователей)
|
Ответ: Проблема с Xors3D на C++
Я считаю так же как МоКа написал. В книжке "Решение сложных задач на С++" прочитал.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 13:03.
|