|
Стиль программирования на Си, описание функции |
|
|
|
Mar 31 2008, 10:23
|

Местный
  
Группа: Участник
Сообщений: 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); Спасибо.
--------------------
нельзя недооценивать предсказуемость глупости
|
|
|
|
|
 |
Ответов
|
Apr 1 2008, 05:53
|
Профессионал
    
Группа: Свой
Сообщений: 1 266
Регистрация: 22-04-05
Из: Киев
Пользователь №: 4 387

|
Цитата Уже неоднократно на эту тему проходились, повторять не охота, воспользуйтесь поиском. Простите, но что искать? По слову макрос? Я тут довольно часто, но мимио видно всё интересное по теме пробежало. Цитата Макроподстановка таит в себе опасность Я не спорю, что пользоваться нужно уметь, а тем более таких глупых вещей, как примере от IAR, не допускать (с примерчиком познакомился ранее просматривая хедеры). Цитата По этим причинам использование макроподстановок должно быть минимизировано до уровня минимально необходимого, без которого реально не обойтись. А вот тут начинается полный субъективизм. Обратный пример - неинициализированные элементы структур и, как самые приятные  варианты, неинициализированные указатели на функции и использование указателей на структуры в качестве формальных параметров функции. Необходимость выдерживать порядок инициализации приводит к ещё более "подлым" ошибкам, чем жесткое конфигурирование с использованием макроподстановок (ну нет шаблонов в Си). Но, ИМХО, всё это имеет право на использование, если это не самоцель. Цитата Макросы-литералы замечательно заменяются настоящими типизированными константами. При этом никакого оверхеда не возникает - если нет попытки взять адрес константного объекта или завести ссылку на него, то компилятор не будет его размещать в памяти. Правда, это относится к С++, где у констант по умолчанию внутреннее связывание. К сожалению, это, IMHO, более желаемое, чем действительное. const переменная это все-таки переменная. Цитата то существует мнение (и я его придерживаюсь) опять же всё субъективно. Если не понимать ограничений препроцессора, то можно и в самом простом ошибиться. (Я, например, для редких случаев сложных константных выражений применяю тесты на интерпретаторе Ch) Цитата Но, думается, сегодня уже нет проблем использовать плюсатый компилятор К сожалению, есть. Цитата Некоторое время назад попался прикол (возможно байка Аналогично #define else ;
--------------------
aka Vit
|
|
|
|
|
Apr 1 2008, 07:01
|

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

|
Цитата(sensor_ua @ Apr 1 2008, 12:53)  А вот тут начинается полный субъективизм. Обратный пример - неинициализированные элементы структур и, как самые приятные  варианты, неинициализированные указатели на функции и использование указателей на структуры в качестве формальных параметров функции. Необходимость выдерживать порядок инициализации... Нет, это другое. Это вы про элементы низкоуровневого программирования, которые сопряжены необходимостью внимательно следить за соблюдением правил. Но это, повторяю, другое - тут у вас все на виду, анализ кода сразу показывает гнилое место. Сразу видно, где потенциальные грабли - адресная арифметика, операции с указателями, инициализация аргегатных объектов, ручные преобразования типов и т.д., этим вещам надо уделять повышенное внимание. В то время как с макроподстановкой пакостное поведение скрыто от непосредственного взгляда, и негативные последствия могут вылезать совсем в другом месте. Цитата(sensor_ua @ Apr 1 2008, 12:53)  К сожалению, это, IMHO, более желаемое, чем действительное. const переменная это все-таки переменная. Вернее - это констатный объект. Если нет необходимости размещать его в памяти (не берется адрес и нет ссылки на него), то никакой вменяемый компилятор этого делать не будет - именно для этой возможности в том же С++ специально ввели правило, согласно которому константные объекты имеют внутреннее связывание... Хорошо, не верите, давайте проверим. Поскольку тут форум по AVR, то на нем и будем тренироваться. Код: Код // file: slon.cpp
const int a = 10;
int f(int x) { return x + a; } Комилятор - какой-то от IAR. v4.хх. Не суть важно. Результат: Код const int a = 10; In segment CODE, align 2, keep-with-next int f(int x) ??f: { return x + a; 00000000 5F06 SUBI R16, 246 00000002 4F1F SBCI R17, 255 00000004 9508 RET } Как видим, все замечательно получилось, ничего в памяти не размещается, никаких обращений к памяти, ессно, нет. Это в режиме ++. Отключаем его - в С режиме результат: Код In segment NEAR_I, align 1, keep-with-next REQUIRE `?<Segment init: NEAR_I>` const int a = 10; a: DS 2 REQUIRE `?<Initializer for a>` In segment CODE, align 2, keep-with-next int f(int x) f: { return x + a; 5F06 SUBI R16, 246 4F1F SBCI R17, 255 9508 RET } In segment NEAR_ID, align 1, keep-with-next `?<Initializer for a>`: 000A DW 10 Да, тут, как и положено, константа 'a' размещена в памяти (и инициализатор тоже съест свою часть в сегменте инициализаторов), потому что компилятор не имеет права этого не сделать - в С константные объекты имеют по умолчанию внешнее связывание и к ним может производиться обращение из других единиц компиляции. В этом случае линкер будет материться на отсутствие объекта. Но даже в этом случае компилятор, видя значение констатнты, не стал городить обращение к ней, а сгенерил более короткий эффективный код. Поведение можно сделать как в ++ варианте, снабдив объявление констатны квалификатором static: static const int a = 10; Результат аналогичен первому варианту: Код static const int a = 10; In segment CODE, align 2, keep-with-next int f(int x) f: { return x + a; 5F06 SUBI R16, 246 4F1F SBCI R17, 255 9508 RET } Думается, что написать ключевое слово 'static' не является слишком обременительным. Кстати, сделать в С++ поведение констант аналогичным С-шному можно сделать с помощью объявления их как 'extern'. Результат компиляции приводить не буду, поверьте, оно точно соотвествует вышеприведенному С без 'static'. Цитата(sensor_ua @ Apr 1 2008, 12:53)  К сожалению, есть. И в чем они состоят? Для AVR хоть коммерческий IAR, хоть безплатный AVR-GCC давно уже поддерживают почти все фичи С++ (за исключением тяжелых, которые реально применять на AVR смысла нет).
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
Сообщений в этой теме
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 Lem препроцессором не рекомендуется пользоваться именн... Mar 31 2008, 20:08 ReAl Цитата(Lem @ Mar 31 2008, 22:08) как во ч... Apr 1 2008, 12:40  dxp Цитата(ReAl @ Apr 1 2008, 19:40) Как прав... Apr 1 2008, 13:50   Сергей Борщ Цитата(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 Dog Pawlowa Цитата(sensor_ua @ Apr 1 2008, 08:53) Про... Apr 1 2008, 06:30 _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
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|