Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 [2] 3 4 5 ... 8   Вниз
  Печать  
Автор Тема: Эврика  (Прочитано 202678 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #30 : 13-10-2006 19:25 » 

Еше маленькая хитрость увиденная мною.
Есть расширяемый массив и две переменные size (количество используемых элементов массива), len (размер самого массива). Функция bool SetDoubleSize(void) увеличивает массив в двое. Если по каким либо причинам увеличение не удалось, функция возрашает false.
Код:
size++;
if ((size < len) || SetDoubleSize())
{
  // Тут наш код по заполнению полей массива
}
else size--;
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #31 : 13-10-2006 21:04 » 

Finch, я бы тут использовал не double, а step - лекго кучу памяти впустую занять.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #32 : 16-10-2006 05:50 » 

То решение, которое я видел
Код:
if (Func1(...) && Func2(.....) && Func3(....) && .......);


Единственный минус я вижу: довольно сложно отменить результаты предыдуших действий.

Классика жанра Улыбаюсь я всегда так делаю и не только с функциями, проверака валидности итераторов
например поиск вернул итератор и надо проверить, что он 1 валидный(не end) и элемент удовлетворяет доп условию
Код:
if(it == cont.end() || it->elem < 0) return;
Записан

Странно всё это....
Джон
просто
Администратор

de
Offline 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)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #34 : 16-10-2006 08:48 » 

Джон, а ты не запихивай больше 3-х Улыбаюсь
да и в студии видно какое не сработало или сработало при правильном подходе, даже при отладке в релизе.
Записан

Странно всё это....
Джон
просто
Администратор

de
Offline 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)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #36 : 16-10-2006 09:45 » 

Джон, while использую крайне редко, и в форме do{}while
Записан

Странно всё это....
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #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)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #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
Спокойный
Администратор

il
Offline 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
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #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 уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #41 : 19-06-2007 08:11 » 

Ochkarik, это же по стандарту
Записан

Странно всё это....
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #42 : 19-06-2007 08:14 » new

Ochkarik, будут по очереди, у оператора &&  ассоциативность - слева направо
Записан

Ochkarik
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #43 : 19-06-2007 08:16 » 

да ладно ладно))))) сам посмотрел)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #44 : 19-06-2007 08:21 » 

Ochkarik, Ага

А у меня обычно применение такой конструкции встречается, когда надо проверить валидность указателя перед тем, как его поюзать
Код:
if(p && p->CheckSmth())
{
  ...
}
« Последнее редактирование: 19-06-2007 08:25 от Алексей1153++ » Записан

Ochkarik
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #45 : 19-06-2007 08:27 » 

Алексей1153++,
тож варинат... но все равно... я не люблю. ибо когда спустя пару лет возвращаешься к коду - фиг вспомнишь что ты там с такими конструкциями делал)))
когда явно, построчно указано... как-то оно быстрее воспринимается)
« Последнее редактирование: 19-06-2007 08:30 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #46 : 19-06-2007 08:28 » 

Ochkarik, всё наглядно. Будет.

А наглядность определяется количеством этажей в строке )))

А почему не любишь то ?  Очень полезный, скажу я вам, оператор )
Записан

Ochkarik
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #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 уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #49 : 19-06-2007 09:07 » 

Код:
if(buf[i]==1)
   block[i] =(1.0-ep) / ep;
else
   block[i] =ep / (1.0-ep);
нагляднее. про второе - вообще молчу)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #50 : 19-06-2007 09:09 » 

Ochkarik,что там нагляднее то ? Улыбаюсь
 я без блоковых скобок никогда if не использую, а особенно если альтернатива else есть. Вообще, блок {} - это суперское изобретение )
А твой "голый" if-else ничем от оператора "?:" не отличается...
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #52 : 19-06-2007 11:21 » 

Алексей1153++, это не по стандарту. небось VC++ используешь
по стандарту
оператор -> должен работать так (*ps).
а *ps тебе должен дать ошибку доступа к памяти
Записан

Странно всё это....
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #53 : 19-06-2007 11:27 » 

LogRus, всё по стандарту ) Функция то существует, хоть объекта и нету. this == 0
Записан

Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #54 : 20-06-2007 05:29 » 

Алексей1153++, действительно по горячился.
Но похорошему, так делать нельзя
а вот если функция виртуальная, то точно разорвёт Улыбаюсь я проверял Улыбаюсь
Записан

Странно всё это....
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #55 : 20-06-2007 08:24 » 

LogRus, дык я и не делаю так ) Это была ошибка.  А еил нужно без объекта - всегда статическую можно приделать ведь

с виртуальной падает, я тож попробовал , там без объекта уже не найти функцию ))
Записан

Джон
просто
Администратор

de
Offline 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."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #57 : 20-06-2007 11:07 » 

Джон, как энто ничиво не делает )  Она проверяет несостоятельность своего объекта ))
(состояние нестояния) Отлично
Записан

Джон
просто
Администратор

de
Offline 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
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #59 : 20-06-2007 12:48 » 

зы А вобще-то байка старая. Говорят в коде программеров мелкософта видели такой код

if(this==NULL)
{

}
Кстати, вполне нормальная вешь. Я такое встречал даже в исходниках ядра Linux. Дело в том, что такой код очень повышает читабельность. А компиляторы на сегоднешний день до того умные, что они это выражение компилируют точно также как и без сравнения.
Записан
Страниц: 1 [2] 3 4 5 ... 8   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines