Страшный зверь сиплюсплюс

Закрытые или заброшенные проекты, не состоявшие в Клубе, но имевшие ветку на форуме.

Модератор: Jolly Roger

Есть ли смысл в переходе на С++?

Нет, переписывай заново на fpc
7
25%
Да, причем пиши под *никсы
9
32%
Нет, переходи на VBS
0
Голосов нет
А почему не Ява?
12
43%
 
Всего голосов: 28

Аватара пользователя
Харука-тян
Мастер
Сообщения: 544
Зарегистрирован: 29 ноя 2006, 00:23
Контактная информация:

Re: Страшный зверь сиплюсплюс

Сообщение Харука-тян » 25 фев 2010, 09:45

Как сделать деструктор для потомка, не вызывающий деструктор предка? И как сделать так, чтобы лог сохранялся в случае критической ошибки?
"Женщина верит, что дважды два будет пять, если хорошенько поплакать и устроить скандал" (© Дж. Элиот).
ИзображениеИзображение

Аватара пользователя
Cfyz
Сообщения: 761
Зарегистрирован: 30 ноя 2006, 10:03
Откуда: Санкт-Петербург
Контактная информация:

Re: Страшный зверь сиплюсплюс

Сообщение Cfyz » 25 фев 2010, 10:26

Сколько тут всего без меня происходит =)
Харука-тян писал(а):Как сделать деструктор для потомка, не вызывающий деструктор предка?
Как это? Ты хочешь удалить объект напополам? А что с оставшимся предком делать?
Харука-тян писал(а):И как сделать так, чтобы лог сохранялся в случае критической ошибки?
Во-от, одна из вещей, о которые я споткнулся в текущем 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.
Cfyz теперь - наглая морда.

Аватара пользователя
Jesus05
Сообщения: 1792
Зарегистрирован: 02 дек 2009, 07:50
Откуда: Норильск, сейчас Санкт-петербург.
Контактная информация:

Re: Страшный зверь сиплюсплюс

Сообщение Jesus05 » 25 фев 2010, 10:32

Харука-тян писал(а):Как сделать деструктор для потомка, не вызывающий деструктор предка? И как сделать так, чтобы лог сохранялся в случае критической ошибки?
для критических ошибок можно использовать

Код: Выделить всё

try
{
[тут код которые может вызвать критическую ошибку]
}
catch(...)
{
[тут что делаеть если ошибка приключилась (в твоем случае записать в лог где ошибка, сохранить лог и выйти наверное)]
}
http://www.codenet.ru/progr/cpp/Try-Catch-Throw.php

а деструктор для предка придется делать так что-бы он не снес того что будет сносить потомок :) так-же для потомка нужно делать деструктор не сносящий то что уже и так сносит предок...

Аватара пользователя
Xecutor
Мастер
Сообщения: 725
Зарегистрирован: 25 мар 2008, 08:32

Re: Страшный зверь сиплюсплюс

Сообщение Xecutor » 25 фев 2010, 11:35

Харука-тян писал(а):Как сделать деструктор для потомка, не вызывающий деструктор предка?
Нельзя. Придумай как сделать так, что б это не нужно было :)
Харука-тян писал(а):И как сделать так, чтобы лог сохранялся в случае критической ошибки?
Что есть "критическая ошибка"?
Если это брошенное исключение - то try/catch.
Если это SIGSEGV или типа того...
По идее есть обработчики сигналов. Но они не портабельны.
И из обработчика сигнала по хорошему ничего делать нельзя,
разве что флажок какой взвести. Так как нормального портабельного
способа получить stack trace на С/С++ нет, то "где упало" ты
всё равно нормально не увидишь.
В общем-то fflush после каждой записи должен помочь
с точки зрения потери уже залоггированной информации.
Еще, если компиляться с debug info и проинсталлирвать
gdb как post mortem отладчик, то можно таки видеть где упало :)
Ну а под юниксами корку посмотреть...

Аватара пользователя
Харука-тян
Мастер
Сообщения: 544
Зарегистрирован: 29 ноя 2006, 00:23
Контактная информация:

Re: Страшный зверь сиплюсплюс

Сообщение Харука-тян » 25 фев 2010, 11:42

Xecutor писал(а):Еще, если компиляться с debug info и проинсталлирвать
gdb как post mortem отладчик, то можно таки видеть где упало :)
Несовсем поняла, что это, но по-моему, это то, что мне сейчас нужно больше всего. Можно немного пояснить?
"Женщина верит, что дважды два будет пять, если хорошенько поплакать и устроить скандал" (© Дж. Элиот).
ИзображениеИзображение

Аватара пользователя
Харука-тян
Мастер
Сообщения: 544
Зарегистрирован: 29 ноя 2006, 00:23
Контактная информация:

Re: Страшный зверь сиплюсплюс

Сообщение Харука-тян » 25 фев 2010, 11:59

С трудом поймала проблему - превышенное ограничение на длину ключа в базе данных. Скажите, try-catch работает само по себе или только через throw?
"Женщина верит, что дважды два будет пять, если хорошенько поплакать и устроить скандал" (© Дж. Элиот).
ИзображениеИзображение

Аватара пользователя
Aerton
Сообщения: 503
Зарегистрирован: 11 авг 2007, 02:58
Откуда: Новосибирск
Контактная информация:

Re: Страшный зверь сиплюсплюс

Сообщение Aerton » 25 фев 2010, 12:29

Харука-тян писал(а):С трудом поймала проблему - превышенное ограничение на длину ключа в базе данных. Скажите, try-catch работает само по себе или только через throw?
Только через throw и только если не выключать исключения при сборке.

Харука-тян писал(а):
Xecutor писал(а):Еще, если компиляться с debug info и проинсталлирвать
gdb как post mortem отладчик, то можно таки видеть где упало :)
Несовсем поняла, что это, но по-моему, это то, что мне сейчас нужно больше всего. Можно немного пояснить?
Очень кратко: установить gdb, собирать свою программу с отладочной информацией и без оптимизации -O0 -ggdb
Запустить указав исполняемый файл игры 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: Страшный зверь сиплюсплюс

Сообщение Харука-тян » 04 мар 2010, 11:39

Как сделать число чётным (нечётным)? Пробую так:

Код: Выделить всё

uint8 a = rand()%256;
a&=254;
но это не работает...
И еще, как оформляются интерфейсы?

upd:
заработало так:

Код: Выделить всё

uint8 a = rand()%256;
a=(a>>1)*2;
"Женщина верит, что дважды два будет пять, если хорошенько поплакать и устроить скандал" (© Дж. Элиот).
ИзображениеИзображение

Аватара пользователя
Aerton
Сообщения: 503
Зарегистрирован: 11 авг 2007, 02:58
Откуда: Новосибирск
Контактная информация:

Re: Страшный зверь сиплюсплюс

Сообщение Aerton » 04 мар 2010, 12:02

Харука-тян писал(а):

Код: Выделить всё

uint8 a = rand()%256;
a&=254;
Должно работать. Но можно проще:

Код: Выделить всё

uint8 a = 2 * (rand() % 128);
Харука-тян писал(а):И еще, как оформляются интерфейсы?
Что ты имеешь в виду?

Аватара пользователя
Харука-тян
Мастер
Сообщения: 544
Зарегистрирован: 29 ноя 2006, 00:23
Контактная информация:

Re: Страшный зверь сиплюсплюс

Сообщение Харука-тян » 04 мар 2010, 12:27

Я про интерфейс-классы, объединённые общим методом, например - Draw(); В Паскале и Яве такое есть, а есть ли в сиплюсах?
"Женщина верит, что дважды два будет пять, если хорошенько поплакать и устроить скандал" (© Дж. Элиот).
ИзображениеИзображение

Аватара пользователя
Aerton
Сообщения: 503
Зарегистрирован: 11 авг 2007, 02:58
Откуда: Новосибирск
Контактная информация:

Re: Страшный зверь сиплюсплюс

Сообщение Aerton » 04 мар 2010, 12:39

Харука-тян писал(а):Я про интерфейс-классы, объединённые общим методом, например - Draw(); В Паскале и Яве такое есть, а есть ли в сиплюсах?
Прямо как в яве - нету. Только (множественное) наследование и абстрактные функции.

Аватара пользователя
Харука-тян
Мастер
Сообщения: 544
Зарегистрирован: 29 ноя 2006, 00:23
Контактная информация:

Re: Страшный зверь сиплюсплюс

Сообщение Харука-тян » 04 мар 2010, 14:04

а тип данных QWORD бывает? Он мне очень-очень нужен для эмуляции паскальных множеств!
"Женщина верит, что дважды два будет пять, если хорошенько поплакать и устроить скандал" (© Дж. Элиот).
ИзображениеИзображение

Аватара пользователя
Aerton
Сообщения: 503
Зарегистрирован: 11 авг 2007, 02:58
Откуда: Новосибирск
Контактная информация:

Re: Страшный зверь сиплюсплюс

Сообщение Aerton » 04 мар 2010, 14:29

Харука-тян писал(а):а тип данных QWORD бывает? Он мне очень-очень нужен для эмуляции паскальных множеств!
WORD - он разный бывает. Тебе сколько нужно, - 128 бит? Нет, такого нету, по крайней мере на обычных компьютерах. Можно написать класс, который будет внутри хранить массив байт сколь угодной длины и хранить в каждом по 8 бит.

Есть тип long long ing - обычно 64 бита, когда просто long int 32.

В стандарте C есть файл stdint.h, который определяет целую кучу типов, например uint64_t - беззнаковое 64-бит, int64_t - знаковое. Аналогично 8, 16 и 32. Эти типы предпочтительнее использовать, т.к. размеры int, short, long на разных системах бывают различными.

В стандарт C++ этот файл не входит, но обычно в компиляторах он всё равно присутствует.

Аватара пользователя
Xecutor
Мастер
Сообщения: 725
Зарегистрирован: 25 мар 2008, 08:32

Re: Страшный зверь сиплюсплюс

Сообщение Xecutor » 05 мар 2010, 14:46

Харука-тян писал(а):а тип данных QWORD бывает? Он мне очень-очень нужен для эмуляции паскальных множеств!
В stl есть классик bitset.
Юзать можно например как-то так:

Код: Выделить всё

#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: Страшный зверь сиплюсплюс

Сообщение Jolly Roger » 31 мар 2010, 11:52

Я просто оставлю это здесь:
Things You Should Never Do, Part I
by Joel Spolsky

http://www.joelonsoftware.com/articles/ ... 00069.html

и перевод:
http://perevodika.ru/articles/12166.html
Писать диздок спустя несколько лет разработки и множества изменений концепции - исконная русская девелоперская традиция.

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя