Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #30 : 13-10-2006 19:25 » |
|
Еше маленькая хитрость увиденная мною. Есть расширяемый массив и две переменные size (количество используемых элементов массива), len (размер самого массива). Функция bool SetDoubleSize(void) увеличивает массив в двое. Если по каким либо причинам увеличение не удалось, функция возрашает false. size++; if ((size < len) || SetDoubleSize()) { // Тут наш код по заполнению полей массива } else size--;
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #31 : 13-10-2006 21:04 » |
|
Finch, я бы тут использовал не double, а step - лекго кучу памяти впустую занять.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Антон (LogRus)
|
|
« Ответ #32 : 16-10-2006 05:50 » |
|
То решение, которое я видел if (Func1(...) && Func2(.....) && Func3(....) && .......);
Единственный минус я вижу: довольно сложно отменить результаты предыдуших действий. Классика жанра я всегда так делаю и не только с функциями, проверака валидности итераторов например поиск вернул итератор и надо проверить, что он 1 валидный(не end) и элемент удовлетворяет доп условию if(it == cont.end() || it->elem < 0) return;
|
|
|
Записан
|
Странно всё это....
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #33 : 16-10-2006 08:12 » |
|
Я раньше тоже любил наворачивать кучу условий. Удовольствие кончается, когда надо пройтись дебаггером. Смотришь на этот if думаешь, какое из десяти условий не ложь? Так что палка о двух концах.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Антон (LogRus)
|
|
« Ответ #34 : 16-10-2006 08:48 » |
|
Джон, а ты не запихивай больше 3-х да и в студии видно какое не сработало или сработало при правильном подходе, даже при отладке в релизе.
|
|
|
Записан
|
Странно всё это....
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #35 : 16-10-2006 09:20 » |
|
Оно конечно, три меньше чем десять... А ещё я страдал "болезнью левизны в С++" (как я это называю, из-за порядка проверки условий) в циклах while. Те любил, чтобы цикл выглядел типа while(f1() && f2 && f3() ... ); Тоже прикольная вещица, пока дело не дойдёт до отладки.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Антон (LogRus)
|
|
« Ответ #36 : 16-10-2006 09:45 » |
|
Джон, while использую крайне редко, и в форме do{}while
|
|
|
Записан
|
Странно всё это....
|
|
|
Антон (LogRus)
|
|
« Ответ #37 : 23-10-2006 07:46 » |
|
Вспомнилось. Идиома RAII. Практически реализация расширения finally. суть например нам надо гарантированно(в зависимости от того были исключения или нет), закрыть файл после открытия. делаем класс который в деструкторе закрывает файл. struct raii_closefile { file& f; raii_closefile(file& ff):f(ff){} ~raii_closefile(){ close(f); } } file f; open(f); raii_closefile(f);
сдесь делам всякие глупости файл буде гарантированно закрыт при выходе из области видимости.
|
|
|
Записан
|
Странно всё это....
|
|
|
Антон (LogRus)
|
|
« Ответ #38 : 24-10-2006 07:56 » |
|
Условаия: 1. несколько потоков производят поиск и вставку в древовидный контейнер 2. один поток периодически отризает лишние ветви дерева Есть задача: 1. организовать доступ таким образом, что бы все потоки поиска могли одновременно производить поиск и вставку 2. обеспечить блокировку всех потоков поиска перед удалением ветки, т.е. дождаться пока все потоки поиска завершат поиск, если придут новые потоки повесить их на мьютексе 3. разблокировать потоки поиска после удаления ветки вот код(вместе с небольшим тестом и и отладочными сообщениями) который я использую для этих целей #include "stdafx.h" #include <iostream> #include <boost/thread/mutex.hpp> #include <boost/thread/condition.hpp> #include <boost/thread/thread.hpp> #include <boost/bind.hpp>
using namespace std;
class semaphore: boost::noncopyable { boost::mutex mutex_; boost::condition cond_; volatile int refs_; volatile bool fullLock_; public: typedef bool cv_state; public: semaphore():refs_(0), fullLock_(false){} bool is_fulllock() { return fullLock_; }
bool is_locked() { return refs_ > 0; }
bool is_unlocked() { return 0==refs_; }
void do_lock() { boost::mutex::scoped_lock l(mutex_); if (fullLock_) cond_.wait(l); ++refs_; cout << "semaphore::do_lock refs = " << refs_ << "\n"; }
void do_unlock() { boost::mutex::scoped_lock l(mutex_); --refs_; cond_.notify_all(); cout << "semaphore::do_unlock refs = " << refs_ << "\n"; }
void do_fulllock() { boost::mutex::scoped_lock l(mutex_); cout << "semaphore::do_fulllock in refs = " << refs_ << "\n"; fullLock_ = true; cond_.wait(l, boost::bind(&semaphore::is_unlocked,this)); cout << "semaphore::do_fulllock done refs = " << refs_ << "\n"; }
void do_fullunlock() { boost::mutex::scoped_lock l(mutex_); fullLock_ = false; cond_.notify_all(); cout << "semaphore::do_unfulllock refs = " << refs_ << "\n"; } };
void other(semaphore& s, long i) { boost::detail::thread::scoped_lock<semaphore> l(s); Sleep((i+1)*1000); }
void waiter(semaphore& s) { long b = GetTickCount(); s.do_fulllock(); long e = GetTickCount(); cout << "Waited " << e-b << "\n"; s.do_fullunlock(); }
int _tmain(int argc, _TCHAR* argv[]) { semaphore s; boost::thread_group ts; for (int i = 0; i< 5 ; ++i) ts.create_thread(boost::bind(&other, boost::ref(s),i)); ts.create_thread(boost::bind(&waiter, boost::ref(s))); Sleep(6000); s.do_fulllock(); for (int i = 0; i< 5 ; ++i) ts.create_thread(boost::bind(&other, boost::ref(s),0)); cout << "Wait 1 sec.\n"; Sleep(1000); s.do_fullunlock(); ts.join_all(); }
|
|
|
Записан
|
Странно всё это....
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #39 : 18-11-2006 12:28 » |
|
Столкнулся недавно с забавным багом в QT3. Может быть в QT4 уже исправили. Я не проверял. Класс QListBox. Если у него в списке есть только 1 элемент и попытаться его удалить с помошью члена класса removeItem. Программа вылетает с ошибкой зашиты фрагментации. Пришлось ставить ловушку: if ((ListOfWindow->count() == 1) && (Index == 0)) ListOfWindow->clear(); else ListOfWindow->removeItem(Index);
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Ochkarik
|
|
« Ответ #40 : 19-06-2007 08:08 » |
|
Finch, по поводу множества вызовов. подглядел это в драйверах. обычто так и делаю: do{ if (func_1(...)) break; if (func_2(...)) break; ... }while(0);
а насчет if (Func1(...) && Func2(.....) && Func3(....) && .......);
- для меня почему то не очевидно то что функции будут вызываються по очереди а не вперемешку)) хотя пардон... опреация && по стандарту проводится слева на право)
|
|
« Последнее редактирование: 19-06-2007 08:11 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Антон (LogRus)
|
|
« Ответ #41 : 19-06-2007 08:11 » |
|
Ochkarik, это же по стандарту
|
|
|
Записан
|
Странно всё это....
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #42 : 19-06-2007 08:14 » |
|
Ochkarik, будут по очереди, у оператора && ассоциативность - слева направо
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #43 : 19-06-2007 08:16 » |
|
да ладно ладно))))) сам посмотрел)
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #44 : 19-06-2007 08:21 » |
|
Ochkarik, А у меня обычно применение такой конструкции встречается, когда надо проверить валидность указателя перед тем, как его поюзать if(p && p->CheckSmth()) { ... }
|
|
« Последнее редактирование: 19-06-2007 08:25 от Алексей1153++ »
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #45 : 19-06-2007 08:27 » |
|
Алексей1153++, тож варинат... но все равно... я не люблю. ибо когда спустя пару лет возвращаешься к коду - фиг вспомнишь что ты там с такими конструкциями делал))) когда явно, построчно указано... как-то оно быстрее воспринимается)
|
|
« Последнее редактирование: 19-06-2007 08:30 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #46 : 19-06-2007 08:28 » |
|
Ochkarik, всё наглядно. Будет.
А наглядность определяется количеством этажей в строке )))
А почему не любишь то ? Очень полезный, скажу я вам, оператор )
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #47 : 19-06-2007 08:34 » |
|
Алексей1153++, я по чужому коду сужу) приходится порой разбираться... и вот когда вместо того чтобы все глазом окинуть и ясно предствить общую логику, приходится в каждую строчку всматриваться.... есть там знак вопроса или нет... короче получается эта самая, овальная, с чертой посередине) типа block[i] = buf[i]==1 ? (1.0-ep) / ep : ep / (1.0-ep);
вот еще примерчик из той же оперы... inline Type Func( const Type& data ) { tmp[3] = (Type)((tmp[2] = (Type)((tmp[1] = (Type)((tmp[0] = data) * b + tmp[1] * a)) * b + tmp[2] * a)) * b + tmp[3] * a); return tmp[N]; }
и попробуй возрази)) нет, развернуть конечно можно. но при первом ознакомлении хочется матерится. что характерно автор произведения считает что это удобная и компактная запись.
|
|
« Последнее редактирование: 19-06-2007 08:50 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #48 : 19-06-2007 08:39 » |
|
Ochkarik, а ты возьми и переформатируй (только осторожно, не внося лишних символов) кстати, когда не помню приоритеты операторов, заключаю в скобки block[i] = (buf[i]==1 ? (1.0-ep) / ep : ep / (1.0-ep));
переформатируем - block[i] = ( (buf[i]==1) ? ((1.0-ep) / ep) : (ep / (1.0-ep)) );
или if(buf[i]==1) { block[i] =(1.0-ep) / ep; } else { block[i] =ep / (1.0-ep); }
а ещё бы проверить на возможное переполнение при делении , когда ep или (1.0-ep) близкО к нулю (в зависимости от того, что в знаменателе)
|
|
« Последнее редактирование: 19-06-2007 08:43 от Алексей1153++ »
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #49 : 19-06-2007 09:07 » |
|
if(buf[i]==1) block[i] =(1.0-ep) / ep; else block[i] =ep / (1.0-ep);
нагляднее. про второе - вообще молчу)
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #50 : 19-06-2007 09:09 » |
|
Ochkarik,что там нагляднее то ? я без блоковых скобок никогда if не использую, а особенно если альтернатива else есть. Вообще, блок {} - это суперское изобретение ) А твой "голый" if-else ничем от оператора "?:" не отличается...
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #51 : 19-06-2007 10:48 » |
|
почти фокус ) Совершенно случайно получилось, нарочно не придумаешь struct S { int n1;
void F() { if(!this)return; n1=1; } };
//программа не глюкает S* ps=0; ps->F();
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #52 : 19-06-2007 11:21 » |
|
Алексей1153++, это не по стандарту. небось VC++ используешь по стандарту оператор -> должен работать так (*ps). а *ps тебе должен дать ошибку доступа к памяти
|
|
|
Записан
|
Странно всё это....
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #53 : 19-06-2007 11:27 » |
|
LogRus, всё по стандарту ) Функция то существует, хоть объекта и нету. this == 0
|
|
|
Записан
|
|
|
|
Антон (LogRus)
|
|
« Ответ #54 : 20-06-2007 05:29 » |
|
Алексей1153++, действительно по горячился. Но похорошему, так делать нельзя а вот если функция виртуальная, то точно разорвёт я проверял
|
|
|
Записан
|
Странно всё это....
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #55 : 20-06-2007 08:24 » |
|
LogRus, дык я и не делаю так ) Это была ошибка. А еил нужно без объекта - всегда статическую можно приделать ведь
с виртуальной падает, я тож попробовал , там без объекта уже не найти функцию ))
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #56 : 20-06-2007 09:35 » |
|
"Ну вы блин даёте!" (с) программа не глюкает Дык, так она ничего и не делает! ) Вот кабы она делала и не глюкала.
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #57 : 20-06-2007 11:07 » |
|
Джон, как энто ничиво не делает ) Она проверяет несостоятельность своего объекта )) (состояние нестояния)
|
|
|
Записан
|
|
|
|
Джон
просто
Администратор
Offline
Пол:
|
|
« Ответ #58 : 20-06-2007 11:42 » |
|
"Функция несуществующего объекта, проверяет существование несуществующего объекта". ) зы А вобще-то байка старая. Говорят в коде программеров мелкософта видели такой код if(this==NULL) { }
|
|
|
Записан
|
Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома. "Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash "Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman "All science is either physics or stamp collecting." Ernest Rutherford "Wer will, findet Wege, wer nicht will, findet Gründe."
|
|
|
Serg79
|
|
« Ответ #59 : 20-06-2007 12:48 » |
|
зы А вобще-то байка старая. Говорят в коде программеров мелкософта видели такой код
if(this==NULL) {
}
Кстати, вполне нормальная вешь. Я такое встречал даже в исходниках ядра Linux. Дело в том, что такой код очень повышает читабельность. А компиляторы на сегоднешний день до того умные, что они это выражение компилируют точно также как и без сравнения.
|
|
|
Записан
|
|
|
|
|