Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопрос по С++
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Страницы: 1, 2, 3
sasamy
Цитата(neiver @ Dec 25 2011, 11:43) *
Я покажу вариант на шаблонах, вариант на препроцессоре остаётся за вами - покажите как с помощью этого мощнейшего инструмента кодогенерации решить такую тривиальнейшую задачу, как N раз повторить кусок кода.


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

rep_example.c

Код
#include "rep.h"

#define REPN(s, N) REP##N(s)
#define EXPR_REP asm volatile("nop");

REPN(EXPR_REP, 10)


Цитата
sasa@sasa-laptop:~/tst$ ./rep.sh 100 && cpp rep_example.c
# 1 "rep_example.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "rep_example.c"
# 1 "rep.h" 1
# 2 "rep_example.c" 2





asm volatile("nop"); asm volatile("nop"); asm volatile("nop"); asm volatile("nop"); asm volatile("nop"); asm volatile("nop"); asm volatile("nop"); asm volatile("nop"); asm volatile("nop"); asm volatile("nop");


rep.sh

Код
#!/bin/bash

echo "#define REP0(s) " > rep.h
echo "#define REP1(s) s" >> rep.h

for N in $(seq 1 $[$1 -1])
do
    echo "#define REP$[N+1](s) s REP$N(s)" >> rep.h
done


То что сгенерировалось в rep.h

Код
#define REP2(s) s s
#define REP3(s) s REP2(s)
#define REP4(s) s REP3(s)
#define REP5(s) s REP4(s)
#define REP6(s) s REP5(s)
#define REP7(s) s REP6(s)
#define REP8(s) s REP7(s)
#define REP9(s) s REP8(s)
#define REP10(s) s REP9(s)
#define REP11(s) s REP10(s)
#define REP12(s) s REP11(s)
#define REP13(s) s REP12(s)
#define REP14(s) s REP13(s)

..........
полностью думаю все 100 строк нет смысла писать
Прохожий
Цитата(dxp @ Dec 25 2011, 08:58) *
Ну, тогда вы, используя тот же С, тоже прячетесь от проблем, абстрагируетесь от них. Давайте на асме - вот там будет полный набор ничем не прикрытых проблем.

Когда сильно припекает - можно и на АСМ-е. sm.gif
Но это бывает крайне редко. Практически никогда.
А мне приходилось в юности и на PDP-11 в кодах...
Но я никогда не провел бы прямой аналогии:
код->Асм->С->С++.
Пмсм, это выглядит вот так:
код
|
Асм->С
|
С++.
Цитата(dxp @ Dec 25 2011, 08:58) *
Оно не прячется, а убирается с глаз долой, т.к. в месте использования совершенно не нужно и только мешает. Представьте себе, что вам по вашему подходу сделали автомобиль, чтобы...

У меня нет автомобиля. Управлять я им не умею. Но аналогия понятна.
И отражает она лишь исключительно Ваш жизненный и профессиональный опыт.
Хоть мне и трудно - продолжу про автомобиль.
Автоматическая коробка передач. По Вашей методологии на всех автомобилях должна быть только такая.
Но это далеко не так. Даже на пафосных дорогих автомобилях есть оба варианта.
Почему?
Цитата(dxp @ Dec 25 2011, 08:58) *
Кстати, ваши любимые ПЛК - ярчайший пример подхода, который вы критикуете. .... Та самая инкапсуляция и абстракция.

Для начала - вовсе не критикую.
Подход как подход. Годится для большого количества программистов
В определенных ситуациях незаменим.
Сам пользуюсь на верхнем уровне при изготовлении HMI.
Но у него есть свои недостатки.
И не везде он годится.
Возвращаясь к Вашему примеру про ПЛК.
Все, что Вы описали - естественный процесс.
А то, что Вы делаете руками - искусство.
И повторить реальность - не выйдет.
Цитата(dxp @ Dec 25 2011, 08:58) *
Конечно. Я ведь в прошлый раз так и написал, что нужно очень чётко знать предметную область. Приведённый пример был, исходя из одного подхода. Если у вас другой, то и реализация тоже будет другой. Но общность подхода это не меняет - есть вполне чётко выделенный этап проектирования, который поддержан средствами языка, и это есть хорошо. Нужно только научиться этим пользоваться.

Соглашусь - инструментами надо владеть.
Но и плодить лишние псевдосущности в виде не всегда нужных классов тоже не имеет смысла.
Цитата(dxp @ Dec 25 2011, 08:58) *
Только сложность программ для микропроцессоров и для ПЛК несоизмерима. И сделано это намеренно - программирование ПЛК должно быть как можно более простым, т.к. рассчитано на менее подготовленных в программировании людей, основной упор в знаниях которых сделан на предметную область, в которой они работают. Именно это обстоятельство и породило ПЛК как класс.

Беда в том, что я плотно знаком со всеми подходами.
Техническая сложность программирования ПЛК несоизмеримо Выше, чем МК.
Особенно, когда код состоит из сотен тысяч строк на один ПЛК.
А таких ПЛК в системе далеко не один.
И все это связано сетью.
Плюс к этому - верхний уровень и HMI глобального и локального уровня.
Цитата(dxp @ Dec 25 2011, 08:58) *
Вы сравниваете несравнимые вещи - уровень проектирования ПЛК и уровень разработки этих ПЛК. Моему сыну на прошлый день рождения подарили электронный конструктор, пацан 8 лет влёт собирает разные схемы (миллионы строк... сотни схем) с генераторами, датчиками (звука, освещённости), в короткий сроки и без особых проблем, совершенно не разбираясь в электронике. Потому что, кто-то позаботился о том, чтобы спроектировать как собственно эти строительные кубики, так и методологию их использования.

Ну Вы же далеко не сноб.
Зачем же принижать квалификацию профессионалов в той области, с которой Вы сталкиваетесь крайне редко?
То, что Вы изложили - дилетантизм, простите за резкость.
Я не буду ничего объяснять в этой ветке, поскольку она не о ПЛК.
Если кому интересно - могу изложить отдельно.
Цитата(dxp @ Dec 25 2011, 08:58) *
Точно так же как и в ПЛК. Но вот если спуститься с уровня использования ПЛК на уровень их проектирования, то в полной рост полезут протоколы обмена, работа с низкоуровневыми данными, многозадачность и т.д. и т.п. И средства программирования там совершенно иные. И уровень подготовки программистов требуется тоже совершенно иной.

Это отдельная тема.
Только скажу одно - спроектировать ПЛК может любой выпускник ВУЗ-а. Для этого ничего не надо, кроме небольшого набора знаний, которые у него есть.
А вот сделать проект средней по сложности линии - вряд ли.
И это не голословное утверждение. Это многократно проверено на практике.
XVR
Цитата(sasamy @ Dec 25 2011, 14:37) *
Препроцессор С Тьюринг-неполный и только средствами препроцессора циклы и прочее задача нетривиальная (если вообще разрешимая). Но вот какая штука - UNIX написана программистами для программистов и тут это сделать элементарно.
Угу, вместо 3 строк на С++ отдельный хидер и скрипт-генератор (для С). Да здравствует С и Unix! cranky.gif

Кстати, ваш пример с 10 nop'ами можно даже в С сделать компактно и без генератора:
Код
#define R2(n) n; n
#define R4(n) R2(n); R2(n)
#define R8(n) R4(n); R4(n)

R8(asm volatile("nop")); R2(asm volatile("nop"))


Я не утверждаю, что в С++ препроцессор не нужен (я и сам его часто использую), я утверждаю, что в С++ очень часто (но не всегда!) без него можно обойтись.

PS. Что касается Линуса Торвальдса, то лично я с ним не знаком, но я знаком с его высказыванием на тему С++ (см например тут). Так же есть проект по написанию драйверов на С++ ( MOOL). Я не уверен, что Линус знает С++ в тонкостях, но если вам очень хочется это узнать, я могу у него спросить.

Что касается моих познаний в Linux'е, то я думаю, что загружаемый драйвер (в С и С++ версиях), который я написал, дает некоторую уверенность, что я немного в кернеле разбираюсь sm.gif Очень древняя его С версия лежит тут

PPS. Зарекался я вам что либо писать, но не удержался ...


sasamy
Цитата(XVR @ Dec 25 2011, 15:30) *
Да здравствует С и Unix!


Да - согласен.

Цитата
Кстати, ваш пример с 10 nop'ами можно даже в С сделать компактно и без генератора:


Кстати для особо одаренных - 1000 штук вы тоже будете вручную набивать ? речь помоему о кодогенерации.

Цитата
Что касается моих познаний в Linux'е, то я думаю, что загружаемый драйвер (в С и С++ версиях), который я написал, дает некоторую уверенность, что я немного в кернеле разбираюсь sm.gif


То что вы написали говнокод на С++ влоб переписав кусок кода на С совершенно не разобравшись что он делает, при этом не поняли что это из ядра Linux, __setup - это стандартный макрос ядра и он в свою очередь тоже разворачивается в код, говорит что вы скорей всего знакомы поверхностно.
http://lxr.free-electrons.com/source/inclu...nux/init.h#L245
Вот что сгенерировал препроцессор. Причем код генерируется платформо-зависимый.

Код
# 740 "arch/arm/mach-mx23/device.c"
static char *cmdline_device_ssp1; static int cmdline_device_ssp1_setup(char *dev) { cmdline_device_ssp1 = dev + 1; return 0; } static const char __setup_str_cmdline_device_ssp1_setup[] __attribute__ ((__section__(".init.rodata"))) __attribute__((aligned(1))) = "ssp1"; static struct obs_kernel_param __setup_cmdline_device_ssp1_setup __attribute__((__used__)) __attribute__ ((__section__(".init.setup"))) __attribute__((aligned((sizeof(long))))) = { __setup_str_cmdline_device_ssp1_setup, cmdline_device_ssp1_setup, 0 }; void mx23_init_ssp1(void) { if (!cmdline_device_ssp1 || !strcmp(cmdline_device_ssp1, "mmc")) mx23_init_mmc(); else if (!strcmp(cmdline_device_ssp1, "spi1")) mx23_init_spi1(); else printk("<3>" "Unknown %s assignment '%s'.\n","ssp1", cmdline_device_ssp1); }
static char *cmdline_device_ssp2; static int cmdline_device_ssp2_setup(char *dev) { cmdline_device_ssp2 = dev + 1; return 0; } static const char __setup_str_cmdline_device_ssp2_setup[] __attribute__ ((__section__(".init.rodata"))) __attribute__((aligned(1))) = "ssp2"; static struct obs_kernel_param __setup_cmdline_device_ssp2_setup __attribute__((__used__)) __attribute__ ((__section__(".init.setup"))) __attribute__((aligned((sizeof(long))))) = { __setup_str_cmdline_device_ssp2_setup, cmdline_device_ssp2_setup, 0 }; void mx23_init_ssp2(void) { if (!cmdline_device_ssp2 || !strcmp(cmdline_device_ssp2, "nand_mfc")) mx23_init_nand_mfc(); else if (!strcmp(cmdline_device_ssp2, "spi2")) mx23_init_spi2(); else printk("<3>" "Unknown %s assignment '%s'.\n","ssp2", cmdline_device_ssp2); }


Цитата
PPS. Зарекался я вам что либо писать, но не удержался ...


Не хотел ругать вас но вы сами таки напросились sm.gif
sonycman
Цитата(Прохожий @ Dec 25 2011, 14:46) *
Только скажу одно - спроектировать ПЛК может любой выпускник ВУЗ-а. Для этого ничего не надо, кроме небольшого набора знаний, которые у него есть.
А вот сделать проект средней по сложности линии - вряд ли.
И это не голословное утверждение. Это многократно проверено на практике.

Ну да, конечно, то то я смотрю, у нас на заводе повсюду ПЛК одних и тех же солидных фирм, а вот программы для них пишут все подряд, включая тех же недавних студентов.
А качество кода Вы оцениваете по его количеству, похоже - стопицот мильёнов строк - это крутизна, доступная только мегапрограммистам ПЛК? laughing.gif

Впрочем, есть и родной, разработанный на заводе ПЛК, который здорово уступает по надёжности импортным. Наверняка студентами разработан sm.gif
XVR
Цитата(sasamy @ Dec 25 2011, 15:59) *
Кстати для особо одаренных - 1000 штук вы тоже будете вручную набивать ? речь помоему о кодогенерации.

Речь шла о том, что не надо приплетать кодогенерацию там, где она не нужна. Для 1000 штук добавится еще 7 строк. Тщатьельнее надо смотреть то, что вам пишут.
Цитата
То что вы написали говнокод на С++ влоб переписав кусок кода на С совершенно не разобравшись что он делает,
Абзац. Т.е. я должен был телепатически догадаться, что ваш макрос без начала и концы выдран из ядра Linux'а и сделать вам конфетку?
Про 'говнокод на С++' умолчим - он делает ровно то, что делает ваш макрос. И делает это гораздо лучше
Цитата
при этом не поняли что это из ядра Linux, __setup - это стандартный макрос ядра и он в свою очередь тоже разворачивается в код, говорит что вы некомпетентны.
Это говорит о том, что вы троль.

Цитата
Вот во что сгенерировал препроцессор. Причем код генерируется платформо-зависимый.
Т.е. вы считаете, что этот платформо-зависимый ужас лучше пары классов С++ ?

Цитата
Не хотел ругать вас но вы сами таки напросились.
Да уж, напросился smile3046.gif Диагноз: sasamy - троль необразованный rolleyes.gif
sasamy
Цитата
Т.е. я должен был телепатически догадаться, что ваш макрос без начала и концы выдран из ядра Linux'а и сделать вам конфетку?


А кто вас вообще об этом просил ? Это вы сами решили что напишете божественный код в виде одного класса с парой виртуальных ф-ций.

Цитата(XVR @ Dec 25 2011, 16:25) *
Речь шла о том, что не надо приплетать кодогенерацию там, где она не нужна. Для 1000 штук добавится еще 7 строк. Тщатьельнее надо смотреть то, что вам пишут.


А вы сами внимательно прочитали ??

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


ы ?

Цитата
Да уж, напросился smile3046.gif Диагноз: sasamy - троль необразованный rolleyes.gif


Перешли на личности - доводы закончились sm.gif
dxp
QUOTE (Прохожий @ Dec 25 2011, 17:46) *
Ну Вы же далеко не сноб.
Зачем же принижать квалификацию профессионалов в той области, с которой Вы сталкиваетесь крайне редко?
То, что Вы изложили - дилетантизм, простите за резкость.

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

Насчёт ординарной способности любого выпускника ВУЗа спроектировать ПЛК комментировать не буду, дабы не провоцировать безплодную дискуссию и офтоп.
XVR
Цитата(sasamy @ Dec 25 2011, 16:47) *
Перешли на личности - доводы закончились sm.gif
Доводы закончились уже давно crying.gif По поводу 'необразованного троля' - беру свои слова обратно. Я посмотрел сообщения sasamy - весьма и весьма образованный специалист. Особенно в Linux (и ARM).

Но вот к сожалению, когда дело касается чего то вне пределов компетенции sasamy, тут образованность целиком заменяется упертостью, игнорированием чужих доводов и умелой подменой предмета спора в процессе спора. Т.е. просыпается классический тролль. Увы увы crying.gif

Вы же сами сказали, что не писали на С++ ничего крупного, откуда же такая уверенность в превосходстве С (и макросов), если у вас по определению не может быть опыта в том, с чем вы пытаетесь сравнивать С ?
sasamy
Цитата(XVR @ Dec 25 2011, 17:59) *
Вы же сами сказали, что не писали на С++ ничего крупного, откуда же такая уверенность в превосходстве С (и макросов), если у вас по определению не может быть опыта в том, с чем вы пытаетесь сравнивать С ?


Если говорить о крупных проектах типа Qt или какой-нибуть EDA (тут на форуме кажется есть ребята которые участвуют в разработке ) - я даже встревать не стал бы sm.gif С++ зарулит С и никакие макросы не спасут наверно если вы об этом, но речь вообще-то тут о микроконтоллерах. Только крупные проекты все больше на других языках начинают делать нежели на С++ - более безопасных и при этом простых.
Прохожий
Цитата(dxp @ Dec 25 2011, 17:26) *
Насчёт ординарной способности любого выпускника ВУЗа спроектировать ПЛК комментировать не буду, дабы не провоцировать безплодную дискуссию и офтоп.

Вы знаете, где это можно сделать безболезненно.
Я готов доказать Вам на реальных фактах, что Вы не совсем правы.


Цитата(sonycman @ Dec 25 2011, 16:17) *
Ну да, конечно, то то я смотрю, у нас на заводе повсюду ПЛК одних и тех же солидных фирм, а вот программы для них пишут все подряд, включая тех же недавних студентов.
А качество кода Вы оцениваете по его количеству, похоже - стопицот мильёнов строк - это крутизна, доступная только мегапрограммистам ПЛК? laughing.gif

Дык, на С и С++ пишут тоже все подряд. И схемы разрабатывают. И Саяно-Шушенскую ГЭС эксплуатируют. Давеча вон Фобос-Грунт...
Что же касается кода, о котором я говорил, приходите - покажу.
Писали немцы - уважаемые и опытные люди.
Если сможете сделать лучше, даже денег дадут.
Только одно НО. На верхнем уровне порядка 60 тыс тэгов.
Число датчиков, как дискретных, так и аналоговых - порядка 100 тысяч.
Плюс к этому, Ваше оборудование должно быть сертифицировано во всех инстанциях по всем необходимым критериям безопасности и качества.
В том числе и Вы, как программист.
Цитата(sonycman @ Dec 25 2011, 16:17) *
Впрочем, есть и родной, разработанный на заводе ПЛК, который здорово уступает по надёжности импортным. Наверняка студентами разработан sm.gif

Я ПЛК не разрабатываю. Я их эксплуатирую. Поэтому, Вам виднее...

И вообще, здесь речь не о ПЛК...
XVR
Цитата(sasamy @ Dec 25 2011, 18:24) *
Если говорить о крупных проектах типа Qt или какой-нибуть EDA (тут на форуме кажется есть ребята которые участвуют в разработке ) - я даже встревать не стал бы sm.gif
О! Золотые слова.

Цитата
но речь вообще-то тут о микроконтоллерах.
Да, тут есть нюансы. И я тоже не стану категорически говорить, что для МК С или С++ лучше (а то и must have). biggrin.gif

В принципе С++ обладает большими выразительными силами (назовем это так), чем С. И для МК они так же применимы. Но он так же содержит огромный подводный камень (я бы даже сказал - скалу). Он обладает неограниченными возможностями выражать сложные конструкции простыми действиями. Ну например, сгенерить несколько неочевидных действий в самом простом выражении, типа a=b+c; В результате простая и короткая (по внешнему виду) программа может превратится в монстра wacko.gif
Второй подводный камень - это сам ООП (как не странно). Частенько у программистов есть стойкое убеждение, что если С++ это ООП язык, то все вокруг должно быть в объектах, наследовании, виртуальных функциях и т.д. и т.п. Тут надо вовремя остановится - С++ позволяет писать в обычном процедурном стиле, а что более важно, он позволяет не писать в ООП стиле там, где это не нужно. 1111493779.gif

Так что, если вы собрались писать для МК на С++, то или вы должны быть экспертом в этом языке (что бы не наломать дров), либо быть в постоянном контакте с такими экспертами, что бы они не дали вам наломать дров. santa2.gif

Цитата
Только крупные проекты все больше на других языках начинают делать нежели на С++ - более безопасных и при этом простых.
В общем да, хотя сложность С++ сильно преувеличенна. Пары больших программ (тысяч в несколько строк) вполне достаточно, что бы как то освоится с С++ rolleyes.gif

PS. Хочу уточнить, что под местоимением вы в вышеизложенном тексте, а не имею в виду лично sasamy, без обид.
Прохожий
Цитата(XVR @ Dec 25 2011, 19:03) *
В принципе С++ обладает большими выразительными силами (назовем это так), чем С. И для МК они так же применимы. Но он так же содержит огромный подводный камень (я бы даже сказал - скалу). Он обладает неограниченными возможностями выражать сложные конструкции простыми действиями. Ну например, сгенерить несколько неочевидных действий в самом простом выражении, типа a=b+c; В результате простая и короткая (по внешнему виду) программа может превратится в монстра wacko.gif
Второй подводный камень - это сам ООП (как не странно). Частенько у программистов есть стойкое убеждение, что если С++ это ООП язык, то все вокруг должно быть в объектах, наследовании, виртуальных функциях и т.д. и т.п. Тут надо вовремя остановится - С++ позволяет писать в обычном процедурном стиле, а что более важно, он позволяет не писать в ООП стиле там, где это не нужно. 1111493779.gif

Так что, если вы собрались писать для МК на С++, то или вы должны быть экспертом в этом языке (что бы не наломать дров), либо быть в постоянном контакте с такими экспертами, что бы они не дали вам наломать дров. santa2.gif

В мемориз, однозначно!
Все правильно.
Каждой задаче - своя методология ее решения.
Нет применению ООП без нужды! sm.gif
sonycman
Я тоже пишу, так сказать, под плюсами, но практически не использую ООП. sm.gif
Просто очень удобно работать с классами, перегруженными функциями\операторами, пользоваться всякими плюшками вроде агрументов по умолчанию и т.п.
Мелочи, но приятные, зачем себя ограничивать рамками "простого" Си?

Цитата(Прохожий @ Dec 25 2011, 18:50) *
Дык, на С и С++ пишут тоже все подряд. И схемы разрабатывают. И Саяно-Шушенскую ГЭС эксплуатируют. Давеча вон Фобос-Грунт...

Вот-вот, и у студента, которому взбредёт в голову с нуля создать такую сложную железку, как ПЛК, результат будет такой же...
Там ведь не только программирование, но ещё и схемотехника, разводка печатных плат и т.п.
dxp
QUOTE (Прохожий @ Dec 25 2011, 22:14) *
В мемориз, однозначно!
Все правильно.
Каждой задаче - своя методология ее решения.
Нет применению ООП без нужды! sm.gif

Так именно об этом и речь!

QUOTE (sonycman @ Dec 25 2011, 22:35) *
Я тоже пишу, так сказать, под плюсами, но практически не использую ООП. sm.gif
Просто очень удобно работать с классами, перегруженными функциями\операторами, пользоваться всякими плюшками вроде агрументов по умолчанию и т.п.
Мелочи, но приятные, зачем себя ограничивать рамками "простого" Си?

+1!

QUOTE (XVR @ Dec 25 2011, 22:03) *
Так что, если вы собрались писать для МК на С++, то или вы должны быть экспертом в этом языке (что бы не наломать дров), либо быть в постоянном контакте с такими экспертами, что бы они не дали вам наломать дров. santa2.gif

Я бы уточнил: необходимо разбираться в используемых средствах языка. Например, если человек не разбирается (чувствует себя неуверенно) в шаблонах, то лучше их ему [пока] не использовать (там хватает заслуживающих внимания средств и без них). И это касается не только МК, но и языка вообще. И не только С++, но и других языков тоже (на том же С с адресной арифметикой можно ого-го дровишек наломать). Если что угодно делать без достаточного понимания, то успеха не достичь. Это универсальное правило. И это не причина шельмовать инструментарий.
XVR
Цитата(dxp @ Dec 25 2011, 19:54) *
И это касается не только МК, но и языка вообще. И не только С++,
Конечно, но на МК это проявляется особенно остро. Если на РС слепить программу на С++ со всеми контейнерами stl, привлечь парочку паттернов (потяжелее), и еще чего нибудь, то на РС программа станет на пару [десятков] мегабайт больше, при запуске съест на пару [сотен] мегабайт больше, и будет работать на 50% медленнее. С современными характеристиками РС этого никто не заметит. А вот для МК это будет фатально - программа тупо не влезет ни в какой камень crying.gif
dxp
QUOTE (XVR @ Dec 25 2011, 23:41) *
Конечно, но на МК это проявляется особенно остро. Если на РС слепить программу на С++ со всеми контейнерами stl, привлечь парочку паттернов (потяжелее), и еще чего нибудь, то на РС программа станет на пару [десятков] мегабайт больше, при запуске съест на пару [сотен] мегабайт больше, и будет работать на 50% медленнее. С современными характеристиками РС этого никто не заметит. А вот для МК это будет фатально - программа тупо не влезет ни в какой камень crying.gif

Зато МК быстро таким образом приучает к дисциплине мышления и кодирования, мотивирует работать "компилятор" в голове у программиста и учит чётко представлять, как реализуются абстракции и концепции ЯВУ в железе, и во что выльется та или иная языковая конструкция. А РСшный программер, которому целевая платформа "прощает" некачественную работу, имеет шансы так не узнать, какой говнокод он генерит. sm.gif Первый путь мне больше по душе.
Прохожий
Цитата(sonycman @ Dec 25 2011, 19:35) *
Вот-вот, и у студента, которому взбредёт в голову с нуля создать такую сложную железку, как ПЛК, результат будет такой же...
Там ведь не только программирование, но ещё и схемотехника, разводка печатных плат и т.п.

А Вы в курсе, что по очень правдоподобной легенде, нынешние популярные вычислители AVR и ARM созданы именно студентами.

Цитата(dxp @ Dec 25 2011, 19:54) *
Я бы уточнил: необходимо разбираться в используемых средствах языка. Например, если человек не разбирается (чувствует себя неуверенно) в шаблонах, то лучше их ему [пока] не использовать (там хватает заслуживающих внимания средств и без них). И это касается не только МК, но и языка вообще. И не только С++, но и других языков тоже (на том же С с адресной арифметикой можно ого-го дровишек наломать). Если что угодно делать без достаточного понимания, то успеха не достичь. Это универсальное правило. И это не причина шельмовать инструментарий.

Тогда я бы пошел еще дальше.
Надо разбираться в теории того, что ты делаешь.
Даже здесь в качестве примера приводилась задержка в виде цикла замкнутого на себя.
Но это же недопустимо по-любому.
Я даже на РС так не делаю. А уж на МК...
neiver
Цитата(sasamy @ Dec 25 2011, 14:37) *
Препроцессор С Тьюринг-неполный и только средствами препроцессора циклы и прочее задача нетривиальная (если вообще разрешимая).

Именно такого решения я от вас и ждал. Можно было еще сослаться на BOOST_PP_REPEAT и иже с ним. Там можно до 255 "итераций" и до 3 уровней вложенности. Ну да не важно.
А теперь попробуйте пожалуйста сделать максимально объективный сравнительный анализ этих двух техник, скажем, по таким параметрам:
- функциональность;
- области применимости;
- ограничения;
- удобство диагностики ошибок кодирования;
- удобство чтения исходного текста;
- удобство отладки;
- стоимость внесения изменений;
- порог вхождения для использования.

Выводы за вами.
dxp
QUOTE (Прохожий @ Dec 26 2011, 00:26) *
А Вы в курсе, что по очень правдоподобной легенде, нынешние популярные вычислители AVR и ARM созданы именно студентами.

Да, AVR кривоват, этого не отнять.

QUOTE (Прохожий @ Dec 26 2011, 00:26) *
Даже здесь в качестве примера приводилась задержка в виде цикла замкнутого на себя.
Но это же недопустимо по-любому.
Я даже на РС так не делаю. А уж на МК...

Вы про шаблон Nops? Очень простое, эффективное, красивое и безопасное решение. Не понимаю, что вы там смогли усмотреть плохого. Компилятор на этапе компиляции рекурсивно разворачивает цикл, генерируя столько нопов подряд, сколько указано.
Прохожий
Цитата(dxp @ Dec 25 2011, 21:47) *
Вы про шаблон Nops? Очень простое, эффективное, красивое и безопасное решение. Не понимаю, что вы там смогли усмотреть плохого. Компилятор на этапе компиляции рекурсивно разворачивает цикл, генерируя столько нопов подряд, сколько указано.

И тратит при этом процессорное время на пресловутые nop-ы.
neiver
Цитата(Прохожий @ Dec 25 2011, 22:04) *
И тратит при этом процессорное время на пресловутые nop-ы.

Сделайте, пожалуйста, задержку на 1-15 драгоценных тактов используя их на что-то полезное.
Прохожий
Цитата(neiver @ Dec 25 2011, 22:08) *
Сделайте, пожалуйста, задержку на 1-15 драгоценных тактов используя их на что-то полезное.

А зачем?
Если такая потребность возникает, то что-то не так с Вашей схемотехникой.
neiver
Ну возьмём, скажем, дисплей какой-нибудь на HD44780 или на KS0108 и подключим к какому-нибудь Cortex-у, работающему на 30 МГц. Контроллер ногами махает несколько быстрее, чем дисплею нужно.
Прохожий
Цитата(neiver @ Dec 25 2011, 22:44) *
Ну возьмём, скажем, дисплей какой-нибудь на HD44780 или на KS0108 и подключим к какому-нибудь Cortex-у, работающему на 30 МГц. Контроллер ногами махает несколько быстрее, чем дисплею нужно.

А что? I2C индикаторы запрещены к применению?
Или отменили MK с аппаратным параллельным портом?
Iptash
Цитата(neiver @ Dec 25 2011, 22:44) *
Ну возьмём, скажем, дисплей какой-нибудь на HD44780 или на KS0108 и подключим к какому-нибудь Cortex-у, работающему на 30 МГц. Контроллер ногами махает несколько быстрее, чем дисплею нужно.

Да хоть на 700мГц, это не означает, что нужно ждать пока дисплей отработает, нужно в реальном времени работать и ценить каждый такт процессора.
dxp
QUOTE (Прохожий @ Dec 26 2011, 01:23) *
А зачем?
Если такая потребность возникает, то что-то не так с Вашей схемотехникой.

Причём тут схемотехника? Ситуации разные бывают. Применён дешёвый МК без контроллера внешней шины, скорости хватает за глаза, зато дешёвый и с задачей справляется.

QUOTE (Iptash @ Dec 26 2011, 02:05) *
Да хоть на 700мГц, это не означает, что нужно ждать пока дисплей отработает, нужно в реальном времени работать и ценить каждый такт процессора.

Это в теории. А на практике никуда не денетесь при работе с медленной периферией. Даже есть есть аппаратный контроллер внешней шины, то придётся ему wait state'ы настроить, чтобы времянки соблюсти, и при обращении к медленному устройству проц будет все равно ждать, если только обращение не через DMA организовано. DMA тоже есть далеко не везде.

Т.ч. вставка пары-тройки пустых операций иногда бывает нужна. И предложено очень красивое и эффективное решение.
sasamy
Цитата(dxp @ Dec 26 2011, 08:01) *
Т.ч. вставка пары-тройки пустых операций иногда бывает нужна. И предложено очень красивое и эффективное решение.


Вот же заносит вас - речь вообще не о препроцессоре С, никакого определяющего значения в выборе языка для меня лично он не имеет, меня попросили привести пример где С++ уступает С. В ассемблерах препроцессор зарулит в этом плане С и С++. В повседневных задачах макросы используются в основном для именованых констант, условной компиляции и отладочных сообщений. Если говорить про UNIX то тут традиционно с препроцессингом нет проблем, достаточно вспомнить про lex, yacc, sed, awk, m4, по сравнению с которыми все темплейты С++ просто детский лепет, но использовать их в повседневных задачах - как из пушки по воробьям.
Flexz
Вот же заносит вас sm.gif
Пример-то когда будете приводить? Или опять стрелки на макросы кинете, которые в обоих языках идентичны.
dxp
QUOTE (sasamy @ Dec 26 2011, 13:11) *
Вот же заносит вас - речь вообще не о препроцессоре С, никакого определяющего значения в выборе языка для меня лично он не имеет, меня попросили привести пример где С++ уступает С. В ассемблерах препроцессор зарулит в этом плане С и С++. В повседневных задачах макросы используются в основном для именованых констант, условной компиляции и отладочных сообщений. Если говорить про UNIX то тут традиционно с препроцессингом нет проблем, достаточно вспомнить про lex, yacc, sed, awk, m4, по сравнению с которыми все темплейты С++ просто детский лепет, но использовать их в повседневных задачах - как из пушки по воробьям.

Закончил уже с вами дискутировать на тему С++ по понятным причинам, которые внятно изложил XVR, но напоследок отвечу. sed и awk - чтоб вам ими всю жизнь пользоваться. biggrin.gif А по мне так - фтопку их. Для этого у меня есть Python. И уж для какой-то незаурядной кодогенерации я поюзаю COG, который в отличие от ваших недоделанных препроцессоров генерирует явный код прямо в сорце, т.е. видно, что скармливается компилятору. При этом и кодогенерирующие конструкции написаны на нормальном ЯП высокого уровня (куда выше, нежели тот же С++), а не на долбанных подстановках. Излишне говорить, что Python по юзабилити и эффективности использования ни в какое сравнение не идёт с вашим списком утилит. Но даже он не заменяет С++ шаблоны.

P.S. Помнится, как-то работая с IAR'овским пакетом (то ли для MSP430, то ли для AVR), завёл внутри функции локальный объект N (или С), после чего конкретно попрыгал вокруг этой простейшей функции, получая маловразумительные сообщения компилятора, которые никак не коррелировали с выражениями, на которые он ссылался. Нашёл, в чём дело. Оказалось, что именитая фирма в заголовках не стесняется лепить макросы:

CODE
#define C                   (0x0001)
#define Z                   (0x0002)
#define N                   (0x0004)
#define V                   (0x0100)


Что сказать? Пять баллов! Кстати, оно и до сих пор у них так. Вот оно могущество препроцессора. В создании геморроя на пустом месте.
sasamy
Цитата(dxp @ Dec 26 2011, 12:13) *
А по мне так - фтопку их. Для этого у меня есть Python.


То что не умеете пользоваться sed и awk понятно, а Python и у меня есть.
dxp
QUOTE (sasamy @ Dec 26 2011, 16:15) *
То что не умеете пользоваться sed и awk понятно, а Python и у меня есть.

Если кому нравится выворачивать мозги, сочиняя код на птичьем языке потоковых редакторов, я не возражаю, а сам предпочитаю нормальный язык программирования. А вам если по существу сказать нечего, так промолчите, а хамить не надо, а то это обоюдоострая вещь.
sasamy
Цитата(dxp @ Dec 26 2011, 14:24) *
Если кому нравится выворачивать мозги, сочиняя код на птичьем языке потоковых редакторов, я не возражаю, а сам предпочитаю нормальный язык программирования.


Смотря что вы называете "птичьим языком" - принцип регулярных выражений един для всех языков, включая sed, awk и Pythonb, у awk С-подобный синтиаксис. Никто для "сочинения кода" sed и awk не использует - когда то им на замену был придуман Perl, сегодня наверно целесообразней применять Python - тут на любителя, но sed и awk в повседневном использовании в UNIX-подобных системах они никогда не заменят, факт - find, sed, awk пожалуй самые использумые команды в юниксах.

Цитата
А вам если по существу сказать нечего, так промолчите, а хамить не надо, а то это обоюдоострая вещь.


Хамить вам я и не собирался - ткните пальцем если найдете, я извинюсь если был не прав, если вы о том что не умеете пользоваться sed и awk - извините конечно, вы наверно пользователь Windows и лишены таких инструментов sm.gif По поводу препроцессинга и шаблонов - шаблоны в С++ мощней препроцессора С хотя бы потому что оптимизируются компилятором (и вообще о том что нужны ли шаблоны в С++ - нужны и вряд ли их там что-то может заменить), в С мне шаблоны не нужны - достаточно препроцессора, и некоторые вещи из того что он умеет на шаблонах не сделать или это будет очень затруднительно. Еще по поводу препроцессинга и метапрограммирования - из того чем последнее время интересовался :
Qt - moc + препроцессор С
L4 - препроцессинг на Perl
так что механизма шаблонов С++ для _крупных_ проектов многим явно недостаточно.
По поводу UI и удобства ООП - посмотрите совремненные тенденции, в том же Qt активно развивается QML - описание интерфейса в декларативном стиле, логика на JavaScript подобном языке - знания С++ для написания GUI вообще не требуется, хотя сама Qt написана на С++.
По поводу системного программирования и С++ - ядро Windows до сих пор пишут на С (это по вашему крупный или мелкий проект)

Все можно выдыхать sm.gif
XVR
Кстати. То, что sed,awk и perl очень полезные и могучие языки, ни коим образом не прибавляет им понятности sm.gif
Злые языки утверждают, что название awk произошло от awkward (неуклюжий), а perl расшифровывается как Pathologically Eclectic Rubbish Lister (это кстати определение от Larry Wall - автора Perl'а)
Цитата
так что механизма шаблонов С++ для _крупных_ проектов многим явно недостаточно.
Разумеется. В С++ из шаблонов уже выжали столько, сколько Bjarne Stroustrup'у и в кошмарном сне не виделось sm.gif
dxp
sed'ом и awk успел попользоваться изрядно, хоть и под вендой. Хорошие штуки, когда надо обрабатывать единичные строки. Как только нужно многострочный текст обработать, начинаются пляски. Как познакомился с Python'ом, так не нарадуюсь до сих пор. Те же регулярные выражения в полный рост, но использование не в пример проще и прозрачнее Для кодогенерации есть хороший инструмент COG (ссылку приводил).

Что касается С/С++, то стою на прежнем: где уместен С, там уместен и С++. Применять или не применять - это вопрос в значительной мере субъективный, зависит от применяющего. Но объективных противопоказаний у С++ по сравнению с С в контексте МК нет.

Ладно, давно не топик уже.
sasamy
Цитата(dxp @ Dec 27 2011, 19:24) *
Что касается С/С++, то стою на прежнем: где уместен С, там уместен и С++. Применять или не применять - это вопрос в значительной мере субъективный, зависит от применяющего. Но объективных противопоказаний у С++ по сравнению с С в контексте МК нет.


Мне лично импонирует другой подход, которого придерживается Никлаус Вирт - «Делай просто, насколько возможно, но не проще этого»
neiver
Цитата(sasamy @ Dec 27 2011, 21:39) *
Мне лично импонирует другой подход, которого придерживается Никлаус Вирт - «Делай просто, насколько возможно, но не проще этого»

Вот только критерии возможной простоты вещь не формализованная и каждый их видит по своему. Для одного простота это "дамп потока сознания", а для другого это четкая архитектура с прозрачным разделением на модули инкапсуляцией и максимальным повторным использованием кода.
Простота - это понятие более философское, чем инженерное.
sasamy
Цитата(neiver @ Dec 27 2011, 21:56) *
Простота - это понятие более философское, чем инженерное.


а вы рассматривайте простоту с точки зрения инженера а не философа и все ок будет sm.gif
neiver
Цитата(sasamy @ Dec 27 2011, 22:32) *
а вы рассматривайте простоту с точки зрения инженера а не философа и все ок будет sm.gif

А я и рассматриваю простоту с инженерной точки зрения и она при этом раскладывается в:
- простоту проектирования,
- простоту кодирования,
- простоту отладки,
- простоту добавления/изменения функционала,
- простоту тестирования (в том числе автоматизированного)
- простоту переноса на другие платформы,
- простоту повторного использования кода в других проектах.

Какую простоту Вы предпочитаете?
Некоторые пункты взаимоисключающие. Сложно бывает найти компромисс в этой "простоте" sm.gif
Лично я обычно приношу первые два пункта в жертву остальным, поскольку они есть малая часть жизненного цикла ПО.
Казалось-бы какое всё это имеет отношение к С++?
sasamy
Цитата(neiver @ Dec 27 2011, 23:59) *
А я и рассматриваю простоту с инженерной точки зрения и она при этом раскладывается в:
- простоту проектирования,
- простоту кодирования,
- простоту отладки,
- простоту добавления/изменения функционала,
- простоту тестирования (в том числе автоматизированного)
- простоту переноса на другие платформы,
- простоту повторного использования кода в других проектах.

Какую простоту Вы предпочитаете?
Некоторые пункты взаимоисключающие. Сложно бывает найти компромисс в этой "простоте" sm.gif


Сделайте лучше опрос, судя по хардкорным задержкам которые у вас типичная задача - микроконтроллеры которые вы используете не очень сложные и экзотические, так что лучше даже указать конкретный тип. Например какой из ЯП вы предпочтете по перечисленным критериям - С| С++|другой для такого-то микроконтроллера (или семейства микроконтроллеров), мне самому очень интересно sm.gif Ну и интересно будет прочитать коментарии если они будут.
Сергей Борщ
QUOTE (sasamy @ Dec 27 2011, 22:40) *
Сделайте лучше опрос,
Типичный тролль. Неудобные вопросы проигнорированы, зато раздал ценные указания.
Такой опрос уже был, воспользуйтесь поиском.
sasamy
Цитата(Сергей Борщ @ Dec 28 2011, 11:30) *
Типичный тролль.


ПНХ

Цитата
Неудобные вопросы проигнорированы, зато раздал ценные указания.


Пожалуйста - отвечаю: по всем пунктам однозначно С

Цитата
Такой опрос уже был, воспользуйтесь поиском.


Не мне это нужно было.
sonycman
Цитата(sasamy @ Dec 28 2011, 11:41) *
ПНХ

Я что-то не пойму, не прикрытое хамство, а теперь уже и завуалированный мат - это теперь норма на этом форуме?
Теперь каждое неграмотное быдло может грубить уважаемым участникам форума?
Где модераторы? 1111493779.gif
sasamy
Цитата(sonycman @ Dec 28 2011, 12:53) *
Я что-то не пойму, не прикрытое хамство, а теперь уже и завуалированный мат - это теперь норма на этом форуме?


ПНХ - Пожалуйста Не Хамите.

Цитата
Неудобные вопросы проигнорированы


Есть вопрос по scmRTOS (как известно она написана на C++):
допустим есть микроконтроллер с MMU, хочется использовать аппаратную защиту памяти процессов, возможно ли это сделать быстро без серьезных изменений кода этой ОС ?
это касается этих пунктов
Цитата
- простоту проектирования,
- простоту добавления/изменения функционала,
- простоту переноса на другие платформы,
- простоту повторного использования кода в других проектах.
haker_fox
QUOTE (sonycman @ Dec 28 2011, 16:53) *
это теперь норма на этом форуме?

Так мы же сами эту норму и создаем. Никто не может смериться с тем, что у каждого есть свои личные пристрастия, привычки и устои. Каждому нужно доказать, что он прав, и другим необходимо поступать также. Зачем ломать чужие убеждение в такой форме? Я имею в виду в форме "пустого трепа" (прошу прощения за это выражение)? Делиться опытом нужно, но когда этот опыт усваиваться тем, с кем делишься. Если чаша переполнилась, зачем туда наливать воду? Не все готовы поменять свои взгляды. Пусть. Пройдет время и они их изменят, либо изменят те, кто пытался изменить (еще раз прошу прощения). У каждого своя правда
Давайте научимся уважать друг друга, и уважать мнение и методологию работы другого. Я понимаю, что если бы у нас был общий проект, тогда да - необходимо более менее работать одинаковыми способами. Но тут - каждый сам по себе, у каждого свои нормы.

Прошу меня извинить уже за мой "треп"...

Спасибо!
sonycman
Цитата(haker_fox @ Dec 28 2011, 17:21) *
Никто не может смериться с тем, что у каждого есть свои личные пристрастия, привычки и устои.

Какие бы ни были пристрастия или устои, вести себя в обществе нужно вежливо, было бы это общение лицом к лицу, или же на форуме.
Большинство так и поступает, слава богу, и этот форум не исключение.

Вот только эта тема пестрит хамскими выпадами, и перешла уже на едва прикрытый мат.
Самое время раздать горчичники, пусть и сам их заслуживаю, но не смог удержаться назвать вещи своими именами sm.gif
sasamy
Цитата(sonycman @ Dec 28 2011, 12:53) *
Теперь каждое неграмотное быдло может грубить уважаемым участникам форума?


Чего так слабо - желтые штаны - два раза Ку.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.