Страшный зверь сиплюсплюс
Модератор: Jolly Roger
- Харука-тян
- Мастер
- Сообщения: 544
- Зарегистрирован: 29 ноя 2006, 00:23
- Контактная информация:
Re: Страшный зверь сиплюсплюс
Как сделать деструктор для потомка, не вызывающий деструктор предка? И как сделать так, чтобы лог сохранялся в случае критической ошибки?
- Cfyz
- Сообщения: 776
- Зарегистрирован: 30 ноя 2006, 10:03
- Откуда: Санкт-Петербург
- Контактная информация:
Re: Страшный зверь сиплюсплюс
Сколько тут всего без меня происходит =)
Как это? Ты хочешь удалить объект напополам? А что с оставшимся предком делать?Харука-тян писал(а):Как сделать деструктор для потомка, не вызывающий деструктор предка?
Во-от, одна из вещей, о которые я споткнулся в текущем trunk. Так как всегда можно найти способ свалить программу до того, как она дойдет до LogDone, значит надо вытолкнуть сообщение на диск сразу же на месте. Я почему-то делал по-дурацки открыть-записать-закрыть лог-файл, но сейчас подумал, что fflush также должно привести к желаемому эффекту:Харука-тян писал(а):И как сделать так, чтобы лог сохранялся в случае критической ошибки?
Код: Выделить всё
int fflush ( FILE * stream );
If the given stream was open for writing and the last i/o operation was an output operation, any unwritten data in the output buffer is written to the file.
Пытается раскуклиться
- Jesus05
- Сообщения: 1840
- Зарегистрирован: 02 дек 2009, 07:50
- Откуда: Норильск, сейчас Санкт-петербург.
- Контактная информация:
Re: Страшный зверь сиплюсплюс
для критических ошибок можно использоватьХарука-тян писал(а):Как сделать деструктор для потомка, не вызывающий деструктор предка? И как сделать так, чтобы лог сохранялся в случае критической ошибки?
Код: Выделить всё
try
{
[тут код которые может вызвать критическую ошибку]
}
catch(...)
{
[тут что делаеть если ошибка приключилась (в твоем случае записать в лог где ошибка, сохранить лог и выйти наверное)]
}
а деструктор для предка придется делать так что-бы он не снес того что будет сносить потомок так-же для потомка нужно делать деструктор не сносящий то что уже и так сносит предок...
Re: Страшный зверь сиплюсплюс
Нельзя. Придумай как сделать так, что б это не нужно былоХарука-тян писал(а):Как сделать деструктор для потомка, не вызывающий деструктор предка?
Что есть "критическая ошибка"?Харука-тян писал(а):И как сделать так, чтобы лог сохранялся в случае критической ошибки?
Если это брошенное исключение - то try/catch.
Если это SIGSEGV или типа того...
По идее есть обработчики сигналов. Но они не портабельны.
И из обработчика сигнала по хорошему ничего делать нельзя,
разве что флажок какой взвести. Так как нормального портабельного
способа получить stack trace на С/С++ нет, то "где упало" ты
всё равно нормально не увидишь.
В общем-то fflush после каждой записи должен помочь
с точки зрения потери уже залоггированной информации.
Еще, если компиляться с debug info и проинсталлирвать
gdb как post mortem отладчик, то можно таки видеть где упало
Ну а под юниксами корку посмотреть...
- Харука-тян
- Мастер
- Сообщения: 544
- Зарегистрирован: 29 ноя 2006, 00:23
- Контактная информация:
Re: Страшный зверь сиплюсплюс
Несовсем поняла, что это, но по-моему, это то, что мне сейчас нужно больше всего. Можно немного пояснить?Xecutor писал(а):Еще, если компиляться с debug info и проинсталлирвать
gdb как post mortem отладчик, то можно таки видеть где упало
- Харука-тян
- Мастер
- Сообщения: 544
- Зарегистрирован: 29 ноя 2006, 00:23
- Контактная информация:
Re: Страшный зверь сиплюсплюс
С трудом поймала проблему - превышенное ограничение на длину ключа в базе данных. Скажите, try-catch работает само по себе или только через throw?
- Aerton
- Сообщения: 503
- Зарегистрирован: 11 авг 2007, 02:58
- Откуда: Новосибирск
- Контактная информация:
Re: Страшный зверь сиплюсплюс
Только через throw и только если не выключать исключения при сборке.Харука-тян писал(а):С трудом поймала проблему - превышенное ограничение на длину ключа в базе данных. Скажите, try-catch работает само по себе или только через throw?
Очень кратко: установить gdb, собирать свою программу с отладочной информацией и без оптимизации -O0 -ggdbХарука-тян писал(а):Несовсем поняла, что это, но по-моему, это то, что мне сейчас нужно больше всего. Можно немного пояснить?Xecutor писал(а):Еще, если компиляться с debug info и проинсталлирвать
gdb как post mortem отладчик, то можно таки видеть где упало
Запустить указав исполняемый файл игры gdb mygame
Ввести команду run (или просто r) - программа запустится и будет работать до падения
Ввести компнду bt (backtrace) - покажет что откуда вызвано (функции inline будут не видны)
Для распечатки переменной использовать p (print), чтобы подняться выше по стеку в вызвавшую функцию - up
Для изучения программы до момента падения, читать про команды breakpoint, continue, next и step.
P.S. Вместо fflush() каждый раз, можно при открытии сделать setbuf (myfile, NULL) - это отключит буфферизацию для данного файла.
- Харука-тян
- Мастер
- Сообщения: 544
- Зарегистрирован: 29 ноя 2006, 00:23
- Контактная информация:
Re: Страшный зверь сиплюсплюс
Как сделать число чётным (нечётным)? Пробую так:
но это не работает...
И еще, как оформляются интерфейсы?
upd:
заработало так:
Код: Выделить всё
uint8 a = rand()%256;
a&=254;
И еще, как оформляются интерфейсы?
upd:
заработало так:
Код: Выделить всё
uint8 a = rand()%256;
a=(a>>1)*2;
- Aerton
- Сообщения: 503
- Зарегистрирован: 11 авг 2007, 02:58
- Откуда: Новосибирск
- Контактная информация:
Re: Страшный зверь сиплюсплюс
Должно работать. Но можно проще:Харука-тян писал(а):Код: Выделить всё
uint8 a = rand()%256; a&=254;
Код: Выделить всё
uint8 a = 2 * (rand() % 128);
Что ты имеешь в виду?Харука-тян писал(а):И еще, как оформляются интерфейсы?
- Харука-тян
- Мастер
- Сообщения: 544
- Зарегистрирован: 29 ноя 2006, 00:23
- Контактная информация:
Re: Страшный зверь сиплюсплюс
Я про интерфейс-классы, объединённые общим методом, например - Draw(); В Паскале и Яве такое есть, а есть ли в сиплюсах?
- Aerton
- Сообщения: 503
- Зарегистрирован: 11 авг 2007, 02:58
- Откуда: Новосибирск
- Контактная информация:
Re: Страшный зверь сиплюсплюс
Прямо как в яве - нету. Только (множественное) наследование и абстрактные функции.Харука-тян писал(а):Я про интерфейс-классы, объединённые общим методом, например - Draw(); В Паскале и Яве такое есть, а есть ли в сиплюсах?
- Харука-тян
- Мастер
- Сообщения: 544
- Зарегистрирован: 29 ноя 2006, 00:23
- Контактная информация:
Re: Страшный зверь сиплюсплюс
а тип данных QWORD бывает? Он мне очень-очень нужен для эмуляции паскальных множеств!
- Aerton
- Сообщения: 503
- Зарегистрирован: 11 авг 2007, 02:58
- Откуда: Новосибирск
- Контактная информация:
Re: Страшный зверь сиплюсплюс
WORD - он разный бывает. Тебе сколько нужно, - 128 бит? Нет, такого нету, по крайней мере на обычных компьютерах. Можно написать класс, который будет внутри хранить массив байт сколь угодной длины и хранить в каждом по 8 бит.Харука-тян писал(а):а тип данных QWORD бывает? Он мне очень-очень нужен для эмуляции паскальных множеств!
Есть тип long long ing - обычно 64 бита, когда просто long int 32.
В стандарте C есть файл stdint.h, который определяет целую кучу типов, например uint64_t - беззнаковое 64-бит, int64_t - знаковое. Аналогично 8, 16 и 32. Эти типы предпочтительнее использовать, т.к. размеры int, short, long на разных системах бывают различными.
В стандарт C++ этот файл не входит, но обычно в компиляторах он всё равно присутствует.
Re: Страшный зверь сиплюсплюс
В stl есть классик bitset.Харука-тян писал(а):а тип данных QWORD бывает? Он мне очень-очень нужен для эмуляции паскальных множеств!
Юзать можно например как-то так:
Код: Выделить всё
#include <bitset>
#include <stdio.h>
enum MyFlags{
mfFlag,
mfAnotherFlag,
mfYetAnotherFlag,
mfOneMoreFlag,
mfMaxFlags
};
int main()
{
std::bitset<mfMaxFlags> bs;
bs[mfFlag]=true;
bs[mfOneMoreFlag]=true;
if(bs[mfYetAnotherFlag])
{
printf("YetAnotherFlag\n");
}
std::bitset<mfMaxFlags> bs2;
bs2.set(mfAnotherFlag).set(mfOneMoreFlag);
if((bs&bs2).any())
{
printf("intersection!\n");
}
}
- Jolly Roger
- Сообщения: 2973
- Зарегистрирован: 27 ноя 2009, 09:10
- Откуда: Minsk, Belarus
Re: Страшный зверь сиплюсплюс
Я просто оставлю это здесь:
Things You Should Never Do, Part I
by Joel Spolsky
http://www.joelonsoftware.com/articles/ ... 00069.html
и перевод:
http://perevodika.ru/articles/12166.html
Things You Should Never Do, Part I
by Joel Spolsky
http://www.joelonsoftware.com/articles/ ... 00069.html
и перевод:
http://perevodika.ru/articles/12166.html
Писать диздок спустя несколько лет разработки и множества изменений концепции - исконная русская девелоперская традиция.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 58 гостей