реклама на сайте
подробности

 
 
> Стиль программирования на Си, описание функции
sKWO
сообщение Mar 31 2008, 10:23
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530



Добрый день!
Столкнулся со следующей проблемой.
нашол код как сделать восемь таймеров написанный Alechin Jan.
Первое что кидается в глаза та это синтаксис мне непонятный.
Вот к примеру прототип функции остановки тай мера:
Код
void Stop_Timer(IN IDX timer);

ну и сама функция:
Код
/*--------------------------------------------------------------------------------------------*/
/* Процедура остановки таймера.                                                               */
/* Принимает:   номер таймера (0 - 7).                                                        */
/* Возвращает:  ничего не возвращает.                                                         */
/*--------------------------------------------------------------------------------------------*/
__monitor void Stop_Timer(IN IDX timer)
{
  Timer[timer].Timer_Ena = TIMER_DIS;
  return;
}

Непонятно что такое IDX? Ну IN понятно, направление, очень удобно.
IDX по ходу здесь беззнаковый чар.
Ну и соответственно вопрос:
Этот синтаксис возможен через какоето макроопределение?
Может кто знает, подскажите, уверен это интерессно не только мне.
Вот ещё пример
Код
void Start_Timer(IN IDX timer, IN WORD interval, IN pTIMER_FUNC pFunc = NULL, IN bool cycle = TIMER_ONCE);

Спасибо.


--------------------
нельзя недооценивать предсказуемость глупости
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Lem
сообщение Mar 31 2008, 20:08
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 20-03-05
Пользователь №: 3 533



препроцессором не рекомендуется пользоваться именно из-за проблем с поиском ошибок (в основном), так как во что разворачивается макроопределение выяснить практически нереально (достоверно), отлаживаться и искать ошибки крайне неудобно. Поэтому были введены в язык средства, позволяющие практически полностью исключить использование препроцессора.
Список случаев, когда препроцессор оправдан уже был озвучен.

Правда, я лично использую его неправильно, надо отучаться...
Для маленьких проектов, например, для микроконтроллеров типа АВР, разницы никакой, но привычка переносится и на большие, а там проявляются все эти кажущиеся надуманными проблемы.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Apr 1 2008, 12:40
Сообщение #3


Нечётный пользователь.
******

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



Цитата(Lem @ Mar 31 2008, 22:08) *
как во что разворачивается макроопределение выяснить практически нереально (достоверно)

Как правило препроцессор идёт отдельным исполняемым файлом и/или у компилятора есть соответствующий ключик "выполнить только препроцессор".
И можно получить выход препроцессора и всё поразглядывать.



Да, очень много чего можно затолкать в enum-ы, inline-функции и т.п.
Да, в С++ есть ссылки, позволяющие уменьшить использование указателей и связанных с неправильным их применением ошибок (ударение на слове "неправильным", а не на слове "применением"). И т.д. и т.п.
Но, извините,
#define TRUE FALSE
и
#define SQR(x) x * x
это примеры вредительского и безграмотного применения макросов, а не их генетической ущербности.
Но на их базе строится рекомендация "использование макросов следует уменьшать в идеале до нуля", что, на мой взгляд, неправильно, как неправильны и рекомендации не использовать указатели (а почему тогда в стандарте оставили не только условную компиляцию, но и функциональные макросы, склейку и подстановку аргументов и оставили указатели?)

Так же как и с goto, который я использую редко и на форумах иногда сам привожу примеры, как можно обойтись без goto и при этом и сгенерированный код не растёт, и читаемость улучшается, но который я инода таки использую - так же и с макросами:
Используйте, не бездумно, голова дана именно для выбора нужного средства языка!
(Кстати, а какое средство языка можно использовать бездумно? Знаменитые примеры "индусского" кода написаны и без макросов, и без gotoи часто вообще на яве, изначально "лишённой недостатков С/С++")
Правильно и в нужном месте применённые макросы, на мой взгляд, только улучшают (не слишком хорошо формализуемый и очень вкусовой параметр) читаемость кода. Кончено, для людей, умеющих с ними обращаться (та же проблема с указателями).
Огрызок .h
Код
typedef WINAPI void (*DlPortWritePortUchar_t) (unsigned port, uint8_t d);
typedef WINAPI uint8_t (*DlPortReadPortUchar_t) (unsigned port);
typedef WINAPI void (*DlPortWritePortBufferUchar_t) (unsigned port, const uint8_t *pd, int len);

class lpt_dlportio_t : public lpt_io_t
{
public:
    lpt_dlportio_t(unsigned _base);
    ~lpt_dlportio_t();

    virtual uint8_t read(rd_offset offs);
    virtual void write(wr_offset offs, uint8_t d);
    virtual void write_data(const uint8_t *pd, int len);

private:
    HINSTANCE hdlportio;
#define _DL_PTR(_f_) _f_##_t _f_##_P
    _DL_PTR(DlPortWritePortUchar);
    _DL_PTR(DlPortReadPortUchar);
    _DL_PTR(DlPortWritePortBufferUchar);
#undef  _DL_PTR
}; // class lpt_dlportio_t


Огрызок .cpp
Код
lpt_dlportio_t::lpt_dlportio_t(unsigned _base)
    : lpt_io_t(_base), hdlportio(NULL)
{
    hdlportio = LoadLibrary("DLportIO.dll");
    if (hdlportio == NULL)
        throw error_win32_t(E_INVHARD, "Can't load port access library `DLportIO.dll'");

#define _DL_LOAD(_f_)\
        do {\
            _f_##_P = (_f_##_t)GetProcAddress(hdlportio, #_f_);\
            if(_f_##_P == NULL)\
                throw error_win32_t(E_INVHARD, "Can't load port access library `DLportIO.dll'"); \
        } while(0)

    _DL_LOAD(DlPortWritePortUchar);
    _DL_LOAD(DlPortReadPortUchar);
    _DL_LOAD(DlPortWritePortBufferUchar);
#undef _DL_LOAD

} // lpt_dlportio_t::lpt_dlportio_t


И не говорите мне, что этот текст надо переписать без макросов для облегчения чтения и сопровождения (представим себе, что понадобилось добавить ещё одну функцию из dlportio.dll и/или изменить обработку ошибки - в каком случае надо больше до-/пере-писывать руками и где при этом больше шансов ошибиться в одной из ветвей - в варианте с макросами или с прямым текстом?

И ещё пример на эту тему

http://www.telesys.ru/wwwboards/mcontrol/1...es/314290.shtml


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
dxp
сообщение Apr 1 2008, 13:50
Сообщение #4


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(ReAl @ Apr 1 2008, 19:40) *
Как правило препроцессор идёт отдельным исполняемым файлом и/или у компилятора есть соответствующий ключик "выполнить только препроцессор".

Это где такое правило? В GCC? Рад за него. В IAR с некоторых пор появился ключик. А вот в используемом мной сейчас VDSP такого удовольствия нет (не нашел). Т.ч. тут как повезет.

Цитата(ReAl @ Apr 1 2008, 19:40) *
Да, очень много чего можно затолкать в enum-ы, inline-функции и т.п.

Именно! smile.gif И все, что можно туда затолкать, не надо пихать в макросы. Об этом и спич.

Цитата(ReAl @ Apr 1 2008, 19:40) *
Но, извините,
#define TRUE FALSE

Да это я вообще в качестве хохмы привел, не апеллируя к этому примеру, как к аргументу. Просто этот пример наглядно демонстрирует мощь препроцессора как дестуктивного средства, только и всего.

Цитата(ReAl @ Apr 1 2008, 19:40) *
это примеры вредительского и безграмотного применения макросов, а не их генетической ущербности.

Как насчет вышеприведенного примера про

Код
#define I 7
#define N 2
#define C 0

?

А ведь это не лохи какие-то делали, а вполне серьезная и уважаемая фирма IAR Systems, которая выпускает очень достойные продукты. Замечательные грабли. Замечательный пример той же самой деструктивной мощи. Да, препроцессор обладает известной гибкостью в силу своих свойств по текстовой подстановке, но это палка о двух концах. Не стоит злоупотрелять ею.

Имхо, "генетическая ущербность" препроцессора в том, что он делает свою работу тупо, без анализа, не обращая внимания на простнаства имен и прочий контекст, о чем уже в этой же ветке было не раз говорено.

Цитата(ReAl @ Apr 1 2008, 19:40) *
Но на их базе строится рекомендация "использование макросов следует уменьшать в идеале до нуля",

Да. Но идеал недостижим. Поэтому препроцессор останется.

Цитата(ReAl @ Apr 1 2008, 19:40) *
(а почему тогда в стандарте оставили не только условную компиляцию,

Потому, что для нее нет адекватной замены.

Цитата(ReAl @ Apr 1 2008, 19:40) *
но и функциональные макросы, склейку и подстановку аргументов

Совместимость и преемственность. Попробуй убери что-нить из этого - миллионы строк кода уже написанного, отлаженного и работающего кода сразу перестанут компилироваться.

Цитата(ReAl @ Apr 1 2008, 19:40) *
и оставили указатели?)

Указатели из другой оперы, не надо все в кучу валить. Еще спроси (ехидно так), зачем оставили ассемблер - там тоже можно при невнимательном обращении наворотить. smile.gif


Цитата(ReAl @ Apr 1 2008, 19:40) *
Так же как и с goto, который я использую редко

Реально есть одна ситуация, где без него геморно - выход из вложенного цикла. Вроде все, больше не знаю (навскидку). Из-за этого оный оператор и оставили в языке.

Цитата(ReAl @ Apr 1 2008, 19:40) *
так же и с макросами:
Используйте, не бездумно, голова дана именно для выбора нужного средства языка!

Осталось найти, как добраться до головы иаровских разрабов, соорудивших макросы, приведенные выше. smile.gif Если есть возможность разложить грабли - они будут разложены. Раньше или позже, чаще или реже. Желательно, чтобы это было реже. Для этого использование препроцессора надо свести к минимуму, о чем только и речь. Никто не призывает отказаться от него вообще - это, повторяю, нереально. Чего в крайности кидаться.

Цитата(ReAl @ Apr 1 2008, 19:40) *
(Кстати, а какое средство языка можно использовать бездумно? Знаменитые примеры "индусского" кода написаны и без макросов, и без gotoи часто вообще на яве, изначально "лишённой недостатков С/С++")

Коренное отличие многих среств языка от средств препроцессора в том, что с ними код читается без подводных граблей. Сразу видно, как используется средство, сразу понятно, что тут можно ожидать. А вот с препроцессором оно несколько не так.

Цитата(ReAl @ Apr 1 2008, 19:40) *
И не говорите мне, что этот текст надо переписать без макросов для облегчения чтения и сопровождения (представим себе, что понадобилось добавить ещё одну функцию из dlportio.dll и/или изменить обработку ошибки - в каком случае надо больше до-/пере-писывать руками и где при этом больше шансов ошибиться в одной из ветвей - в варианте с макросами или с прямым текстом?

Это большой вопрос, как лучше, пример не убеждает. Насчет руками - про рефакторинг слышал? Кроме того, тут пример очень осторожного использования - определение макроса лежит прямо тут же, все перед глазами. Но не дай бог кто-нить вздумает использовать такое же имя _DL_PTR в своей программе. Будет удивлен. smile.gif Т.ч. тут тоже есть, что обсудить.

Цитата(ReAl @ Apr 1 2008, 20:40) *
Ну в такой формулировке - с указанием где именно и без абсолютной категоричности - можно согласиться :-)
Но ведь обычно идёт разговор "запретить и всё тут, так как это источник ошибок".

Это где это сказано, что "запретить" и все тут? Сказано было, свести к минимуму.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- sKWO   Стиль программирования на Си   Mar 31 2008, 10:23
- - Axxel   Цитата(sKWO @ Mar 31 2008, 16:23) Этот си...   Mar 31 2008, 10:36
|- - aaarrr   Стиль жуткий, не надо так делать. Цитата(Axxel ...   Mar 31 2008, 10:40
- - defunct   ЦитатаЭтот синтаксис возможен через какоето макроо...   Mar 31 2008, 10:59
|- - sKWO   Цитата(defunct @ Mar 31 2008, 14:59) да, ...   Mar 31 2008, 11:56
|- - dxp   Цитата(sKWO @ Mar 31 2008, 18:56) Да, тог...   Mar 31 2008, 12:16
|- - defunct   Цитата(sKWO @ Mar 31 2008, 13:56) Чёта му...   Mar 31 2008, 14:17
|- - Axxel   Цитата(sKWO @ Mar 31 2008, 17:56) ПОКАЖИ ...   Apr 1 2008, 04:30
- - sensor_ua   ЦитатаВо всех случаях, где можно выбирать, предпоч...   Mar 31 2008, 12:48
|- - rezident   Извиняюсь, что вклиниваюсь. Цитата(sensor_ua ...   Mar 31 2008, 14:13
|- - dxp   Цитата(sensor_ua @ Mar 31 2008, 19:48) Пр...   Apr 1 2008, 03:41
- - Alechin   Так как кусок кода мой - скажу как это описано у м...   Mar 31 2008, 14:08
- - sensor_ua   ЦитатаДля переносимости кода.... IMNHO, совсем неу...   Mar 31 2008, 14:39
|- - rezident   Цитата(sensor_ua @ Mar 31 2008, 20:39) IM...   Mar 31 2008, 14:51
- - vshemm   Есть замечательная книга Алена Голуба "Правил...   Mar 31 2008, 15:08
- - sensor_ua   ЦитатаУже были и неоднократно пояснения почему typ...   Mar 31 2008, 15:23
|- - sKWO   Спасибо, Ребята! Дисскусия разворачивается хор...   Mar 31 2008, 16:51
- - sensor_ua   Попробуй таки найти текстовым поиском "#defin...   Mar 31 2008, 17:10
|- - rezident   Цитата(sensor_ua @ Mar 31 2008, 23:10) По...   Mar 31 2008, 17:12
- - sensor_ua   ЦитатаА вот на такое безобразие препроцессор сруга...   Mar 31 2008, 17:26
|- - rezident   Цитата(sensor_ua @ Mar 31 2008, 23:26) А ...   Mar 31 2008, 18:49
- - sensor_ua   Гы Мне код перебивать не нужно. Мне как раз единож...   Mar 31 2008, 19:07
|- - Сергей Борщ   Цитата(dxp @ Apr 1 2008, 16:50) Осталось ...   Apr 1 2008, 14:43
|- - ReAl   Цитата(dxp @ Apr 1 2008, 15:50) Это где т...   Apr 1 2008, 14:51
|- - zltigo   Цитата(dxp @ Apr 1 2008, 16:50) А вот в и...   Apr 1 2008, 20:44
|- - SasaVitebsk   Цитата(zltigo @ Apr 2 2008, 00:44) Рекоме...   Apr 1 2008, 22:17
||- - _Pasha   Цитата(SasaVitebsk @ Apr 2 2008, 01:17) П...   Apr 2 2008, 06:58
|- - ReAl   Цитата(zltigo @ Apr 1 2008, 22:44) Самост...   Apr 2 2008, 11:55
|- - defunct   Цитата(ReAl @ Apr 2 2008, 13:55) Шаманим...   Apr 2 2008, 12:15
||- - ReAl   Цитата(defunct @ Apr 2 2008, 14:15) Это я...   Apr 2 2008, 12:40
||- - defunct   Цитата(ReAl @ Apr 2 2008, 14:40) Фух, а т...   Apr 2 2008, 12:43
||- - _Pasha   Цитата(ReAl @ Apr 2 2008, 15:40) ...спосо...   Apr 2 2008, 18:53
|- - zltigo   Цитата(ReAl @ Apr 2 2008, 14:55) По повод...   Apr 2 2008, 15:01
|- - sKWO   Позволю небольшой отрывок кода, извиняюсь что немн...   Apr 2 2008, 16:40
- - sensor_ua   Цитатапрепроцессором не рекомендуется пользоваться...   Mar 31 2008, 20:29
- - _Pasha   Цитата(vshemm @ Mar 31 2008, 19:08) Так т...   Mar 31 2008, 22:07
- - sensor_ua   ЦитатаУже неоднократно на эту тему проходились, по...   Apr 1 2008, 05:53
|- - Dog Pawlowa   Цитата(sensor_ua @ Apr 1 2008, 08:53) Про...   Apr 1 2008, 06:30
|- - dxp   Цитата(sensor_ua @ Apr 1 2008, 12:53) А в...   Apr 1 2008, 07:01
- - _Pasha   Пример winavr Кодeeprom_read_block(&my_var...   Apr 1 2008, 06:16
- - _Pasha   Цитата(sensor_ua @ Apr 1 2008, 09:53) К с...   Apr 1 2008, 06:33
- - sensor_ua   ЦитатаНо это, повторяю, другое Дальше бессмысленно...   Apr 1 2008, 08:17
|- - dxp   Цитата(sensor_ua @ Apr 1 2008, 15:17) Дал...   Apr 1 2008, 09:28
- - SasaVitebsk   Очень интересная дискуссия развернулась. Но, в общ...   Apr 1 2008, 12:48
|- - dxp   Цитата(SasaVitebsk @ Apr 1 2008, 19:48) Н...   Apr 1 2008, 13:11
||- - ReAl   Цитата(dxp @ Apr 1 2008, 15:11) Во всяком...   Apr 1 2008, 13:40
||- - defunct   Цитата(ReAl @ Apr 1 2008, 15:40) Но ведь ...   Apr 2 2008, 09:58
||- - andrew_b   Цитата(defunct @ Apr 2 2008, 12:58) Delph...   Apr 2 2008, 10:15
||- - Сергей Борщ   Цитата(defunct @ Apr 2 2008, 12:58) Прост...   Apr 2 2008, 12:34
||- - defunct   Цитата(Сергей Борщ @ Apr 2 2008, 14:34) Н...   Apr 2 2008, 12:39
|- - Сергей Борщ   Цитата(SasaVitebsk @ Apr 1 2008, 15:48) К...   Apr 1 2008, 13:15
- - Lem   одним из авторитетов для меня является Герб Саттер...   Apr 1 2008, 13:07
- - sensor_ua   ЦитатаНе следует путать приятное с полезным... Не ...   Apr 1 2008, 13:37
- - SasaVitebsk   Вот об этом я и говорю - богатство выбора в рамках...   Apr 2 2008, 18:34
|- - singlskv   Цитата(SasaVitebsk @ Apr 2 2008, 22:34) С...   Apr 2 2008, 19:19
|- - zltigo   Цитата(SasaVitebsk @ Apr 2 2008, 21:34) ....   Apr 2 2008, 19:30
|- - singlskv   Цитата(zltigo @ Apr 2 2008, 23:30) Вы зна...   Apr 2 2008, 20:31
||- - zltigo   Цитата(singlskv @ Apr 2 2008, 23:31) Да п...   Apr 2 2008, 21:51
||- - singlskv   Цитата(zltigo @ Apr 3 2008, 01:47) Налицо...   Apr 2 2008, 21:55
||- - zltigo   Цитата(singlskv @ Apr 3 2008, 00:55) пока...   Apr 2 2008, 22:08
|||- - singlskv   Цитата(zltigo @ Apr 3 2008, 02:08) и убра...   Apr 2 2008, 22:37
|||- - ReAl   Цитата(singlskv @ Apr 3 2008, 00:37) Я же...   Apr 2 2008, 22:46
||||- - singlskv   Цитата(ReAl @ Apr 3 2008, 02:32) Кстати, ...   Apr 2 2008, 23:25
||||- - ReAl   Цитата(singlskv @ Apr 3 2008, 00:55) Так ...   Apr 2 2008, 23:45
||||- - defunct   Цитата(ReAl @ Apr 3 2008, 01:45) Кстати, ...   Apr 3 2008, 10:22
|||- - zltigo   Цитата(singlskv @ Apr 3 2008, 01:37) это ...   Apr 3 2008, 05:53
||- - ReAl   Цитата(singlskv @ Apr 2 2008, 23:55) с ОД...   Apr 2 2008, 22:32
|- - sKWO   Цитата(zltigo @ Apr 2 2008, 22:30) Компил...   Apr 7 2008, 10:40
|- - ReAl   Цитата(sKWO @ Apr 7 2008, 13:40) К пример...   Apr 7 2008, 19:43
|- - sKWO   Цитата(ReAl @ Apr 7 2008, 22:43) Называет...   Apr 8 2008, 11:00
- - SasaVitebsk   Хотя я в NASA не работал, но по слухам там не прим...   Apr 2 2008, 19:53
- - AlexKLm   На СИ, правильно когда по-больше зелени (#define),...   Apr 2 2008, 21:22
- - SasaVitebsk   Вот я и говорю, что результат практически тот же п...   Apr 3 2008, 07:23
|- - ReAl   Цитата(SasaVitebsk @ Apr 3 2008, 09:23) В...   Apr 3 2008, 08:28
- - _Pasha   Кто о чем, а вшивый - о бане... Пробегала книжка ...   Apr 3 2008, 12:57
- - sensor_ua   Цитатасредствами ИАР это дело обстоит намного прощ...   Apr 7 2008, 10:58
|- - sKWO   Цитата(sensor_ua @ Apr 7 2008, 13:58) А к...   Apr 7 2008, 11:07
- - sensor_ua   Не очень понял, что Вы хотите, но на телесистемах ...   Apr 7 2008, 12:51
- - sKWO   спасибо за инфу!!   Apr 7 2008, 17:49


Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 15:53
Рейтинг@Mail.ru


Страница сгенерированна за 0.01507 секунд с 7
ELECTRONIX ©2004-2016