avreal писал(а):Код: Выделить всё
#define BREAKABLE_BLOCK \
for( uint8_t _breakable_block_ = 1; _breakable_block_ ; _breakable_block_ = 0)
Вот за это спасибо! Красиво и просто.
А то всё по старинке: do while 0...
avreal писал(а):Код: Выделить всё
#define BREAKABLE_BLOCK \
for( uint8_t _breakable_block_ = 1; _breakable_block_ ; _breakable_block_ = 0)
Выбросьте и забудьте.asteroid7 писал(а):Вот за это спасибо! Красиво и просто.
А то всё по старинке: do while 0...
Код: Выделить всё
//********************************************************************
int WriteLog(int wr)
{
char *evnt="Error Log";
char dt[10], tm[10];
_strdate(dt);
_strtime(tm);
if (log[0] != 'e'){return 0;}
if (wr == 1){evnt = "Access granted.";}
if (wr == 2){evnt = "Access denied! Invalid password.";}
if (wr == 3){evnt = "Packet error!";}
if (wr == 4){evnt = "COM Port Error!";}
if (wr == 5){sprintf(evnt, "Access denied to level %d !", level);}
if (wr == 6){sprintf(evnt, "Unknown level: %d", level);}
if (wr == 7){sprintf(evnt, "Access dened! User disabled!");}
if (wr < 1||wr > 7){sprintf(evnt, "Unknown LOG code!");}
sprintf(query, "INSERT INTO `%s`.`logs` SET `date`='%s', `time`='%s', `user`='%s', `event`='%s', `db`='%s', `table`='null'", dtbs, dt, tm, usr, evnt, dtbs);
if (mysql_query(&mysql, query))
{
SetConsoleTextAttribute(console, FOREGROUND_RED | FOREGROUND_INTENSITY);
display(" Ошибка запроса!");
fprintf(stderr, " Error: %s\n ", mysql_error(&mysql));
delete evnt;
return 1;
}
delete evnt;
return 0;
}
//*******************************************************************
int DBquery(const char *id)
{
MYSQL_ROW row;
unsigned int i=0;
//----------
sprintf(query, "SELECT * FROM users WHERE ID=%s", id);
//----------
if (mysql_query(&mysql, query))
{
SetConsoleTextAttribute(console, FOREGROUND_RED | FOREGROUND_INTENSITY);
display(" Ошибка запроса!");
fprintf(stderr, " Error: %s\n", mysql_error(&mysql));
return 1;
}
//----------
if (!(res = mysql_store_result(&mysql)))
{fprintf(stderr, " Error: %s\n", mysql_error(&mysql));return 1;}
//----------
while((row = mysql_fetch_row(res)))
{
for (i=0;i<mysql_num_fields(res);i++)
{
if (i==0){for (int a=0;a<20;a++){idd[a]=row[i][a];}}
else if (i==1){for (int a=0;a<20;a++){usr[a]=row[i][a];}}
else if (i==2){for (int a=0;a<20;a++){psw[a]=row[i][a];}}
else if (i==3){st = row[i][0];}
else if (i==4){l1 = row[i][0];}
else if (i==5){l2 = row[i][0];}
else if (i==6){l3 = row[i][0];}
else if (i==7){l4 = row[i][0];}
}
}
//----------
if (!mysql_eof(res)){fprintf(stderr," Error: %s\n", mysql_error(&mysql));return 1;}
//----------
mysql_free_result(res);
delete row;
//----------
return 0;
}
это не панацея, это протез на здоровую ногу. достаточно только вставить внутрь этого BREAKABLE_BLOCK оператор switch - и снова думай, как без goto выйти наружу... и ничем не лучше простого do { ... } while(0);Errorkpi писал(а):avreal писал(а):#define BREAKABLE_BLOCK \
Мда....
Господин знает толк в извращениях.....
особенно если вспомнить, что int по стандарту Си не является типом с фиксированным размером в битах, т.е. на персоналке он 32-битный и в него уже влезет 4 символа, а не два... и программа на Си (между прочим, языке, декларирующем платформонезависимость) уже не может компилироваться без правки на разных платформах...avreal писал(а):Вам это уже кажется простым, да ещё и красивым...
Тогда как на самом деле это «кошмар».
Равно как и двухсимвольные константы, сократившие раза в полтора код разбора команд в одном мониторе на одной в те времена распространённой 16-битной архитектуре... Я «специально спросил» неизвестного мне автора путём чтения исходников и выяснил, что у него в голове были вот такие заразные штучки...
Ну так внутри любого «и так нужного» for(;;) или do while() если switch поставить, то та же проблема будет.Мастер Ломастер писал(а):ничем не лучше простого do { ... } while(0);
Но не меньше 16 бит, так что два символа влезут всегда.Мастер Ломастер писал(а):особенно если вспомнить, что int по стандарту Си не является типом с фиксированным размером в битах, т.е. на персоналке он 32-битный и в него уже влезет 4 символа, а не два... и программа на Си (между прочим, языке, декларирующем платформонезависимость) уже не может компилироваться без правки на разных платформах...
Ну да, соглдасен, ножички и спички опасны для детей, огнестрельное оружие -- для большинства граждан. Нужен определённый уровень владения.Мастер Ломастер писал(а):имхо, трюки - это лишь трюки, которые позволяют одним заработать немножко денег, а другим - развлечься, но для подавляющего большинства вредны и даже опасны.
и к чему C++ приплетать в разговор?avreal писал(а):А по поводу того, что в таких местах такой for не лучше do-while -- cкажите тут
а че на него глядеть? используется фича, встроенная ТОЛЬКО в GCC, и потому непереносимая. равно как PORTB.0 в CodeVision. нет смысла продолжать возводить трюки в ранг сверхмастерства. сверхмастерство - это когда без трюков делается все, что необходимо.avreal писал(а):Заодно гляньте atomic.h из avr-libc от avr-gcc.
пример какой-то неубедительный... это ж каким "гуру" надо быть, чтобы в своей собственной программе не знать размер статического массива и определять его какими-то математическими вычислениями?!avreal писал(а):для кого-то определение числа элементов массива через sizeof(array)/sizeof(array[0]) было трюком. А для знающих язык это рутина.
А в С++ поведение for(;;) и do-while() чем-то отличается от такового в С?Мастер Ломастер писал(а):и к чему C++ приплетать в разговор?avreal писал(а):А по поводу того, что в таких местах такой for не лучше do-while -- cкажите тут
Вы не понимаете, о чём речь, или понимаете, но хочется поспорить?Мастер Ломастер писал(а):это ж каким "гуру" надо быть, чтобы в своей собственной программе не знать размер статического массива и определять его какими-то математическими вычислениями?!
Код: Выделить всё
command_t commands[] = {
{ , , , },
{ , , , },
{ , , , },
#ifdef SOME_CONDITION
{ , , , },
#endif
{ , , , },
#ifdef DEVICE_TYPE_2
{ , , , },
{ , , , },
{ , , , },
#endif
#ifndef NDEBUG
{ , , , },
{ , , , },
#endif
};avreal писал(а):Вы не понимаете, о чём речь, или понимаете, но хочется поспорить?
признаюсь, порой не понимаюavreal писал(а):Возможно, что гуру вашего уровня
Локальную переменную и в С можно сделать в любом блоке, в С++ отработают конструкторы-деструкторы:Мастер Ломастер писал(а):я не вникал глубоко в рекомендованную ссылку. но подозреваю, что основной смысл хитростей с С++ в том, что благодаря локальной переменной цикла for получается доступ к методам объекта какого-то класса... и эта переменная при досрочном выходе из цикла уничтожается с вызовом деструктора...
Код: Выделить всё
void foo()
{
some_type_t a;
{
some_type_t b; // ещё более локальная
}
// тут b уже пропала, в С++ ещё и отработал деструктор
}То, что Вам кажется, что можно сделать просто -- может означать то, что Вы просто не видите, в чём сложность. Ну как с размером статического массива...Мастер Ломастер писал(а):можно сделать просто
Да, да, я знаю, а еще зеркалки -- чистые понты для демонстрации наличия денег, в мобилке аппарат и побольше мегапикселей бывает.Мастер Ломастер писал(а):но делается с переподвыподвертом - подозреваю, чтобы потом иметь возможность всем объяснять, демонстрируя наличие тех самых знаний
avreal писал(а):Да, да, я знаю, а еще зеркалки -- чистые понты для демонстрации наличия денег, в мобилке аппарат и побольше мегапикселей бывает.
В "Жестоком романсе" сцена отличная с переклеиванием этикеток на бутылках с винами.
И у Райкина про соседа смогонщика -- «Ни разу не видел, чтобы он за водкой бегал! Значит сам гонит!»
Уж извините, но ассоциации с Вашими словами только такие.
Сведу в табличку то, как я понял этот текст. Сначала в нём упомянут уровень вледения зеркалкой и коробокй передач Васей и Петей, потом рядом упомянут я с С (по С++, кстати, я и не «понтуюсь» особо, это к neiver-у с недостижимым для меня уровнем виртуальных портов). Выходит следующее.Мастер Ломастер писал(а):а по поводу, в частности, зеркалок - так ведь это правда! чистая правда! 90% тех, кто покупает фотоаппарат, гонятся за совершенно непонятными им численными характеристиками, а потом делают 100% снимков в режиме полный автомат, многие даже зумом не пользуются! спросите любого владельца навороченной иномарки: не считая режима парковки и заднего хода, сколько раз он переключал режимы коробки-автомата? какие там вообще режимы есть? какими наворотами он пользуется вообще? думаю, ответ прогнозируем и неудивителен... понты, чистые понты... у васи понт зеркалка, у пети - кадиллак, у вас - Си с плюсами и без...это естественно и понятно.
Код: Выделить всё
Пользоваться Коробокй передач Языком программирования С
или фотоаппаратом
НЕ зная и
НЕ используя ПОНТЫ нормально, так и надо
возможностей
ЗНАЯ возможности
и используя нормально, так и надо ПОНТЫ
ПРИ НЕОБХОДИМОСТИНе понял, почему использование режима «автомат» на зеркалке есть признаком вообще чего-либо.Мастер Ломастер писал(а):а по поводу, в частности, зеркалок
...
а потом делают 100% снимков в режиме полный автомат
Мастер Ломастер писал(а):понты, чистые понты... у васи понт зеркалка, у пети - кадиллак, у вас - Си с плюсами и без...
Спасибо.Мастер Ломастер писал(а):понятие "понт" возникает ... а когда переход (приобретение) на нечто новое осуществляется без понятия для чего это нужно и нужно ли это вообще, а ради выяснения "тварь ли я дрожащая или право имею?"
конечно!avreal писал(а):А есть такие, котрые горят и пытаются зажечь других. Они — «понтуются» ?
Pika4u писал(а):Пишу программы для компьютера. На С++. Раньше ещё немного знал асм для АВР. И меня заинтересовало, есть ли в С++ метки и команды перехода по метке. Оказывается, есть. Эта команда называется goto. Но я прочитал про неё много нелестных отзывов в интернете. Ну не знаю, мне так легче меток понаставить, чем городить кучу циклов. Хотя на компиляцию программы с goto уходит дольше времени-секунд 7. Кто что думает?)