|
Гениальное открытие в синтаксисе языка Си, Не стесняемся в овациях :-) |
|
|
|
Sep 28 2009, 04:26
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Только что изобрёл, пытаясь сэкономить код  Проверил - работает в CW и в IAR. Код //#define _DEBUG_LOOP_ #ifdef _DEBUG_LOOP_ /* для установки отладочных ловушек объявить этот символ */ #define DebugLoop(a) a { DisableIRQ_FIQ(); while (1); } #else #define DebugLoop(a) {} #endif
int I2CEngine(uInt wrCnt, uInt rdCnt) { long time_out = 100000; // можно сделать зависимость от wrCnt и rdCnt
I2CWrLength = wrCnt; I2CRdLength = rdCnt; I2CRdIndex = 0; I2CWrIndex = 0; if (I2CStart() == 0) return I2C_ERROR;
while (--time_out >= 0) { if (I2CMasterState >= I2C_SUCCESS) // дальше I2C_SUCCESS все ошибки { DebugLoop(if (I2CMasterState != I2C_SUCCESS)); // <<<------------------------- обратите внимание на это return I2CMasterState; } } DebugLoop(); return I2C_TIMEOUT; } Если это кто-то уже изобрёл до меня - дайте плиз ссылку. Хотелось бы убедиться
Сообщение отредактировал GetSmart - Sep 28 2009, 04:27
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
 |
Ответов
|
Sep 28 2009, 15:55
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(_Pasha @ Sep 28 2009, 17:29)  Не-не. Лучше for(){} навернуть функционалом. Чтоб можно было не бояться встретить побочные эффекты от break или return при вызове какого-либо хитрого макроса. Дык вроде break одинаково отрабатывает что из того цикла, что из другого. Это по continue в for хвостовой оператор выполнится. do { } while(0) для другого сделан, чтобы макрос можно было ставить в любое место и привычно писать после него ';', тут уже писали Код // примитив, но для общности изложения #define foo() op1; op2;
if(a) foo(); // в тихую op2 выполняется всегда
if(a) foo(); else // syntax error op3; Код #define foo() { op1; op2; }
if(a) foo(); // "висящий" ';' , но это не страшно
if(a) foo(); else // syntax error op3; Код #define foo() for(int i = 0; i < 1; ++i) { op1; op2; }
if(a) foo(); // "висящий" ';' , но это не страшно
if(a) foo(); else // syntax error op3; Код #define foo() do { op1; op2; } while(0)
if(a) foo(); // OK
if(a) foo(); else // OK op3;
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Sep 28 2009, 16:55
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(ReAl @ Sep 28 2009, 18:55)  Дык вроде break одинаково отрабатывает что из того цикла, что из другого. Это по continue в for хвостовой оператор выполнится. Это я про ATOMIC_BLOCK() из winavr - там хвостовая часть с атрибутом cleanup и связана с объявленной локальной переменной, поэтому выполнится всегда, даже при break/return. А так, вообще - про ; подозревал  Ну, и использовать break/continue в других случаях - опять же, создавая макроопределениями единый смысловой контекст - тоже неплохо. Цитата(GetSmart @ Sep 28 2009, 12:51)  Например выполнить какие-нить предворительные действия перед зависанием, которые в режиме Release не будут даже компилироваться, а в Debug будут стоять. Как частный случай этого - оператор if Код #define DEBUGLEVEL 1
#define DEBUG_LOOP(level, assertion) do{if(( level <= DEBUGLEVEL) && (assertion)) for(;;);}while(0) Я правильно понял? level как константное выр-е, так и динамическим может быть. В последнем случае, конечно, надо позаботиться о значении DEBUGLEVEL, чтобы все отфильтровывалось.
|
|
|
|
Сообщений в этой теме
GetSmart Гениальное открытие в синтаксисе языка Си Sep 28 2009, 04:26 Dima_G #include <assert.h>
assert(...) Sep 28 2009, 04:42 GetSmart Называется открыл Америку
Ей богу не знал про as... Sep 28 2009, 04:58 MALLOY2 посмотрите стек LWIP там такое тоже применяется, т... Sep 28 2009, 07:46 _Pasha Цитата(MALLOY2 @ Sep 28 2009, 10:46) токо... Sep 28 2009, 08:22 ReAl Цитата(MALLOY2 @ Sep 28 2009, 10:46) токо... Sep 28 2009, 08:23 zltigo Цитата(GetSmart @ Sep 28 2009, 11:58) По ... Sep 28 2009, 09:03 Палыч Цитата(GetSmart @ Sep 28 2009, 11:58) По ... Sep 28 2009, 09:11 Dima_G Цитата(GetSmart @ Sep 28 2009, 11:58) По ... Sep 28 2009, 09:44  GetSmart Цитата(Dima_G @ Sep 28 2009, 15:44) Хоть ... Sep 28 2009, 09:51   Dima_G Цитата(GetSmart @ Sep 28 2009, 12:51) Фан... Sep 28 2009, 09:54    GetSmart Цитата(Dima_G @ Sep 28 2009, 15:54) Мда?
... Sep 28 2009, 10:01     Dima_G Цитата(GetSmart @ Sep 28 2009, 14:01) Код... Sep 28 2009, 10:04     Палыч Цитата(GetSmart @ Sep 28 2009, 13:01) Код... Sep 28 2009, 10:15     Сергей Борщ Цитата(GetSmart @ Sep 28 2009, 13:01) Код... Sep 28 2009, 11:10      GetSmart Цитата(Сергей Борщ @ Sep 28 2009, 17:10) ... Sep 28 2009, 11:29       Сергей Борщ Цитата(GetSmart @ Sep 28 2009, 14:29) И т... Sep 28 2009, 11:53      Палыч Цитата(Сергей Борщ @ Sep 28 2009, 14:10) ... Sep 28 2009, 14:01       ReAl Цитата(Палыч @ Sep 28 2009, 17:01) Ну, и ... Sep 28 2009, 15:35       Сергей Борщ Цитата(Палыч @ Sep 28 2009, 17:01) Ну, и ... Sep 28 2009, 15:37        GetSmart Цитата(Сергей Борщ @ Sep 28 2009, 21:37) ... Sep 28 2009, 17:33 GetSmart Странно. Я в файле assert.h нашёл слишком примитив... Sep 28 2009, 11:56 Сергей Борщ Цитата(GetSmart @ Sep 28 2009, 14:56) Не ... Sep 28 2009, 12:01 sysel Ерундой маетесь, товарищи.
Подобные навороты резко... Sep 29 2009, 04:39
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|