GameDev.ru
/ GameDev.ru / Пользователи / Andrey / Сообщения на форуме пользователя Andrey (196 стр.)

Сообщения на форуме пользователя Andrey (196 стр.)

Зацените бинарное дерево (С++).18 фев. 200614:03#19
kronos_vano
Привет коллега!! Что в стуктуры данных подался?
особо не вникал но тебе уже многое сказали есть замечания:
вместо class в шаблоне лучше использовать typename
template <typename T, typename T1>
int Tree<T, T1>::m_CountNodes(Node<T,T1>* root)
{
  if (root)
    return 1+m_CountNodes(root->m_left)+m_CountNodes(root->m_right);
  else
    return 0;
}
Win32: Как в блоке в блоке __try...__except получить адрес указателя?18 фев. 200613:32#0
Привет всем!
В проекте игры иногда возникает системеное исключение с кодом 0xc0000005
т.е. Access Violation неправильная работа с памятью. Просто гдето идет обращение к нулевому или неинициализированному указателю.
Отловить адрес указателя из среды отладки очень трудно. Как это сделать имея следующий код:
__try {
	//работа приложения
	}
	__except (EXCEPTION_EXECUTE_HANDLER) {//отлов системных исключений ОС Windows
		enum {size = 200};
		char buf[size] = {'\0'};
//получить код исключения
		int code = GetExceptionCode();
		sprintf(buf, "%s%x%s", "Fatal error, exeption code: 0x", code, "\nProgram terminate\n");
//выод в лог файл ошибки...
		Log::write(buf);
	}
как можно получить значение адреса при обращении к которому возникло исключение с кодом 0xc0000005?
Может есть какая-нибудь функция Win32?
Отладить это из под среды Visual C++ невозможно. Сдеать это нужно при запуске проекта не из под среды Visual C++.
Иными словами получить что-то подобное что пишет отладчик Visual C++, но в лог файле:
First-chance exception at 0x00404b43 in new_horizonts.exe: 0xC0000005: Access violation writing location 0x7c802011.
По значению адреса я хотел бы узнать валидный ли указатель, иными словами
если он нулевой, то тут все понятно, если его значение будет что-то типа:
0xffffffff, 0xdddddddd, 0xcccccccc и т.д. то тут понятно что там мусор и он не инициализирован корректно либо произашла порча памяти.
Спасибо всем заранее.
С Уважением Андрей.
Подскажите, что у меня за ошибки, при переходе с 2003DX на directx 9.0 sdk (summer 2004). Ошибок много, но они все однотипные.17 фев. 200618:37#1
Striker_Dev
Visual C++ Net 2002 или Visual C++ 6.0 я так понимаю? т.к. в Visual C++ .Net 2003 нет istream.h т.к. он устарел.
Загрузка уровня12 фев. 20061:06#1
Predat0R
объемный вопрос лучше всего сделать так кfк тебе удобно
подписываюсь.
Проблемы с bsearch :(7 фев. 200618:37#21
all
Проблема была в функции сравнения...
Спасибо всем откликнувшися.
отделное спасибо User007, arabesc
Проблемы с bsearch :(6 фев. 20068:43#16
Конишуа
fr
посмотрел std::lower_bound, std::equal_range
но все эти функции требуют чтобы в качестве ключа был объект но не ключ который внутри объекта.
equal_range возвращает пару pair<Object, Object> res;
вот этот код вообще не компилируется:
Object Obj(names[type]);
pair<Object, Object> res
 = equal_range(objects, objects + size, Obj, &Object::compare3);
lower_boud не правильно находит:
Object Obj(names[type]);
obj = lower_bound(objects, objects + size, Obj, &Object::compare3);
Функция сравнения:
//функция сравнения
static int compare3(const Object& arg1, const Object& arg2)
{
	return arg1.getname().size() < arg2.getname().size();
}
fr,
arabesc
>Ну так в последнем примере его нет. И compare1 это только для bsearch, для sort должен остаться обычный compare.
>Как хоть не работает сейчас, какие симптомы?
для bsearch я все переписал вот так:
...
	//функция сравнения
static int compare2(const void* arg1, const void* arg2)
{
	return strlen(reinterpret_cast<const char *>(arg1)) < reinterpret_cast<const Object *>(arg2) -> getname().size();
}
...
//бинарный поиск
obj = reinterpret_cast<Object *>(bsearch(names[type], objects, size, sizeof(Object), &Object::compare2);

но все равно неправильно ищет функция сравненипя правильно написана?
ведь возвращается результат <

Правка: 6 фев. 2006 8:44

Проблемы с bsearch :(5 фев. 200623:08#14
arabesc
>Это потому, что было проигнорировано сообщение №3.
только что попробовал не помогает... и раньше его не игнорировал
Конишуа
fr
спасибо попробую... но всетаки а что с bsearch? :) никак? только STL ?
Проблемы с bsearch :(5 фев. 200622:03#10
ого-го раздули :)
IronPeter
std::sort неправильно отсортировал:
...
//функция сравнения
	static int compare2(const Object& arg1, const Object& arg2)
	{
		return strcmp(arg1.getname().c_str(), arg2.getname().c_str());
	}
...
sort(objects, objects + size, &Object::compare2);
...
или я неправильно делаю?
Aznog
>Не пользоваться ф-циями, которые не предназначены для работы с С++ классами (особенно, если имеются аналоги в STL).
>Соответственно, в пару к std::sort берем std::binary_search.
ты внимательно читал пост N1? я сказал что работает с числами когда они выступают в качестве ключа,
почему есть проблемы со строками? ведь qsort вполне правильно отсортировал.
std::binary_search не подходит т.к. она ищет объект в массиве где объект может быть простым типом.
более того  binary_search возвращает bool, просто говорит о том есть ли там этот элемент. А мне нужен указатель на объект.
arabesc
если я поставлю вмечто std::string char* то результат будет таким-же:
#include <string>
using namespace std;

class Object {
private:
	//имя объекта
	char* name;
public:
	//функция сравнения
	static int compare(const void* arg1, const void* arg2)
	{
		return strcmp(reinterpret_cast<const Object *>(arg1) -> getname(), reinterpret_cast<const Object *>(arg2) -> getname());
	}
	const char* getname() const
	{
		return name;
	}
	void setname(const string& Name)
	{
		name = new char[Name.size() + 1];
		strcpy(name, Name.c_str());
	}
	Object() : name(NULL){};
	Object(const string& Name)
	{
		name = new char[Name.size() + 1];
		strcpy(name, Name.c_str());
	};
	~Object()
	{
		delete [] name;
	};
};

int main(int argc, char* argv[])
{
	enum {size = 15};
	int val = 0;
	int type = 0;
	unsigned int i = 0;
	Object *objects = new Object[size];
	if (!objects) {
		exit(EXIT_FAILURE);
	}
	//имена объектов
	const char *names[] = {"iooi", "eier", "rtre", "qwv", "okk", "nmn", "tyj", "asaa", "qwwe", "zxa", "cbn", "mkjh", "avn", "bnf", "sbnm" };
	type = 100;
	//установка имени
	for(i = 0; i < size; i++)
		objects[i].setname(names[i]);
	fprintf(stderr, "%s", "Before sort:\n");
	for(i = 0; i < size; i++)
		fprintf(stderr, "%s%s", objects[i].getname(), "\n");
	//быстрая сортировка
	qsort(objects, size, sizeof(Object), &Object::compare);
	fprintf(stderr, "%s", "After sort:\n");
	for(i = 0; i < size; i++)
		fprintf(stderr, "%s%s", objects[i].getname(), "\n");
	Object *obj = NULL;
	//искать объект по индексу имен 5
	type = 5;
	fprintf(stderr, "%s%s%s", "Find value: ", names[type], "...\n");
	//бинарный поиск
	obj = reinterpret_cast<Object *>(bsearch(names[type], objects, size, sizeof(Object), reinterpret_cast<int (*) (const void *, const void *)>(&Object::compare)));
	if (obj)
		fprintf(stderr, "%s%s%s", "Finding value: ", obj -> getname(), "\n");
	else
		fprintf(stderr, "%s", "Not found\n");
	delete [] objects;
	getchar();
	return 0;
}
All
Дак все таки проблема не решаема :) ?
Проблемы с bsearch :(5 фев. 20060:05#4
IronPeter
спасибо попробую, тем более std::sort подставляет код функции сравнения при малых размерах кода, а qsort ее вызывает что
ударит по скорости при больших размерах массива.
>Правка - рефакторинг, Фаулер был бы доволен, да.
Извиняюсь за ламерство, кто такой Фаулер?
User007
не помогло
obj == NULL, т.е. объект не найден
All
еще есть варианты?
Спасибо заранее с Уважением Андрей.
Проблемы с bsearch :(4 фев. 200621:44#0
Привет всем!
Задача такая: нужно найти в массиве объектов какой-нибудь объект по его имени.
я создал массив объектов, отсортировал их в массиве.
но при поиске объекта в Visual С++ 6.0  программа падает, в Visual C++ .Net 2003 ошибка в 1 элемент.
разумеется привожу код:
#include <string>
using namespace std;

class Object {
private:
	//имя объекта
	string name;
public:
	//функция сравнения
	static int compare(const void* arg1, const void* arg2)
	{
		return strcmp(reinterpret_cast<const Object *>(arg1) -> getname().c_str(), reinterpret_cast<const Object *>(arg2) -> getname().c_str());
	}
	const string& getname() const
	{
		return name;
	}
	void setname(const string& Name)
	{
		name = Name;
	}
	Object(){};
	Object(const string& Name)
	{
		name = Name;
	};
	~Object()
	{

	};
};

int main(int argc, char* argv[])
{
	enum {size = 15};
	int val = 0;
	int type = 0;
	unsigned int i = 0;
	Object *objects = new Object[size];
	if (!objects) {
		exit(EXIT_FAILURE);
	}
	//имена объектов
	const char *names[] = {"iooi", "eier", "rtre", "qwv", "okk", "nmn", "tyj", "asaa", "qwwe", "zxa", "cbn", "mkjh", "avn", "bnf", "sbnm" };
	type = 100;
	//установка имени
	for(i = 0; i < size; i++)
		objects[i].setname(names[i]);
	fprintf(stderr, "%s", "Before sort:\n");
	for(i = 0; i < size; i++)
		fprintf(stderr, "%s%s", objects[i].getname().c_str(), "\n");
	//быстрая сортировка
	qsort(objects, size, sizeof(Object), &Object::compare);
	fprintf(stderr, "%s", "After sort:\n");
	for(i = 0; i < size; i++)
		fprintf(stderr, "%s%s", objects[i].getname().c_str(), "\n");
	Object *obj = NULL;
	//искать объект по индексу имен 5
	type = 5;
	fprintf(stderr, "%s%s%s", "Find value: ", names[type], "...\n");
	//бинарный поиск
	obj = reinterpret_cast<Object *>(bsearch(names[type], objects, size, sizeof(Object), &Object::compare));
	if (obj)
		fprintf(stderr, "%s%s", "Finding value: ", obj -> getname().c_str(), "\n");
	delete [] objects;
	getchar();
	return 0;
}
результаты для Visual C++ .Net 2003

Before sort:
iooi
eier
rtre
qwv
okk
nmn
tyj
asaa
qwwe
zxa
cbn
mkjh
avn
bnf
sbnm
After sort:
asaa
avn
bnf
cbn
eier
iooi
mkjh
nmn
okk
qwv
qwwe
rtre
sbnm
tyj
zxa
Find value: nmn...
Finding value: okk

Если у объекта будет клюяом являться не имя в виде строки, а число(тогда надо переписать функцию сравнения) то все работает
правильно.
что я делаю не так? std::map как альтернативу не предлагать.

Рендер в текстуру(OpenGL) в glut приложении работает, в своем Win32 нет2 фев. 200622:06#25
Ghost2
Спасибо я разобрался просто невнимательность :)
Тема закрыта...
Нормали в OGL при отрисовке моделей2 фев. 20061:41#4
loh_man
_restless_
>А ты освещение включил?
glEnable(GL_LIGHTING);
//можно 1 источник включить попробовать
glEnable(GL_LIGHT0);
Рендер в текстуру(OpenGL) в glut приложении работает, в своем Win32 нет1 фев. 200617:11#24
Ghost2
Спасибо!!!! теперь чайник появился!!! но пока без текстуры :(

Следующие темы >>

2001—2012 © GameDev.ru — Разработка игр