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

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

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

Xors3D Графический движок с поддержкой DirectX9

Ответ
 
Опции темы
Старый 09.10.2012, 11:26   #1
DarkMedveD
ПроЭктировщик
 
Аватар для DarkMedveD
 
Регистрация: 26.12.2008
Адрес: Питер
Сообщений: 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
HolyDel
 
Регистрация: 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 за это полезное сообщение:
DarkMedveD (09.10.2012), L-ee-X (09.10.2012), St_AnGer (09.10.2012)
Старый 09.10.2012, 15:05   #3
DarkMedveD
ПроЭктировщик
 
Аватар для DarkMedveD
 
Регистрация: 26.12.2008
Адрес: Питер
Сообщений: 151
Написано 5 полезных сообщений
(для 6 пользователей)
Ответ: Проблема с Xors3D на C++

А почему нельзя?
Не все ли равно, куда считывать?

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

И какую роль играет конфигурация?
__________________
Фантазия плохого программиста ограничивается его знанием языка. Фантазия хорошего программиста ограничивается возможностями языка и компилятором. Фантазия гениального программиста не ограничивается ничем.
(Offline)
 
Ответить с цитированием
Старый 09.10.2012, 15:14   #4
jimon
 
Сообщений: n/a
Ответ: Проблема с Xors3D на C++

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

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

И какую роль играет конфигурация?
знакомься : UB (undefined behavior), он же http://ru.wikipedia.org/wiki/%D0%9D%...BD%D0%B8%D0%B5
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
DarkMedveD (09.10.2012)
Старый 09.10.2012, 15:21   #5
DarkMedveD
ПроЭктировщик
 
Аватар для DarkMedveD
 
Регистрация: 26.12.2008
Адрес: Питер
Сообщений: 151
Написано 5 полезных сообщений
(для 6 пользователей)
Ответ: Проблема с Xors3D на C++

Ох ты как.
Я даже не знал, что такое бывает.

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

Но буду избегать этого и явно показывать, разумеется.
__________________
Фантазия плохого программиста ограничивается его знанием языка. Фантазия хорошего программиста ограничивается возможностями языка и компилятором. Фантазия гениального программиста не ограничивается ничем.
(Offline)
 
Ответить с цитированием
Старый 09.10.2012, 19:19   #6
HolyDel
 
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений
(для 2,707 пользователей)
Ответ: Проблема с Xors3D на C++

В любом случае, технически я не могу понять, как два значения могут меняться.
someFunc(a,b)
какой из параметров будет считаться первым не знаем (UB )
someFunc(read_one_byte(),read_one_byte())
если сначала считается первый параметр - то в первом параметре идет первый байт из файла, во втором параметре второй байт из файла.
если сначала считаетася второй параметр - то в первом параметре идет второй байт из файла, а во втором - первый.
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо HolyDel за это полезное сообщение:
DarkMedveD (10.10.2012), St_AnGer (09.10.2012)
Старый 10.10.2012, 10:29   #7
DarkMedveD
ПроЭктировщик
 
Аватар для DarkMedveD
 
Регистрация: 26.12.2008
Адрес: Питер
Сообщений: 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
SBJoker
Злобный Админ
 
Аватар для SBJoker
 
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений
(для 9,330 пользователей)
Ответ: Проблема с Xors3D на C++

Какой профит в данном случае от использования префиксного инкремента?
__________________
(Offline)
 
Ответить с цитированием
Старый 12.10.2012, 13:48   #10
HolyDel
 
Регистрация: 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
moka
.
 
Регистрация: 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)
 
Ответить с цитированием
Ответ


Опции темы

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

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


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


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