Сообщения на форуме пользователя Andrey (196 стр.)
Зацените бинарное дерево (С++). | 18 фев. 2006 | 14:03 | #19 |
---|
kronos_vano
Привет коллега!! Что в стуктуры данных подался?
особо не вникал но тебе уже многое сказали есть замечания:
вместо class в шаблоне лучше использовать typename
Привет коллега!! Что в стуктуры данных подался?
особо не вникал но тебе уже многое сказали есть замечания:
вместо 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 фев. 2006 | 13:32 | #0 |
---|
Привет всем!
В проекте игры иногда возникает системеное исключение с кодом 0xc0000005
т.е. Access Violation неправильная работа с памятью. Просто гдето идет обращение к нулевому или неинициализированному указателю.
Отловить адрес указателя из среды отладки очень трудно. Как это сделать имея следующий код:
как можно получить значение адреса при обращении к которому возникло исключение с кодом 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 и т.д. то тут понятно что там мусор и он не инициализирован корректно либо произашла порча памяти.
Спасибо всем заранее.
С Уважением Андрей.
В проекте игры иногда возникает системеное исключение с кодом 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); } |
Может есть какая-нибудь функция 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 фев. 2006 | 18:37 | #1 |
---|
Striker_Dev
Visual C++ Net 2002 или Visual C++ 6.0 я так понимаю? т.к. в Visual C++ .Net 2003 нет istream.h т.к. он устарел.
Visual C++ Net 2002 или Visual C++ 6.0 я так понимаю? т.к. в Visual C++ .Net 2003 нет istream.h т.к. он устарел.
Загрузка уровня | 12 фев. 2006 | 1:06 | #1 |
---|
Predat0R
объемный вопрос лучше всего сделать так кfк тебе удобно
подписываюсь.
объемный вопрос лучше всего сделать так кfк тебе удобно
подписываюсь.
Проблемы с bsearch :( | 7 фев. 2006 | 18:37 | #21 |
---|
all
Проблема была в функции сравнения...
Спасибо всем откликнувшися.
отделное спасибо User007, arabesc
Проблема была в функции сравнения...
Спасибо всем откликнувшися.
отделное спасибо User007, arabesc
Проблемы с bsearch :( | 6 фев. 2006 | 8:43 | #16 |
---|
Конишуа
fr
посмотрел std::lower_bound, std::equal_range
но все эти функции требуют чтобы в качестве ключа был объект но не ключ который внутри объекта.
equal_range возвращает пару pair<Object, Object> res;
вот этот код вообще не компилируется:
lower_boud не правильно находит:
Функция сравнения:
fr,
arabesc
>Ну так в последнем примере его нет. И compare1 это только для bsearch, для sort должен остаться обычный compare.
>Как хоть не работает сейчас, какие симптомы?
для bsearch я все переписал вот так: но все равно неправильно ищет функция сравненипя правильно написана?
ведь возвращается результат <
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);
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(); }
arabesc
>Ну так в последнем примере его нет. И compare1 это только для bsearch, для sort должен остаться обычный compare.
>Как хоть не работает сейчас, какие симптомы?
для bsearch я все переписал вот так: но все равно неправильно ищет функция сравненипя правильно написана?
ведь возвращается результат <
Правка: 6 фев. 2006 8:44
Проблемы с bsearch :( | 5 фев. 2006 | 23:08 | #14 |
---|
arabesc
>Это потому, что было проигнорировано сообщение №3.
только что попробовал не помогает... и раньше его не игнорировал
Конишуа
fr
спасибо попробую... но всетаки а что с bsearch? :) никак? только STL ?
>Это потому, что было проигнорировано сообщение №3.
только что попробовал не помогает... и раньше его не игнорировал
Конишуа
fr
спасибо попробую... но всетаки а что с bsearch? :) никак? только STL ?
Проблемы с bsearch :( | 5 фев. 2006 | 22:03 | #10 |
---|
ого-го раздули :)
IronPeter
std::sort неправильно отсортировал:
или я неправильно делаю?
Aznog
>Не пользоваться ф-циями, которые не предназначены для работы с С++ классами (особенно, если имеются аналоги в STL).
>Соответственно, в пару к std::sort берем std::binary_search.
ты внимательно читал пост N1? я сказал что работает с числами когда они выступают в качестве ключа,
почему есть проблемы со строками? ведь qsort вполне правильно отсортировал.
std::binary_search не подходит т.к. она ищет объект в массиве где объект может быть простым типом.
более того binary_search возвращает bool, просто говорит о том есть ли там этот элемент. А мне нужен указатель на объект.
arabesc
если я поставлю вмечто std::string char* то результат будет таким-же:
All
Дак все таки проблема не решаема :) ?
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; } |
Дак все таки проблема не решаема :) ?
Проблемы с bsearch :( | 5 фев. 2006 | 0:05 | #4 |
---|
IronPeter
спасибо попробую, тем более std::sort подставляет код функции сравнения при малых размерах кода, а qsort ее вызывает что
ударит по скорости при больших размерах массива.
>Правка - рефакторинг, Фаулер был бы доволен, да.
Извиняюсь за ламерство, кто такой Фаулер?
User007
не помогло
obj == NULL, т.е. объект не найден
All
еще есть варианты?
Спасибо заранее с Уважением Андрей.
спасибо попробую, тем более std::sort подставляет код функции сравнения при малых размерах кода, а qsort ее вызывает что
ударит по скорости при больших размерах массива.
>Правка - рефакторинг, Фаулер был бы доволен, да.
Извиняюсь за ламерство, кто такой Фаулер?
User007
не помогло
obj == NULL, т.е. объект не найден
All
еще есть варианты?
Спасибо заранее с Уважением Андрей.
Проблемы с bsearch :( | 4 фев. 2006 | 21:44 | #0 |
---|
Привет всем!
Задача такая: нужно найти в массиве объектов какой-нибудь объект по его имени.
я создал массив объектов, отсортировал их в массиве.
но при поиске объекта в Visual С++ 6.0 программа падает, в Visual C++ .Net 2003 ошибка в 1 элемент.
разумеется привожу код:
результаты для Visual C++ .Net 2003
Задача такая: нужно найти в массиве объектов какой-нибудь объект по его имени.
я создал массив объектов, отсортировал их в массиве.
но при поиске объекта в 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; } |
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 как альтернативу не предлагать.
Подскажите библиотеку для работы с геометрией | 4 фев. 2006 | 21:43 | #3 |
---|
Ezha
www.qhull.org пойдет?
www.qhull.org пойдет?
Рендер в текстуру(OpenGL) в glut приложении работает, в своем Win32 нет | 2 фев. 2006 | 22:06 | #25 |
---|
Ghost2
Спасибо я разобрался просто невнимательность :)
Тема закрыта...
Спасибо я разобрался просто невнимательность :)
Тема закрыта...
Нормали в OGL при отрисовке моделей | 2 фев. 2006 | 1:41 | #4 |
---|
loh_man
_restless_
>А ты освещение включил?
_restless_
>А ты освещение включил?
glEnable(GL_LIGHTING); //можно 1 источник включить попробовать glEnable(GL_LIGHT0);
Рендер в текстуру(OpenGL) в glut приложении работает, в своем Win32 нет | 1 фев. 2006 | 17:11 | #24 |
---|
Ghost2
Спасибо!!!! теперь чайник появился!!! но пока без текстуры :(
Спасибо!!!! теперь чайник появился!!! но пока без текстуры :(
Рендер в текстуру(OpenGL) в glut приложении работает, в своем Win32 нет | 31 янв. 2006 | 23:56 | #22 |
---|
Ghost2
еще есть идеи?
еще есть идеи?