|
|
  |
Вопросы по изучению Си |
|
|
|
Mar 8 2009, 07:13
|
Частый гость
 
Группа: Участник
Сообщений: 120
Регистрация: 16-02-08
Пользователь №: 35 087

|
Здравствуйте. Месяца два назад сел за изучение микроконтроллеров AVR. Почитал книгу «Белов А. В. Создаём устройства на микроконтроллерах. 2007», проделал примерчики в CodeVisionAVR, пощупал аврстудию, погонял схемки в протеусе, попрошивал мегу8 на stk500, на макетке собрал. Чувствую что знаний по языку Си не хватает. Имеет ли смысл на некоторое время забыть про микроконтроллеры, установить что-нибудь вроде Microsoft Visual Studio и начать изучать язык Си по книге про чистый Си без привязки к микроконтроллерам, например, по книге 1) Керниган&Ритчи в списке?! Но не знаю, хватит ли на чистый Си сил и энтузиазма, без привязки к микроконтроллерам читать тяжело, да и времени на чтение мало – микроконтроллеры это пока хобби. Или может быть продолжать читать книги по микроконтроллерам?! Но там язык Си рассмотрен поверхностно – пролетарская суть не ясна. Поискал в сети книги по чистому Си (без плюсов), литературы на русском – мало. Вот что удалось найти: 1) Керниган, Ритчи. Язык Си 2) Керниган, Ритчи. Язык программирования Си 3) Керниган, Пайк. Практика программирования 4) Шилдт. Полный справочник по C Остальная доступная в сети литература по Си с первого взгляда менее привлекательна: 5) Афанасьев. Программирование на языке Си 6) Богатырев. Руководство полного идиота по программированию на C 7) Болский. Язык программирования Си 8) Бочков. Язык программирования Cи для ПК 9) Голицина. Основы алгоритмизации и программирования 10) Крупник. Изучаем Си 11) Подбельский. Программирование на языке Си 12) Фьюэр. Задачи по языку С 14) Хэзфилд. Искусство программирования на C 13) Шилтд. С для профессиональных программистов Отдельный вопрос по классической книге: 15) «Роберт Седжвик. Фундаментальные алгоритмы на C. Части 1 - 5. Анализ. Структуры данных. Сортировка. Поиск. Алгоритмы на графах» Книга того же автора с тем же названием встречались мне для С++ - изучать ли ее или попытаться найти эту книгу для чистого Си в бумажном виде?! Верно ли утверждение: «Седжвика можно брать и с "C++" в названии. На самом деле там все равно чистый C». Что еще из книг маскирующихся в названии под «С++» пригодно для изучения про чистый Си?! Если что-то из доступных в сети электронных книг по чистому Си пропустил, пожалуйста, дополните. Может быть есть что то из достойных «бумажных» книг по Си, что не выложено в сеть и стоит найти?! Наверное, нужны книги не просто справочник и не с примитивом, а книга учебная, что бы много различных примеров разобрано, приложений, от простого к сложному и через них вся суть и обобщения. Вот например книги с громкими и многообещающими аннотациями: 16) Прата. Язык программирования C (Си). Лекции и упражнения h**p://www.livelib.ru/book/1000163060 17) Кочан. Программирование на языке C (Си) h**p://www.williamspublishing.com/Books/5-8459-1088-9.html Но за громкими и красивыми обложками, аннотациями, часто бывают пустышки которые лучше даже не читать. Вечные вопросы: что делать и стоит ли вообще читать или может так и ходить неграмотным и программировать методом тыка?! Как развиваться дальше, что читать, в каком порядке читать и что в первую очередь читать?! Спасибо за внимание и советы.
Сообщение отредактировал Владимир_2010 - Mar 8 2009, 07:15
|
|
|
|
|
Mar 8 2009, 07:36
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Достаточно одной - K&R второе издание. Контроллерная специфика для языка это обычно несколько страниц в документации на конкретный компилятор. "Книги по микроконтролерам" это или откровенное дерьмо, или это действительно книги по Микроконтроллерам а не по изучению языков и раcсматривать "примеры" из таких книг следует так-же, как и пример из букваря "Мама мыла раму" - не более. Для расширения кругозра - книга п.3 тоже обязателена к прочтению, но догматично ее принимать к исполнению, тем не менее, не стоит. По тонкостям языка - стандарт C99. Возможно, следует проработать чего-либо с "упражнениями" из западных авторов. Цитата(_Pasha @ Mar 8 2009, 10:22)  И еще - ищите в инете и читайте живые примеры, разбирайтесь что и как написано. Только имейте ввиду, что не менее, чем в 95 случаев из 100 это будет исходник уровня "моя первая программа на C"  и скорее "это" может служить учебным пособием как НЕ надо писать. Посему относиться к найденному в интернете надо более, чем критически.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 8 2009, 08:42
|
Частый гость
 
Группа: Участник
Сообщений: 120
Регистрация: 16-02-08
Пользователь №: 35 087

|
Цитата(_Pasha @ Mar 8 2009, 12:22)  Не начинайте с Codevision. Он портит мозг.  Насчет рака мозга, который вызывает CodevisionAVR мне уже говорил один радиолюбитель. Потихоньку думаю перейти или на Winavr или на IAR. Начал с CodevisionAVR потому что книги по нему есть, тот же Белов для новичка как первый старт. ДА еще в какой-то из книг прочитал мнение что дескать с Winavr новичку разбираться тяжело – лучше начать с CodevisionAVR. Вот что по микроконтроллерам AVR на Си удалось найти: 1) Белов. Создаём устройства на микроконтроллерах 2) Голубцов. Микроконтроллеры AVR от простого к сложному 3) Лебедев. Code Vision AVR 4) Хартов. Микроконтроллеры AVR. Практикум для начинающих 5) Шпак. Программирование на языке C для AVR и PIC микроконтроллеров 6) Joe Pardue. C Programming for microcontrollers, 2005 7) Steven F. Barrett and Daniel J. Pack. Atmel AVR Microcontroller Primer - Programming and Interfacing, 2008 Если что-то пропустил для AVR на Cи – дополните пожалуйста. Хоть и не с примерами на Си, но думаю без книги 8) Евстифеев. Микроконтроллеры AVR семейства Mega не обойтись любому начинающему осваивать семейство Mega В рунете много радолюбителей выкладывают проектов на Winavr или на Codevision, с описаниями – это несомненно плюс для новичка. А IAR у меня тока дока на английском. Да и мудреный IAR какой-то, модный весь, с наворотами. Ни одной книги по IAR даже на английском я не встречал. Хотя пока мозг пустой наверное лучше его приучать к тому что перспективно, т.е. к IAR. Глупый вопрос но все же: код написанный в IAR я смогу загнать в AVRStudio 4.16, прошить микроконтрллер в stk500 и использовать новую связку AVRStudio 4.16 с Proteus v7.4 SP3 (Proteus VSM Viewer)?! И использовать имитацию в AVRStudio аналоговых сигналов для АЦП в связке с Proteus?! С другой стороны: хоть Winavr, хоть IAR, хоть Codevision – проблема незнания языка Си и фундаментальных алгоритмов все равно остается.
Сообщение отредактировал Владимир_2010 - Mar 8 2009, 08:46
|
|
|
|
|
Mar 8 2009, 08:57
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
Лично мое мнение такое: программирование - это не знание языка, это способ или стиль мышления. Научиться программировать можно вообще не зная ни одного языка программирования - с моей точки зрения это означает научиться раскладывать решение задачи на необходимые этапы, т.е. алгоритмизация. Вот умению выделять из поставленной задачи отдельные элементы, которые можно (или нужно) выполнять в определенной последовательности (или наоборот, параллельно) для того, чтобы добиться требуемого результата, мало какие книги учат... Язык Си (или другой какой) - это всего лишь набор красок и кистей, которыми мы рисуем картины... Но результат зависит от того, как именно мы воспринимаем мир и как умеем отразить его на холсте. К сожалению, мне неизвестны книги, которые могли бы научить алгоритмике и логическому мышлению, поэтому посоветовать ничего не могу... Но уверен, что начинать нужно именно с этого.
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Mar 8 2009, 09:10
|
Частый гость
 
Группа: Участник
Сообщений: 120
Регистрация: 16-02-08
Пользователь №: 35 087

|
Цитата(zltigo @ Mar 8 2009, 12:36)  Достаточно одной - K&R второе издание. Что неужели по Си ничего кроме Керниган&Ритчи и Керниган&Пайк читать не надо?! Что с книгой Седжвик и трюком в названии «С++»?! По поводу трудов Керниган и Ритчи. У меня две книги. Первая в pdf называется на русском «Керниган, Ритчи. Язык программирования Си/Пер. с англ. 3е издание. 2001 – 352 с», однако двумя страницами ранее на картинке написано по английскому «The C programming Language. Second Edition». Вторая книга тоже в pdf но не понятно что за издание и что за год. На первой странице написано просто «Б.В. Керниган, Д.М. Ричи. Язык С». в книге 229 страниц. Как учить Си по этим книгам?! Какую программулю на компьютер ставить и на чем примеры прогонять?!
|
|
|
|
|
Mar 8 2009, 09:24
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Владимир_2010 @ Mar 8 2009, 12:10)  Что неужели по Си ничего кроме Керниган&Ритчи Раньше, чем K&R понимать начнете - не надо. Цитата По поводу трудов Керниган и Ритчи. У меня две... Я же даже жирным шрифтом выделил второе издание. Если с английским так плохо, что надпись «The C programming Language. Second Edition» воспринимается, как картинка, то надо начинать с английского языка. Цитата(Владимир_2010 @ Mar 8 2009, 12:10)  Что с книгой Седжвик и трюком в названии «С++»?! Думаю, что совсем "ничего". Алгоритмы это Кнут, а не седжвики и иже с с ним рождающие "для С", "для С++", "для Java", "для VBA  "....
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 8 2009, 09:24
|
Частый гость
 
Группа: Участник
Сообщений: 120
Регистрация: 16-02-08
Пользователь №: 35 087

|
Цитата(zltigo @ Mar 8 2009, 14:17)  Я же даже жирным шрифтом выделил второе издание. Если с английским так плохо, что надпись «The C programming Language. Second Edition» воспринимается, как картинка, то надо начинать с английского языка. Спасибо. Second Edition - это всем понятно что второе издание. Только смущает что в книге при переводе на русский издатели написали «Язык программирования Си/Пер. с англ. 3е издание» (на 4ой странице), а двумя страницами ранее "The C programming Language. Second Edition". Вот и уточнил – та ли эта книга. Цитата(zltigo @ Mar 8 2009, 14:17)  Думаю, что совсем "ничего". Алгоритмы это Кнут, а не седжвики и иже с с ним рождающие "для С", "для С++", "для Java", "для VBA Седжвик привлекает тем что на первый взгляд книга достойная и на Си, а Си нужен для освоения микроконтроллеров. До детального изучения «Кнут. Искусство программирования» руки все не доходят. Хотя понимаю что надо. Из классики по алгоритмам что еще обязательно к прочтению?! «Томас Кормен и др. Алгоритмы: построение и анализ»?!
Сообщение отредактировал Владимир_2010 - Mar 8 2009, 09:41
|
|
|
|
|
Mar 8 2009, 09:41
|
Частый гость
 
Группа: Участник
Сообщений: 167
Регистрация: 15-08-07
Пользователь №: 29 803

|
Цитата(ARV @ Mar 8 2009, 11:57)  К сожалению, мне неизвестны книги, которые могли бы научить алгоритмике и логическому мышлению, поэтому посоветовать ничего не могу... Но уверен, что начинать нужно именно с этого. http://mitpress.mit.edu/sicp/Есть в русском переводе: http://newstar.rinet.ru/~goga/sicp/sicp.pdf.
|
|
|
|
|
Mar 8 2009, 09:54
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Владимир_2010 @ Mar 8 2009, 12:24)  Седжвик привлекает тем что на первый взгляд книга достойная и на Си, а Си нужен для освоения микроконтроллеров. Вы английский, как, по учебникам изучать предпочитаете, или по анголоязычным комментариям шекспироведов к Королю Лиру? Если первое, то причем тут наличие примеров на С или любом другом языке в учебнике по алгоритмам?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 8 2009, 12:52
|

Гуру
     
Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515

|
Присоединяюсь к Герцу. K&R - мало полезен. Более полезен даже не справочник, а маленьких листочек, на котором выписаны примеры ходовых конструкций. For, while, if else, ++, --, да примеры оформления функций. Языком Си не пользуюсь, а использую его. Как замену ассемблеру. А для реальных задач в микроконтроллерах обычно возникает много разных проблем, что добавлять побочные эффекты самого Си не имеет смысла. Разве что ты - тащишься от процесса именно программирования. Я - не тащусь.
--------------------
On the road again (Canned Heat)
|
|
|
|
|
Mar 8 2009, 13:25
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(DpInRock @ Mar 8 2009, 15:52)  Присоединяюсь к Герцу. K&R - мало полезен. Более полезен даже не справочник, а маленьких листочек, на котором выписаны примеры ходовых конструкций. For, while, if else, ++, --, да примеры оформления функций. Языком Си не пользуюсь, а использую его. Как замену ассемблеру. А для реальных задач в микроконтроллерах обычно возникает много разных проблем, что добавлять побочные эффекты самого Си не имеет смысла. Разве что ты - тащишься от процесса именно программирования. Я - не тащусь. Так в том то и прелесть С, что "ходовых инструкций" меньше десятка.
|
|
|
|
|
Mar 8 2009, 13:43
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(sergeeff @ Mar 8 2009, 16:25)  Так в том то и прелесть С, что "ходовых инструкций" меньше десятка. Словарь "Эллочки-Людоедки" составлял, согласно Ильфу с Петровым, 30 слов, но ими она могла выразить практически любую свою мысль. Вопрос только в том, владелала-ли Эллочка русским языком и насколько ценны ее мысли?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 8 2009, 15:30
|
Частый гость
 
Группа: Участник
Сообщений: 120
Регистрация: 16-02-08
Пользователь №: 35 087

|
В том то и вопрос – знаю только базу for, while, else, if, switch, как объявить функцию. Как Элочка Людоедка. Программировал на matlab различные алгоритмы ориентированные на математическое моделирование, прикладную математику – база и тут такая же. Но испытываю постоянный дискомфорт от того что мелькают незнакомые конструкции Си. Кроме того все время мучает мысль и совесть что код, алгоритм написал не оптимально, что можно меньше по объему, если применить какие-нибудь другие функции и что бы быстрее работал. Вот и закрадывается мысль что может потратить некоторое время на основы и азы, а уж потом щупать микроктнроллеры. Хотя с другой стороны изучать Си без привязке к микроконтроллерам не интересно. Если бы хотя бы в книге было много математики, различных нестандартных алгоритмов + Си – дак так хоть читать интересно, а просто Си с примитивными, разрозненными примерами – тоска. Думаю все таки поставить Borland C++ Builder и проштудировать K@R, все таки классика.
Сообщение отредактировал Владимир_2010 - Mar 8 2009, 15:34
|
|
|
|
|
Mar 8 2009, 17:41
|

Гуру
     
Группа: Модераторы
Сообщений: 10 983
Регистрация: 23-11-05
Пользователь №: 11 287

|
Цитата(zltigo @ Mar 8 2009, 14:27)  Типа "методичка" для студентов всяких разных специальностей - прочитать, сдать зачет и забыть  . Такого типа методичек в интернете довольно много. Да, справедливо. Но поскольку программированием пока приходится заниматься между делом и непрофессионально - почти хватает. Когда (редко) возникает нужда разобраться глубже - беру другие источники. Вот вырасту, стану писать серьёзные программы - тогда и за книжки взрослые засяду... Цитата Из "справочников" в свое время активно пользовал СЭВ-овский стандарт языка - очень неплохо был написан и строго, и нюансировка компиляторов присутствовала, да и те-же примеры для неочевидных вещей были со вкусом подобраны и растолкованы. Так, может, есть в сети? Цитата(Владимир_2010 @ Mar 8 2009, 17:30)  Хотя с другой стороны изучать Си без привязке к микроконтроллерам не интересно.
Думаю все таки поставить Borland C++ Builder и проштудировать K@R, все таки классика. Нелогично, ИМХО. К железу надо ближе...
|
|
|
|
|
Mar 8 2009, 18:06
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Владимир_2010 @ Mar 8 2009, 18:30)  Думаю все таки поставить Borland C++ Builder... Ни в коем случае - это слишком "самодельная" реализация C  . Традиция у борландовцев такая. Возьмите GCC (на нем и дальше,возможно, жить будете), ну или Watcom. Ну или сразу - MVC.... Но не борланд. Цитата(Herz @ Mar 8 2009, 20:41)  Так, может, есть в сети? Не знаю  это было издание где-то 90-го года. Выглядел он стандартно для методических материалов и международных стандартов издаваемых в то время - большой формат A4, мягкая обложка вишневого цвета, клеевой переплет. Было два экземпляра - могу поискать останки одного из них..... Пока не нашел, но два подобных издания нашел - это издания "Международного центра научной и технической информации" серия "Методические материалы и документация по пакетам прикладных программ". Цитата(DpInRock @ Mar 8 2009, 17:53)  Так вот, чтобы топикастер начал программировать контроллеры совсем необязательно вообще знать Си. Ну,ну  95% процентов исходников из интернету так и написаны, но не вижу причин для гордости и для приумножении такого "добра".
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 8 2009, 19:58
|
Частый гость
 
Группа: Участник
Сообщений: 120
Регистрация: 16-02-08
Пользователь №: 35 087

|
Да уж, все еще более усложняется и удаляется от железяк  . Если сейчас ставить, например GCC, придется тогда не c K@R упражняться, а решать другие вопросы: где скачать (хотя вроде бы с этим проблем не должно быть, т.к. free), как запустить, как освоить программу, как скомпилировать, как в ней производить отладку, где взять книгу по GCC... А Borland C++ Builder каждый второй прохожий на улице знает, да и книг с картинками для самообучения навалом. Borland не поддерживает что ли ANSI C изложенный в книге K@R?! Мне же по идее надо только язык почувствовать, почитать K@R, поделать примеры. Дальше буду опять mega8 мучить. Что за MVC и как он может помочь новичку в освоении микроконтроллеров и языка Си?! GCC я хотя бы буквы такие знаю (вижу при запуске avrstudio AVR GCC). Отвлекшись и замечтавшись, наткнулся на книгу «Saul A. Teukolsky et al., Numerical Recipes in C». Есть ли что-нибудь подобное на русском?! Просто прикладная математика на Си с примерами – это уже не скучно будет читать даже на досуге, перед сном.
|
|
|
|
|
Mar 8 2009, 20:05
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Владимир_2010 @ Mar 8 2009, 22:58)  Что за MVC и как он может помочь новичку в освоении микроконтроллеров и языка Си?! Microsoft Visual С - просто комплексное решение - по любому разумнее и стандартнее борлондячего творения. Цитата как запустить, как освоить программу, как скомпилировать, как по любому этим придется заниматься.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 8 2009, 21:12
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(Владимир_2010 @ Mar 8 2009, 22:58)  Мне же по идее надо только язык почувствовать, почитать K@R, поделать примеры. Дальше буду опять mega8 мучить. Проблема решается в два клика: 1. Ставите WinAVR-20080512 2. AVRstudio 4.хх Изучайте! В студии встроен GCC-плагин, с которым можно пробовать почти все без напрягов.
|
|
|
|
|
Mar 8 2009, 21:13
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(Владимир_2010 @ Mar 8 2009, 18:30)  В том то и вопрос – знаю только базу for, while, else, if, switch, как объявить функцию. Как Элочка Людоедка. Но испытываю постоянный дискомфорт от того что мелькают незнакомые конструкции Си. Кроме того все время мучает мысль и совесть что код, алгоритм написал не оптимально, что можно меньше по объему, если применить какие-нибудь другие функции и что бы быстрее работал. Вот и закрадывается мысль что может потратить некоторое время на основы и азы, а уж потом щупать микроктнроллеры. Ну все-таки без K&R никуда... но и пробовать ведь можно на симуляторе для микроконтроллера ? Код не оптимальный ? Дык вроде здесь можно найти уйму примеров как из неоптимального делают оптимальный... просто задавайте вопросы если где чего непонятно...
|
|
|
|
|
Mar 8 2009, 21:39
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 3-07-06
Из: Харьков
Пользователь №: 18 533

|
Цитата(Владимир_2010 @ Mar 8 2009, 17:30)  В том то и вопрос – знаю только базу for, while, else, if, switch, как объявить функцию. [skipped] Но испытываю постоянный дискомфорт от того что мелькают незнакомые конструкции Си. Кроме того все время мучает мысль и совесть что код, алгоритм написал не оптимально, что можно меньше по объему, если применить какие-нибудь другие функции и что бы быстрее работал. Осмелюсь посоветовать взять в компанию к K&R аппноты AVR030,AVR035 Цитата(Владимир_2010 @ Mar 8 2009, 17:30)  Вот и закрадывается мысль что может потратить некоторое время на основы и азы, а уж потом щупать микроктнроллеры. Хотя с другой стороны изучать Си без привязке к микроконтроллерам не интересно. В этом форуме, в ветках, посвященных AVR есть масса кода и ссылок - читайте, разбирайтесь,программируйте и отлаживайте свой кристалл. Есть еще, например, www.avrfreaks.net - много всяких несложных вещей, да и при желании в сети можно найти множество рабочего кода на С под АВР и поразбираться в нем. Цитата(Владимир_2010 @ Mar 8 2009, 17:30)  Если бы хотя бы в книге было много математики, различных нестандартных алгоритмов + Си – дак так хоть читать интересно, а просто Си с примитивными, разрозненными примерами – тоска. Думаю все таки поставить Borland C++ Builder и проштудировать K@R, все таки классика. Ну, если время девать некуда...
|
|
|
|
|
Mar 9 2009, 10:00
|
Частый гость
 
Группа: Участник
Сообщений: 120
Регистрация: 16-02-08
Пользователь №: 35 087

|
Цитата(Herz @ Mar 8 2009, 16:48)  Вот, пользуюсь, как справочником. О "художественной" ценности судить не стану - не имею права... Как и о том, с каких книг правильно начинать обучение программированию. Но именно в практике работы с МК мне помогает больше, чем "библия" Кернигана и Ритчи. Может, исключительно из удобного HTML-представления.  Библию K@R сейчас нашел в формате chm (http://рапидшаре.com/files/207090745/C_Language.rar.html), а то до этого на компе книга была не OCR в формате djvu . Может быть еще кому-нибудь пригодиться. Цитата(zltigo @ Mar 8 2009, 17:27)  Из "справочников" в свое время активно пользовал СЭВ-овский стандарт языка - очень неплохо был написан и строго, и нюансировка компиляторов присутствовала, да и те-же примеры для неочевидных вещей были со вкусом подобраны и растолкованы. Нельзя ли библиографическую запись более детально и четко определить, что бы поискать в библиотеке по каталогу. Если вещь хорошая и если удастся найти - отсканирую. А сейчас каким справочником пользуетесь?! Или справочник уже в голове?! Цитата(DpInRock @ Mar 8 2009, 17:52)  Присоединяюсь к Герцу. K&R - мало полезен. Более полезен даже не справочник, а маленьких листочек, на котором выписаны примеры ходовых конструкций. For, while, if else, ++, --, да примеры оформления функций. Языком Си не пользуюсь, а использую его. Встречал нечто подобное в сети в pdf, где на листочке-шпаргалке было выписано и описано все коротенечко. Файл найти не могу.
|
|
|
|
|
Mar 9 2009, 10:41
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Владимир_2010 @ Mar 9 2009, 13:00)  Нельзя ли библиографическую запись более детально и четко определить... Нашел где-то в интернете в списках литературы: Код Методические материалы и документация по пакетам прикладных программ [Текст] : научное издание / ; Междунар. центр науч. и техн. информации. - М. : МЦНТИ, 1978 - Вып. 67 : Система программирования на языке высокого уровня Си : / Д. М. Субботин, С. О. Бочков. - 1991. - 270 с. Цитата А сейчас каким справочником пользуетесь?! Или справочник уже в голове?! В голове + у компиляторов хелпы в комплекте неплохие бывают, ну а вообще стандарт С99 языка существует для полных и окончательных разборок
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 9 2009, 14:18
|

Познающий...
     
Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125

|
Цитата(DpInRock @ Mar 8 2009, 22:53)  Нужна маленькая шпаргалка. Тут вот в чем дело: шпаргалка не научит мыслить, не даст нужную теорию! Т.е. знания будут ограничены 3 - 10 пунктами шпаргалки, а когда возникнет ситуация, в шпаргалке не описанная, что произойдет? ИМХО теорию нужно учить сразу. Пусть не в полном объеме (да это и не возможно), но разумными порациями и теорию правильную! Чтобы уже на самом начальном этапе формировался прочный фундамент знаний. Цитата(zltigo @ Mar 9 2009, 18:41)  В голове + у компиляторов хелпы в комплекте неплохие бывают, ну а вообще стандарт С99 языка существует для полных и окончательных разборок А что бы Вы могли порекомендовать для чтения по Си++? Как я понимаю, Си уже мало используется...
--------------------
Выбор.
|
|
|
|
|
Mar 9 2009, 14:49
|

Познающий...
     
Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125

|
Цитата(zltigo @ Mar 9 2009, 22:24)  Аллах его ведает  тот-же первоисточник С++ от Бьерна Страуструпа написан по сравнению с творением профессионального технического писателя Кернигана по С просто ужасно  Ну ладно... Скачал книгу, что Вы рекомендовали топикстартеру (именно второе издание), может быть свой уровень подниму хочь чуть. Цитата(zltigo @ Mar 9 2009, 22:24)  С чего-бы это вдруг  Может быть мне и память изменила, но где-то давно я видел на это форуме информацию, что компиляторы Си уже не развиваются. Из этого сделал вывод (в большей степени благодаря "удобствам и сервисам" Си++). Выходит, что вывод неверный. А если не секрет, что Вы используете больше? Си или Си++?
--------------------
Выбор.
|
|
|
|
|
Mar 9 2009, 17:39
|

Знающий
   
Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467

|
K&R - я бы не заморачивался его читать. Он простой как 3 копейки, ничего особенного, ето не Страуструп. Чето надо выяснить - можно заглянуть. Ну или сразу в стандарт, ну там сложней разбиратся. Изучал бы по примерам. Поставил задачу - и решал, искал бы решения в интернете. Цитата(haker_fox @ Mar 9 2009, 13:17)  Но ведь сейчас-то Си++ компиляторы есть. Чем можно объяснить Ваш случай в настоящее время? Не сочтите за издевку (или что-нибудь в этом роде), это действительно интерес для меня! смотря на что. на PIC-и думаю нет. да и памяти C++ жрет больше. На никроконтроллерах с 64 к и меньше нет особого смысла C++ пользовать - не развернутся
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
Mar 9 2009, 18:31
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(haker_fox @ Mar 9 2009, 20:17)  Но ведь сейчас-то Си++ компиляторы есть. Чем можно объяснить Ваш случай в настоящее время? Не сочтите за издевку (или что-нибудь в этом роде), это действительно интерес для меня! Так это было в прошлое время  . Начинал с борландовского компилятора - первое творение на плбсах - на спор быстренько написал оконную библиотеку выигравшую соревнование у аналогичной сишной - уж больно классно все ложилось на плюсы, потом начались усовершенствования и с учетом накопления опыта удалось на С и ASM сделать круче  . Потом стало возможным писать на C, но не на C++ не только для PC, но и контроллеров. Первые операционки на смеси C/ASM..... Как-то отошел от C++, много пришлось на ASM писать, замаматерел, закостенел.... Писишные проекты традиционно пишу под C++ компилятор, но с минимальным использованием плюсов, остальное на C. "Ручками" на С при понимании того, что и как делать реализуются и плюсовые приемы. Цитата(A. Fig Lee @ Mar 9 2009, 20:39)  да и памяти C++ жрет больше. В принципе нет
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Mar 10 2009, 02:17
|

Познающий...
     
Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125

|
Цитата(zltigo @ Mar 10 2009, 02:31)  "Ручками" на С при понимании того, что и как делать реализуются и плюсовые приемы. В общем, это уже дело привычки и вкуса. Причем привычка и вкус базируются на абсолютном понимании того, что делается. Цитата(A. Fig Lee @ Mar 10 2009, 01:39)  да и памяти C++ жрет больше. Вот тут уже обсуждалось такое типичное заблуждение.
--------------------
Выбор.
|
|
|
|
|
Mar 10 2009, 04:34
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(DpInRock @ Mar 8 2009, 15:52)  Присоединяюсь к Герцу. K&R - мало полезен. Более полезен даже не справочник, а маленьких листочек, на котором выписаны примеры ходовых конструкций. For, while, if else, ++, --, да примеры оформления функций. Вот с этим категорически не могу согласиться. Учебник полезен тем, что он не только описывает синтаксис операторов, но и их использование, показывает такие способы, которые просто не пришли бы в голову при формальном изучении операторов. С таким же успехом можно учить иностранный язык, пользуясь только словарем. Такой подход особенно вреден тем, кто уже знаком с паскалем - увидев общее например в операторе for он будет думать, что в Си все так же как и в паскале - переменная цикла может быть только целой, и меняться только на единицу, и заканчиваться при достижении заданного числового значения. Без примеров использования он просто не догадается о необычайной гибкости языка. Цитата(DpInRock @ Mar 8 2009, 15:52)  Языком Си не пользуюсь, а использую его. Как замену ассемблеру. В таком случае вам сначала не мешало бы выучить тонкости Си, прежде чем давать советы. А то получается как с тем Карузо - фиговый певец, я слышал, мне Рабинович напел.
|
|
|
|
|
Mar 10 2009, 07:10
|
Местный
  
Группа: Участник
Сообщений: 338
Регистрация: 1-02-06
Из: Королев, М.О.
Пользователь №: 13 846

|
Цитата(zltigo @ Mar 9 2009, 13:41)  Нашел где-то в интернете в списках литературы: Код Методические материалы и документация по пакетам прикладных программ [Текст] : научное издание /; Междунар. центр науч. и техн. информации. - М. : МЦНТИ, 1978 - Вып. 67 : Система программирования на языке высокого уровня Си : / Д. М. Субботин, С. О. Бочков. - 1991. - 270 с. Полностью присоединяюсь. По большому счету я изучил язык по 2-м источникам: K&R и указанной книге. Остальные - для изучения разных "рюшечек", присущих конкретным реализациям.
--------------------
-Да как так-то?/-Да как-то так/-Ну так-то да
|
|
|
|
|
Mar 10 2009, 12:34
|
Частый гость
 
Группа: Участник
Сообщений: 120
Регистрация: 16-02-08
Пользователь №: 35 087

|
Цитата(777777 @ Mar 10 2009, 09:34)  ...Учебник полезен тем, что он не только описывает синтаксис операторов, но и их использование, показывает такие способы, которые просто не пришли бы в голову при формальном изучении операторов. С таким же успехом можно учить иностранный язык, пользуясь только словарем...Без примеров использования он просто не догадается о необычайной гибкости языка. Согласен. Мне (думаю и любому другому начинающему) после прочтения K@R хотелось бы посмотреть как делается для микроконтроллеров, с подробными комментариями. Наверняка ведь изучая подобные примеры для микроконтроллеров, возможно встретились бы способы, которые просто не пришли в голову при изучении только K@R. С учетом того что Цитата(zltigo @ Mar 8 2009, 12:36)  ...Только имейте ввиду, что не менее, чем в 95 случаев из 100 это будет исходник уровня "моя первая программа на C"  и скорее "это" может служить учебным пособием как НЕ надо писать. Посему относиться к найденному в интернете надо более, чем критически... и хотелось бы серьезную прикладную книгу по микроконтроллерам на Си с примерами, а не изучать разрозненные примерчики из сети. Книгу по Микроконтроллерам + примеры на Си (так сказать два в одном), но не такую Цитата(zltigo @ Mar 8 2009, 12:36)  ..."Книги по микроконтролерам" это или откровенное дерьмо, или это действительно книги по Микроконтроллерам а не по изучению языков и раcсматривать "примеры" из таких книг следует так-же, как и пример из букваря "Мама мыла раму" - не более... Вот наткнулся на книгу «Richard H. Barnett, et al. Embedded C Programming And The Atmel AVR.» (h**p://www.freebookspot.ws/Comments.aspx?Element_ID=11159). Только книга - переведена на китайский! На английском уже есть и второе издание – но не могу найти. Может кто-нибудь встречал нечто подобное хотя бы на английском?! Цитата(DRUID3 @ Mar 10 2009, 12:22)  Владимир_2010, у одного из посетителей этого форума есть очень замечательный лозунг "Правильный путь один - СВОЙ"  ... Потому меньше тратьте времени на чтение советов с какой книги начать - а больше на "начинание" - изучение собственно C(C++)... Хороший лозунг, но есть и другой: при правильном подборе литературы, даже в сортире можно получить неплохое образование. Надо совмещать два этих подхода.
Сообщение отредактировал Владимир_2010 - Mar 10 2009, 12:35
|
|
|
|
|
Mar 10 2009, 23:39
|

Знающий
   
Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467

|
Цитата(haker_fox @ Mar 9 2009, 22:17)  Вот тут уже обсуждалось такое типичное заблуждение. и де там обсуждается "типичное заблуждение" ? расходы как минимум на конструкторы/деструкторы, виртуальную таблицу, ну и все то, что приносит с собой дженерализейшн. С Торвальдом я согласен в конкретном случае по ссылке, за исключением СТЛ - тут он пургу гонит, хотя он вообще оторвался от народа и пургу часто гонит.
Причина редактирования: Излишнее цитирование.
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
Mar 11 2009, 06:05
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(A. Fig Lee @ Mar 11 2009, 02:39)  и де там обсуждается "типичное заблуждение" ? расходы как минимум на конструкторы/деструкторы, виртуальную таблицу, ну и все то, что приносит с собой дженерализейшн. Никаких лишних расходов там нет, то, что делают конструкторы/деструкторы, нужно делать в сишной программе, но там ты можешь забыть, а в С++ компилятор сделает это автоматически. Если виртуальный функций нет, то и виртуальной таблицы не будет. Опять же, если в сишной программе ты будешь делать что-нибудь наподобие перехода по таблице указателей, то это фактически то же самое с теми же расходами.
|
|
|
|
|
Mar 11 2009, 18:12
|
Местный
  
Группа: Свой
Сообщений: 381
Регистрация: 27-07-08
Из: теплые края
Пользователь №: 39 233

|
Цитата(A. Fig Lee @ Mar 11 2009, 01:39)  расходы как минимум на конструкторы/деструкторы, виртуальную таблицу, ну и все то, что приносит с собой дженерализейшн. У Страуструпа есть весьма интересная книжка - "Дизайн и эволюция языка С++". Не читали? Рекомендую. Одна из ключевых идей книги - "вы не платите за то, что не используете". Не используете виртуальные функции - не будет никакой таблицы. Не инициализируете члены класса - не будет никаких лишних конструкторов (default ctor, инициализирующий члены default значениями, нормальный компилятор успешно соптимизирует).
|
|
|
|
|
Mar 11 2009, 20:33
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(vik0 @ Mar 11 2009, 21:12)  У Страуструпа есть весьма интересная книжка - "Дизайн и эволюция языка С++". Не читали? Рекомендую. Одна из ключевых идей книги - "вы не платите за то, что не используете". Очень правильная "в принципе" идея, только в реальности С++ слегка провоцирует на дополнительные накладные расходы, предоставляя взамен кучу не всегда нужных фич. А вот людей которые могут не купиться на эти ненужные вещи не так уж и много...
|
|
|
|
|
Mar 11 2009, 21:20
|
Местный
  
Группа: Свой
Сообщений: 381
Регистрация: 27-07-08
Из: теплые края
Пользователь №: 39 233

|
Цитата(singlskv @ Mar 11 2009, 22:33)  Очень правильная "в принципе" идея, только в реальности С++ слегка провоцирует на дополнительные накладные расходы, предоставляя взамен кучу не всегда нужных фич. А вот людей которые могут не купиться на эти ненужные вещи не так уж и много... Согласен. Все упирается в поиск баланса - чем вы готовы пожертвовать ради упрощения процесса разработки. Правда это подразумевает неплохое (как минимум) знание языка. С++ - сложный инструмент. А для эффективного использования любого сложного инструмента необходимо его хорошее знание и понимание.
|
|
|
|
|
Mar 12 2009, 01:39
|

Знающий
   
Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467

|
Цитата(haker_fox @ Mar 11 2009, 05:32)  Еще раз повторюсь: даже если небольшой оверхед и есть, это мне не помешало поместить в ATmega16 ОСь + прикладную программу. Все на Си++. Сейчас занимаюсь реалтаймовским приложением. Тоже на Си++, без ОСи (она там просто не нужна). Для ATmega168. Я в свое время также и про Си считал. Только на ассемблере работал. Пока не попробывал. Удобств было... словами не описать. Верю. И в Запорожец можно человек 7 натолкать. Вопрос - еффективно ли ето? Скажите пожалуйста, что вас побудило использовать C++ a не C, и какие его особеености Вы использовали( try/catch, templates, STL, (design patterns maybe), virtual functions, operator overloading, .. etc) Интересно будет послушать. Цитата(vik0 @ Mar 11 2009, 14:12)  У Страуструпа есть весьма интересная книжка - "Дизайн и эволюция языка С++". Не читали? Рекомендую. Одна из ключевых идей книги - "вы не платите за то, что не используете". Не используете виртуальные функции - не будет никакой таблицы. Не инициализируете члены класса - не будет никаких лишних конструкторов (default ctor, инициализирующий члены default значениями, нормальный компилятор успешно соптимизирует). Нет не читал. Не читаю на русском техническую литературу. подозреваю, что ето "The Annotated C++ Reference Manual".. Лежит на работе. Почитываю иногда главки. все вместе нет смысла читать. Надо будет домой забрать, пока не украли. А че там? По сути - если мы все выбросим - ето будет C, только написанный в формате C++. Собственно тут 2 вопроса - почему хорош C++ и почему он плох с мелкими микроконтроллерами.. 1. С появлением C++ стало легче разрабатывать большие проекты - можно все разбить на обьекты, менять их, легко видна структура программы, и т.д. 2. Почему он плох для мелкоконтроллеров: он скрывает связь с ресурсами - например внутри конструктора может быть другой new, что сразу не очевидно. Операторы могут быть переопределены, и так далее.. Не очень прозрачен. Деструкторы - надо помнить что при выходе из скопа вызывается деструктор и т.д. Не, я по жизни и на работе в основном на C++ программирую, но когда дома на мелкоконтроллерах - лучше С
--------------------
Верить нельзя никому, даже себе. Мне - можно.
|
|
|
|
|
Mar 12 2009, 15:47
|

Познающий...
     
Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125

|
Цитата(A. Fig Lee @ Mar 12 2009, 09:39)  Верю. И в Запорожец можно человек 7 натолкать. Вопрос - еффективно ли ето? В запорожце сколько сидячих мест? 4? Ну так зачем же туда 7 пихать? В ATmega16 сколько памяти программ? 16Кб? Ну так если мое приложение + ОСь (на Си++) занимают 8 Кб памяти программ и 500 байт ОЗУ (используются буфера, много переменных), то кто мешает мне программировать на Си++? Я же не пытаюсь запихать туда более 16 Кб. Цитата(A. Fig Lee @ Mar 12 2009, 09:39)  Скажите пожалуйста, что вас побудило использовать C++ a не C, и какие его особеености Вы использовали( try/catch, templates, STL, (design patterns maybe), virtual functions, operator overloading, .. etc) Интересно будет послушать. Использовать Си++ меня побудила ОС scmRTOS. Увидев, что он успешно применяется для микроконтроллеров подобного класса, я решил что буду его применять в своей работе. Какие особенности использовал? Так я же ссылку давал, там все есть. Ну вот, хотябы это: http://electronix.ru/forum/index.php?s=&am...st&p=548053http://electronix.ru/forum/index.php?s=&am...st&p=548100http://electronix.ru/forum/index.php?s=&am...st&p=548240В последнем проекте активно использую наследование. Т.е. когда один класс наследуется другим. Очень удобно. Цитата(A. Fig Lee @ Mar 12 2009, 09:39)  2. Почему он плох для мелкоконтроллеров: он скрывает связь с ресурсами - например внутри конструктора может быть другой new, что сразу не очевидно. Чем это плохо и почему только для МК? На обычном IBM PC оперативы немеренно и бездумное использование new приветствуется, подумаешь пропадет пара сотен МБ? Цитата(A. Fig Lee @ Mar 12 2009, 09:39)  Операторы могут быть переопределены, и так далее.. Опять же, чем это плохо именно для МК? Цитата(A. Fig Lee @ Mar 12 2009, 09:39)  Не очень прозрачен. Ну вот  Цитата(A. Fig Lee @ Mar 12 2009, 09:39)  Деструкторы - надо помнить что при выходе из скопа вызывается деструктор и т.д. Ага, а еще надо помнить, что при создании объекта вызваются конструкторы и при вызове обработчика прерывания нужно сохранять SREG  Конструктор и деструктор можно не определять в классе, тогда ничего вызваться не будет. Деструктор, как правило вообще редко применяется (ИМХО). А вот конструктор - это сплошная выгода. Создаешь объект и не заботишься о вызове функции на подобии Init(), конструктор все сам сделает. Чем плохо? Или вручную, или автоматом. Ну елки-палки, это же неубедительно звучит. Чем это снова плохо именно для МК? Цитата(A. Fig Lee @ Mar 12 2009, 09:39)  Не, я по жизни и на работе в основном на C++ программирую, Для ПК? Цитата(A. Fig Lee @ Mar 12 2009, 09:39)  но когда дома на мелкоконтроллерах - лучше С А почему не АСМ, ведь на нем более оптимально можно написать? Си не очень прозрачен, добавляет свои навороты, оптимизацию, решает за программиста, где и что разместить  АСМ в этом плане гораздо лучше! В общем это юмор. А если серьезно, Вы попробуйте Си++ на МК. Глядишь, и сомнения пропадут, зато получите мощный инструмент на 8 битной платформе. Ну и на последок: конечно, голову никто не отменял. Укладывать все возможности Си++ на AVR никто не собирается, но некоторые возможности почему бы не использовать?
--------------------
Выбор.
|
|
|
|
|
Mar 12 2009, 19:53
|
Местный
  
Группа: Свой
Сообщений: 381
Регистрация: 27-07-08
Из: теплые края
Пользователь №: 39 233

|
Цитата(A. Fig Lee @ Mar 12 2009, 03:39)  Нет не читал. Не читаю на русском техническую литературу. подозреваю, что ето "The Annotated C++ Reference Manual".. Нет, я говорю о The Design and Evolution of C++Цитата А че там? История развития языка с подробным описанием того, почему основные функции реализованы именно так, а не иначе. Цитата он скрывает связь с ресурсами - например внутри конструктора может быть другой new что сразу не очевидно. Ага. А на чистом "С" внутри функции типа InitSomething() не может быть вызвана InitSomethingElse() и, даже (о ужас!!), malloc??... Цитата Операторы могут быть переопределены... Ну и отлично! Лично я предпочту написать: Код complex a, b, c, d; .... a += b - c*d; а не: Код a = complex_add(a, complex_sub(b, complex_mul(c, d))); ...и получить на выходе тот же самый код. Цитата Деструкторы - надо помнить что при выходе из скопа вызывается деструктор и т.д. Ну и отлично! Лично я предпочту написать: Код int DoSomething() { CriticalSection cs; ...bla-bla-bla... if (foo) return 1; ...bla-bla-bla... if (bar) return 2; ...bla-bla-bla... if (baz) return 3; ...bla-bla-bla... return 0; } а не: Код int DoSomething() { DisableInterrupts(); ...bla-bla-bla... if (foo) { RestoreInterrupts(); return 1; } ...bla-bla-bla... if (bar) { RestoreInterrupts(); return 2; } ...bla-bla-bla... if (baz) { RestoreInterrupts(); return 3; } ...bla-bla-bla... RestoreInterrupts(); return 0; } ...и получить на выходе (извините за самоцитирование  ) тот же самый код. Цитата(haker_fox @ Mar 12 2009, 17:47)  Ну и на последок: конечно, голову никто не отменял. Укладывать все возможности Си++ на AVR никто не собирается, но некоторые возможности почему бы не использовать? +100
|
|
|
|
|
Mar 13 2009, 07:05
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(A. Fig Lee @ Mar 12 2009, 04:39)  Деструкторы - надо помнить что при выходе из скопа вызывается деструктор и т.д. Как раз наоборот. Когда ты пишешь на Си, то надо помнить, что всю память, которую ты выделяешь, после использования надо освободить. А в С++ (если, конечно, классы спроектированы правильно) память выделяется в конструкторе, а в деструкторе автматически освобождается. Так же с любой другой инициализацией/освбождением. Главное - правильно споектировать класс чтобы он точно отражал суть описываемого объекта. Так что никакого оверхеда в С++ нет - все что он делает, нужно делать и в Си, но там это должен далеть сам программист вручную и ни о чем не забыть, а в С++ это сделается автоматически.
|
|
|
|
|
Mar 13 2009, 07:16
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата(vik0 @ Mar 12 2009, 21:53)  Ну и отлично! Лично я предпочту написать: Код ... а не: Код ... ...и получить на выходе (извините за самоцитирование  ) тот же самый код. Вы просто не умеете готовить plain C: Код int DoSomething() { UREG result=0; ATOMIC_BLOCK(_нужный_режим_) { ...bla-bla-bla... if (foo) { result=1;continue; } ...bla-bla-bla... if (bar) { result=2;continue; } ...bla-bla-bla... if (baz) { result=3;continue; } } return result; } Как видите, все намного проще  ЗЫ: ATOMIC_BLOCK можно покурить в инклудах гнуся. Кстати, в гнусе можно и прямо return 1 делать в ветках. Но я не сторонник пользовать гнутые фичи.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Mar 13 2009, 07:41
|
Местный
  
Группа: Свой
Сообщений: 381
Регистрация: 27-07-08
Из: теплые края
Пользователь №: 39 233

|
Цитата(Rst7 @ Mar 13 2009, 09:16)  Вы просто не умеете готовить plain C: Умею. Но просто мне больше по вкусу С++  Цитата Код ... Как видите, все намного проще  Согласен. Я и не утверждал что это нельзя сделать на С. Просто (лично мне) С++ вариант кажется более изящным, что ли. А оверхеда (о чем, собственно, изначально и шла речь) он не вносит.
|
|
|
|
|
Mar 13 2009, 07:53
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата непереносимые расшинения гнуся? Дабы закрыть вопрос про переносимость. Вот такое я нынче в EWAVR пользую: Код #pragma inline=forced UREG __get_state_and_cli(void) { UREG v=__save_interrupt(); __disable_interrupt(); return v; }
#define ATOMIC_BLOCK() for(UREG __iter=0,__state=__get_state_and_cli();!__iter;__restore_interrupt(__state),__iter++)
void TestAtomic(void) { ATOMIC_BLOCK() { OSCCAL++; } } Цитата(vik0 @ Mar 13 2009, 09:41)  Умею. Вы выбрали плохой пример для демонстрации превосходства плюсов в количестве писанины. Что заставляет усомниться в умении
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Mar 13 2009, 08:20
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(_Pasha @ Mar 13 2009, 11:15)  Кстати, а в ИАРе return внутри for() как себя чувствует? А что с ним может стать? Но вообще это дурной стиль. лучше break;
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Mar 13 2009, 08:50
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(Rst7 @ Mar 13 2009, 12:33)  Можно из такого блока выходить чем угодно... хоть goto (не уверен) Проверил - можно.  Текст для проверки: Код volatile int ff;
int main (void) __attribute__((OS_main));
int main (void) { ATOMIC_BLOCK(ATOMIC_RESTORESTATE) { DDRB = 1; if(ff) goto aaa; PORTB=1; } ff += 41*DDRB; aaa: for(uint8_t j=0; j<3;j++) { ff += pgm_read_byte(&(BCD[j])); }
return 0; } Листинг CODE 00000070 <main>:
int main (void) __attribute__((OS_main));
int main (void) { ATOMIC_BLOCK(ATOMIC_RESTORESTATE) 70: 2f b7 in r18, 0x3f ; 63 return 1; }
static __inline__ uint8_t __iCliRetVal(void) { cli(); 72: f8 94 cli { DDRB = 1; 74: 31 e0 ldi r19, 0x01 ; 1 76: 34 b9 out 0x04, r19 ; 4 if(ff) goto aaa; 78: 80 91 08 01 lds r24, 0x0108 7c: 90 91 09 01 lds r25, 0x0109 80: 89 2b or r24, r25 82: 09 f0 breq .+2 ; 0x86 <main+0x16> 84: 39 c0 rjmp .+114 ; 0xf8 <main+0x88> PORTB=1; 86: 35 b9 out 0x05, r19 ; 5 (void)__s; }
static __inline__ void __iRestore(const uint8_t *__s) { SREG = *__s; 88: 2f bf out 0x3f, r18 ; 63 } ff += 41*DDRB; 8a: 80 91 08 01 lds r24, 0x0108 8e: 90 91 09 01 lds r25, 0x0109 92: 24 b1 in r18, 0x04 ; 4 94: 49 e2 ldi r20, 0x29 ; 41 96: 24 9f mul r18, r20 98: 90 01 movw r18, r0 9a: 11 24 eor r1, r1 9c: 28 0f add r18, r24 9e: 39 1f adc r19, r25 a0: 30 93 09 01 sts 0x0109, r19 a4: 20 93 08 01 sts 0x0108, r18 aaa: for(uint8_t j=0; j<3;j++) { ff += pgm_read_byte(&(BCD[j])); a8: 80 91 08 01 lds r24, 0x0108 ac: 90 91 09 01 lds r25, 0x0109 b0: e4 e3 ldi r30, 0x34 ; 52 b2: f0 e0 ldi r31, 0x00 ; 0 b4: 24 91 lpm r18, Z+ b6: 82 0f add r24, r18 b8: 91 1d adc r25, r1 ba: 90 93 09 01 sts 0x0109, r25 be: 80 93 08 01 sts 0x0108, r24 c2: 80 91 08 01 lds r24, 0x0108 c6: 90 91 09 01 lds r25, 0x0109 ca: 31 96 adiw r30, 0x01 ; 1 cc: 24 91 lpm r18, Z+ ce: 82 0f add r24, r18 d0: 91 1d adc r25, r1 d2: 90 93 09 01 sts 0x0109, r25 d6: 80 93 08 01 sts 0x0108, r24 da: 80 91 08 01 lds r24, 0x0108 de: 90 91 09 01 lds r25, 0x0109 e2: 31 96 adiw r30, 0x01 ; 1 e4: e4 91 lpm r30, Z+ e6: 8e 0f add r24, r30 e8: 91 1d adc r25, r1 ea: 90 93 09 01 sts 0x0109, r25 ee: 80 93 08 01 sts 0x0108, r24 }
return 0; } f2: 80 e0 ldi r24, 0x00 ; 0 f4: 90 e0 ldi r25, 0x00 ; 0 f6: 08 95 ret f8: 2f bf out 0x3f, r18 ; 63 __asm__ volatile ("" ::: "memory"); fa: d6 cf rjmp .-84 ; 0xa8 <main+0x38>
|
|
|
|
|
Oct 25 2009, 11:57
|
Группа: Участник
Сообщений: 8
Регистрация: 11-10-09
Пользователь №: 52 859

|
Посоветуйте книжку для НАЧИНАЮЩЕГО(чайника)  по Си-программированию для микроконтроллеров. Можно на английском или немецком. Самое главное, чтобы матерьял объснялся хорошо. Зарание всех благодарю за помощь
Сообщение отредактировал Kirill24 - Oct 25 2009, 12:03
|
|
|
|
|
Oct 25 2009, 14:17
|

Местный
  
Группа: Участник
Сообщений: 249
Регистрация: 31-10-05
Из: Украина Нетешин
Пользователь №: 10 344

|
Шпак Ю.А. Программирование на языке С для AVR и PIC микроконтроллеров. МК-Пресс, Киев, 2006, 400стр. ил. Часть 1Часть 2Ссылка отсюдаНеполохой help по avr-libcЭто все для среды WINAVR если речь идет про AVR. Вообще WINAVR посложнее будет чем к примеру CV, но в нем меньше закрытости кода что ли, за счет меньшего количества готовых функций. Отсюда большая гибкость но это уже совсем другой вопрос. Удачи в освоении
Сообщение отредактировал chief_olimp - Oct 25 2009, 14:22
|
|
|
|
|
Oct 25 2009, 18:11
|
Местный
  
Группа: Свой
Сообщений: 466
Регистрация: 21-06-05
Пользователь №: 6 205

|
Цитата Си-программированию для микроконтроллеров Программирование на С для МК ничем принципиально не отличается от программирования для больших ПК. Мне очень понравился Герберт Шилдт "Полный справочник по С". Цитата Можно на английском или немецком. Книги ищите в торрентах. Например поищите здесь по запросу embedded.
|
|
|
|
|
Oct 25 2009, 21:23
|
Частый гость
 
Группа: Участник
Сообщений: 149
Регистрация: 2-06-08
Из: Москва
Пользователь №: 38 003

|
Цитата(Kirill24 @ Oct 25 2009, 14:57)  Посоветуйте ... Как начинающий посоветую Кернигана и Ричи - учиться можно на ПК, а параллельно программить для МК, читая доки к выбранному компилятору.
|
|
|
|
|
Nov 9 2009, 11:41
|
Участник

Группа: Участник
Сообщений: 23
Регистрация: 22-10-09
Пользователь №: 53 141

|
У меня такой вопрос: к примеру есть функция с такой конструкцией: Код какие-то действия if( условие ) { *** } else { *** } В одной ветке мне нужна для работы локальная переменная, к примеру count, а для другого не нужно. Как лучше обьявлять эту переменную? Вот так: Код какие-то действия if( условие ) { uint32_t count; *** } else { *** } млм же предпочительнее все-таки так: Код uint32_t count; какие-то действия if( условие ) { *** (тут count используется) } else { *** (тут count не используется) } Спасибо.
Сообщение отредактировал arm123 - Nov 9 2009, 11:42
|
|
|
|
|
Nov 9 2009, 14:05
|
Участник

Группа: Участник
Сообщений: 23
Регистрация: 22-10-09
Пользователь №: 53 141

|
Я пользуюсь компилятором IAR. Сдесь вроде поддерживает  раз уж локально можно обьявлять где угодно
|
|
|
|
|
Nov 9 2009, 14:34
|

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

|
Цитата(WHALE @ Nov 9 2009, 15:02)  Дык в топике вроде речь идет о С? И если компилятор не поддерживает С99,то тогда без вариантов.. В начале блока { } можно объявлять хоть в до-ансишном K&R, у которого ещё прототипов функций не было, так что в данном случае именно Код if( условие ) { uint32_t count; *** } else { *** } или, к примеру, так Код switch( aaa ) { case bbb: { uint32_t count; *** } break; case ccc: { float sum; *** } break; } и это должен нормально отработать любой компилятор.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Nov 9 2009, 14:37
|
Участник

Группа: Участник
Сообщений: 23
Регистрация: 22-10-09
Пользователь №: 53 141

|
С точки зрения быстродействия все таки да мне кажется переменные нужно объявлять как можно локальнее... к примеру тогда максимальное число переменных будут загружаться через регистры а не через память. Прав я или нет? В чем ещё преимущества объявления переменных как можно локальнее.
Сообщение отредактировал arm123 - Nov 9 2009, 15:05
|
|
|
|
|
Nov 9 2009, 15:52
|
Участник

Группа: Участник
Сообщений: 23
Регистрация: 22-10-09
Пользователь №: 53 141

|
Цитата(sergeeff @ Nov 9 2009, 18:30)  Я привел ссылку на конкретную книгу где все по пунктам расписано. Наверное не сложно эту книгу найти и прочесть. Там анализ идет в первую очередь касательно удобочитаемости и большей вероятностью ошибится нежели вопрос оптимизации и быстродействия.
|
|
|
|
|
Nov 9 2009, 16:05
|
Местный
  
Группа: Свой
Сообщений: 466
Регистрация: 21-06-05
Пользователь №: 6 205

|
Не забудьте инициализировать переменную, т.е. должно быть как-то так Код какие-то действия if (условие) { uint32_t count = SOME_VALUE; // какое-то нужно Вам значение *** } else { *** } У Вас тут ошибки не закралось? Я хочу сказать, что за переделами if(){} не будет существовать такой переменной как count или будет использована переменная из глобальной области видимости. Как дальше по тексту будет использоваться переменная count?
|
|
|
|
|
Nov 9 2009, 19:41
|
Участник

Группа: Участник
Сообщений: 23
Регистрация: 22-10-09
Пользователь №: 53 141

|
Цитата(kurtis @ Nov 9 2009, 20:05)  У Вас тут ошибки не закралось? Я хочу сказать, что за переделами if(){} не будет существовать такой переменной как count или будет использована переменная из глобальной области видимости. Как дальше по тексту будет использоваться переменная count? ну если быть точным то ситуация такая Код uint32_t count; какие-то действия if( условие ) { *** (тут count используется) } else { *** (тут count не используется) } *** (тут count не используется) Ну я для себя ответ понял, переменные нужно делать максимально локальнее, за исключением циклов
|
|
|
|
|
Nov 13 2009, 15:13
|

Местный
  
Группа: Свой
Сообщений: 268
Регистрация: 4-11-05
Пользователь №: 10 470

|
Добрый день! или не день =) ... Влеплю сюда вопрос по Си++. Не пойму как реализовать следующую идею: Заводим класс клавиатуры, в котором описан метод(процедура) опроса клавиатуры, которая обновляет находящуюся в этом-же классе переменную - битовую маску нажатых клавиш. (сколько клавиш-столько бит) Код class MtxKeypad { private: volatile KeyMapType NewKeyMap; // считываемая в данный момент карта клавиш public: volatile KeyMapType KeyMap; // последняя считанная карта клавиш
// typedef Mtx_Button<1,1> Key_1; // !! эти строки относятся к вопросу сабжа // typedef Mtx_Button<1,2> Key_2; // тут объявляются все кнопки и их расположение (строка,столбец) // typedef Mtx_Button<2,1> Key_Enter; // typedef Mtx_Button<4,1> Key_Cancel;
void Scan() { // метод опроса клавиатуры // .... KeyMap=NewKeyMap; // .... } }; далее заводим шаблон класса отдельной кнопки, который умеет сообщать, нажата эта кнопка или нет: Код template <int Col, int Row> class Mtx_Button : public MtxKeypad { //friend class MtxKeypad; // это вот ХЗ надо тут или нет private: static const KeyMapType mask=(1UL<<(Row*5+Col)); public: inline uint8_t Pressed() {return (MtxKeypad::KeyMap & mask)!=0;} }; И нужно использовать потом так: Код int main() { MtxKeypad Keys; Mtx_Button<4,1> Key_A; for(;;) { Keys.Scan(); if(MtxKeypad::Key_1::Pressed()) pin2.Toggle(); // ошибка if(Key_A.Pressed()) pin2.Toggle(); // работает если добавить Key_A.Scan(); но тут отдельный объект с отдельными переменными - неправильно } } Так вот ВНИМАНИЕ ВОПРОС: как правильно описать классы, если мне надо чтоб дочерние объекты не копировали родительский метод и переменные, а пользовались ими, влияли на них.
|
|
|
|
|
Nov 13 2009, 22:34
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Наследовать кнопку от клавиатуры - это, имхо, перебор  Достаточно хранить в кнопке ссылку на клавиатуру. Типа так: Код // шаблон кнопки template<int row, int col, typename matrix> class button { private: matrix& m_; // ссылка на клавиатуру public: button(matrix& M): m_(M) {} bool pressed() { return m_.keymap & (row*5+col); } };
// класс клавиатуры class kbd { public: button<0, 0, kbd> Enter(this); void Scan(); }
void main() { kbd Kbd; Kbd.Scan(); if (Kbd.Enter.presed()) { } }
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Nov 15 2009, 18:14
|

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

|
Цитата(Waso @ Nov 15 2009, 12:34)  Если даже в классе кнопки ссылку обьявить как константу и задавать в конструкторе, компилятор всеравно ее пихает в ОЗУ..  А что ему еще делать? Если клавиатура одна - делайте ее члены и функции-члены статическими в базовом классе. Если клавиатур у вас несколько - кнопка должна знать, к какой имеено обращаться. Значит, ей нужна переменная для хранения указателя или ссылки. Даже если этот указатель компилятор расположит во флеше (и таких указателей несколько, ведь клавиатур тоже несколько) - ему надо как-то эти указатели различать, значит он вынужден будет хранить в кнопке какие-то данные, позволяющие выбрать нужный указатель.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Nov 17 2009, 22:33
|
Местный
  
Группа: Свой
Сообщений: 466
Регистрация: 21-06-05
Пользователь №: 6 205

|
Встретил в исходниках такую вот конструкцию Код #define putnstr(str,n) do { \ printf ("%.*s", n, str); \ } while (0) Почему использован цикл do-while ведь все-равно printf() один раз будет вызвано, как с ним, так и без него?
|
|
|
|
|
Nov 18 2009, 07:39
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(kurtis @ Nov 18 2009, 01:33)  Встретил в исходниках такую вот конструкцию Код #define putnstr(str,n) do { \ printf ("%.*s", n, str); \ } while (0) Почему использован цикл do-while ведь все-равно printf() один раз будет вызвано, как с ним, так и без него? Такая конструкция применяется если в теле макроса более одной операции (в данном случае эта конструкция излишняя). Пример: Код #define func(a) do { aa(a); bb(a); } while(0) #define func2(a) { aa(a); bb(a); }
if (some) func(a); else blablabla(a); // Ok if (some) func2(a); else blablabla(a); // Syntax error
|
|
|
|
|
Nov 18 2009, 14:51
|

Начинающий профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648

|
Код do { aa(a); bb(a); } while(0) Уже обсуждалось, поиск в помощь, сообщение от Сергея Борща было.
--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
|
|
|
|
|
Nov 18 2009, 15:45
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(Herz @ Nov 18 2009, 17:39)  Разве? Почему? Код if (1) { }; else { } потому что - Syntax error near 'else'. ";" после закрывющей скобки это уже второй оператор (пустой оператор), а else получается как сам по себе. верхнее равносильно такому: Код if(1) { foo1(); } foo2(); else { }
|
|
|
|
|
Nov 19 2009, 07:52
|
Гуру
     
Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847

|
Цитата(Herz @ Nov 18 2009, 23:26)  Хм, ну так не ставить его и всё.  Оно, может, на читабельность как-то повлияет... По-моему, даже положительно. Понятно станет, что макрос. Понятно станет, если БУДЕТ известно, что макрос. А если нет, то понятно станет, что ';' забыли поставить
|
|
|
|
|
Nov 19 2009, 20:47
|
Частый гость
 
Группа: Участник
Сообщений: 92
Регистрация: 23-12-08
Из: Кишинёв
Пользователь №: 42 680

|
Цитата(Сергей Борщ @ Nov 19 2009, 11:38)  Потом по каким-то причинам вы захотите заменить макрос на честную функцию и будете перелопачивать всю программу... А почему сразу функции не писать? В смысле бывают ситуации когда без них не обойтись? ("инлайнизация" не в счёт, т.к. обычно легко решается этот вопрос).
|
|
|
|
|
Nov 19 2009, 23:53
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(baralgin @ Nov 19 2009, 22:47)  В смысле бывают ситуации когда без них не обойтись? Даже когда включена максимальная оптимизация и inline функция действительно инлайнится, все равно на практике встречаются ситуации когда макросы дают более эффективный код. Бывают еще такие ситуации: file1.h: Код #include "file2.h"
typedef struct { ... .. . some_file2_enum_type field_n; .. } some_complex_struct_t; А в file2.h ну очень хочется объявить функцию которая работает с field_n из file1.h, а подключить file1 низя. Макрос спасает. Или вот конкретная ситуация, хотим чтобы string литерал не занимал RAM впустую.
|
|
|
|
|
Nov 20 2009, 10:02
|
Частый гость
 
Группа: Участник
Сообщений: 92
Регистрация: 23-12-08
Из: Кишинёв
Пользователь №: 42 680

|
Цитата(defunct @ Nov 20 2009, 01:53)  Даже когда включена максимальная оптимизация и inline функция действительно инлайнится, все равно на практике встречаются ситуации когда макросы дают более эффективный код. Только что столкнулся как раз с таким. Keil (-O3, Otime ) отказался инлайнить очевидную функцию(static), даже __INLINE в этом случае не воспринял  , хотя в других местах за ним такого не замечал(постоянно слежу за получаемым кодом). Видимо решил сэкономить, т.к. подряд 10 "вызовов". В итоге "макросный" вариант выполняется в два раза быстрее... В предложенном первом примере, нельзя разве в функцию передать указатель(или ссылку) на поле? Хотя как поведет себя компилятор в таком случае конечно же вопрос, да и не очень эстетично выходит в целом. Примерно понятно в общем.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|