|
Гениальное открытие в синтаксисе языка Си, Не стесняемся в овациях :-) |
|
|
|
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, 09:44
|
Местный
  
Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699

|
Цитата(GetSmart @ Sep 28 2009, 11:58)  По поводу do {} while(0) в дефайнах. Кто-нить может объяснить чем это лучше простого {} ??? не ручаюсь за терминологию, но как-то так: do {...} while (0) - выглядит один оператор {...} - блок операторов #define FUN do{...} while(0) #define FUN2 {...} Код корректно: if (..) FUN (x); else FUN (2*x);
ошибка: if (..) FUN2 (x); else FUN2 (2*x); Цитата(GetSmart @ Sep 28 2009, 08:58)  Только в моей версии там не совсем параметр. И тем более не типизированный. Там может стоять любая строка сишного кода, в данном случае if (...) Хоть убейте, не могу придумать задачу, где в параметре данного дефайна необходимо поставить что-то окромя булевского выражения
|
|
|
|
|
Sep 28 2009, 09:54
|
Местный
  
Группа: Свой
Сообщений: 279
Регистрация: 2-07-08
Из: Новосибирск
Пользователь №: 38 699

|
Цитата(GetSmart @ Sep 28 2009, 12:51)  Фантазии нету?  Например выполнить какие-нить предворительные действия перед зависанием, которые в режиме Release не будут даже компилироваться, а в Debug будут стоять. Как частный случай этого - оператор if Мда? А можно пример?
|
|
|
|
|
Sep 28 2009, 10:01
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(Dima_G @ Sep 28 2009, 15:54)  Мда? А можно пример?  Код DebugLoop(ShowDebugInfo(); if (I2CMasterState != I2C_SUCCESS));  Маленький минус - при какой-либо команде (без завершающего оператора if) внутри скобок придётся ставить точку с запятой.
Сообщение отредактировал GetSmart - Sep 28 2009, 10:09
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Sep 28 2009, 11:10
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(GetSmart @ Sep 28 2009, 13:01)  Код DebugLoop(ShowDebugInfo(); if (I2CMasterState != I2C_SUCCESS)); Код assert(ShowDebugInfo(), I2CMasterState == I2C_SUCCESS);
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Sep 28 2009, 14:01
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(Сергей Борщ @ Sep 28 2009, 14:10)  Код assert(ShowDebugInfo(), I2CMasterState == I2C_SUCCESS); Ну, и кому такое надо? Процедура ShowDebugInfo() будет вызываться вне зависимости от выполнения условия I2CMasterState == I2C_SUCCESS. Если уж автору исходного топика так хочется что-то (вызов неких действий) добавлять к его исходному действию по условию, то это делается элементарно. Несколько поправил исходный код: Код #define DebugLoop(a) if(a) { DisableIRQ_FIQ(); while (1); } Если мы желаем при выполнении условия ещё и процедуру ShowDebugInfo() вызвать, то следует записать Код DebugLoop( (I2CMasterState != I2C_SUCCESS) ? (ShowDebugInfo(), TRUE) : FALSE ) где FALSE и TRUE соответственно ноль и не ноль. Вот Вам и - пожалуйста: перед заходом в бесконечный цикл получите отладочную информацию. Нечто подобное можно записать и в assert, однако аргумент его используется не только для проверки условия, но и для формирования строки вывода (не смертельно, конечно, но - некрасиво вывод будет смотреться). P.S. В assert , конечно, вызов дополнительной процедуры нужно перенести к FALSE.
|
|
|
|
|
Sep 28 2009, 17:33
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(Сергей Борщ @ Sep 28 2009, 21:37)  GetSmartу. Его макрос делал то же самое. А в остальном вы все правильно расписали. Ну не знал я про assert. Вот, изобрёл велосипед, а люди вокруг запинали творческую личность  Средневековье какое-то. Знаю, что есть недостаток моего дефайна в том, что он не "ATOMIC", то есть нельзя перед ним написать if (...), хотя условие должно быть внутри (так и было задумано), но иногда из-за этого можно ненароком встать на грабли, если например мой дефайн с процедурой внутри написать сразу после else. Пришлось бы писать примерно так: Код if (...) ++I2CMasterState; else { DebugLoop(ShowDebugInfo(); if (I2CMasterState != I2C_SUCCESS)); }
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
Сообщений в этой теме
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, 14:01) Код... Sep 28 2009, 10:04     Палыч Цитата(GetSmart @ Sep 28 2009, 13:01) Код... Sep 28 2009, 10:15      GetSmart Цитата(Сергей Борщ @ Sep 28 2009, 17:10) ... Sep 28 2009, 11:29       Сергей Борщ Цитата(GetSmart @ Sep 28 2009, 14:29) И т... Sep 28 2009, 11:53       ReAl Цитата(Палыч @ Sep 28 2009, 17:01) Ну, и ... Sep 28 2009, 15:35 _Pasha Цитата(GetSmart @ Sep 28 2009, 11:58) По ... Sep 28 2009, 14:29  ReAl Цитата(_Pasha @ Sep 28 2009, 17:29) Не-не... Sep 28 2009, 15:55   _Pasha Цитата(ReAl @ Sep 28 2009, 18:55) Дык вро... Sep 28 2009, 16:55 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
|
|
|