Ардуино и шаблон template< typename T >
- Войдите на сайт для отправки комментариев
Втр, 16/05/2017 - 16:30
Начал заниматься с шаблонами и ничего не вышло. Почему не вышло не понимаю.Вот код
template< typename T > void sort( T data) {} void setup() { int q = 1; sort( q); } void loop() { }
Вот сообщение об ошибках
template_1:2: error: variable or field 'sort' declared void void sort( T data) {} ^ template_1:2: error: 'T' was not declared in this scope exit status 1 variable or field 'sort' declared void
Версия IDE Ардуино 1.8.0
Ответ был простым
То есть просто писать в одной строке не перенося на вторую?
А, это такой хитрый avr-gcc, на десктопном виндовом gcc можно писать и с новой строки.
Вот такой вот пример рассмотрите, для начала работы с шаблонами:
Писать так
А, это такой хитрый avr-gcc, на десктопном виндовом gcc можно писать и с новой строки.
Это вовсе не AVR-GCC - это факин ардуино IDE с её неизбывной заботой об упрощении синтаксиса языка, чтобы чайники могли на нём писать.
Вот смотрите, оригинальный скетч
А вот что ардуино IDE передаёт компилятору avr-gcc
Вот Вам и результат. Всё правильно компилятор ругается.
Вот в какой-то ведь версии они отказались от этой дебильной идеи самим предекларации вставлять, но столько старых скетчей посыпалось, что они вернули этот дебилизм "взад".
Руки бы отрывал! Хуже нет, когда невежда берётся писать системные вещи.
Да, я понял, какая дичь всё-таки :)
Вот в какой-то ведь версии они отказались от этой дебильной идеи самим предекларации вставлять, но столько старых скетчей посыпалось, что они вернули этот дебилизм "взад".
По хорошему, теперь остается только сделать это отключаемым.
Это вовсе не AVR-GCC - это факин ардуино IDE с её неизбывной заботой об упрощении синтаксиса языка, чтобы чайники могли на нём писать.
Лучше бы они не пытались под чайников оболочку писать, а написали вменяемый учебник по профессиональному программированию на высоком уровне. А то учебники по программированию на Ардуине на даун-Си это жесть. Да и пользы от этого нет.
Да вот написал удачный код .
вот, пожалуйста: http://www.bhv.ru/books/list_covers.php?get=rubrics&id=148 или вот: https://www.amazon.com/s/ref=nb_sb_ss_c_1_12?url=search-alias%3Daps&field-keywords=c+language+programming&sprefix=c%2B%2B+language%2Caps%2C241
Не нравится писать в даун-оболочке для начинающих - используйте Microsoft Visual Studio с плагином за денежку, или кучу любых других. Можно и вообще в блокноте, и затем руками звать компилёр и avrdude.
В ардуине не даун-Си, а очень даже ап-, то есть самый обычный, просто для удобства и скорости обучения новичков конструкции посложнее в примерах не используются. Никто не мешает лепить почти всё, что угодно из "большого брата си". Польза от этого есть, так как никто не родился сразу со знаниями ооп и дженериков в голове, а наилучший метод обучения всё ещё - от простого постепенно переходить к сложному, которое базируется на пройденном и понятом простом.
а наилучший метод обучения всё ещё - от простого постепенно переходить к сложному
Понимаете, но здесь то речь не про "от простого к сложному". Здесь ребята вставлют предварительные объявления функций, чем позволяют пользователю использовать функцию до описания! Даже если предположить, что они сделают это без ошибок типа той о которой мы говорим в этом топике, в любом случае это просто "привыкание к расхлябанной и недисциплинированной манере программирования", что никак нельзя назвать наилучшим методом обучения.
negavoid. Даун-Си это не свойство оболочки, а манера написания программы. Это "дерьмо" можно обнаружить и на других системах. Даун-Си очень легко освоить, но очень тяжело от него избавиться. Особенно если не видят альтернативу даже в упор. Сколько тем помогите новичку, совместите два скетча. Это следствие использования Даун-Си. А delay(). Да с ним надо бороться как бы не сильнее , чем GOTO.
ПС: тот стиль на котором я пишу - чистый самопал. В интернете море программ написаных для Ардуины и все на Даун-Си. Если это "простое", то где "сложное".
ЕвгенийП
Я понимаю, о чём вы, и знаю, что такое forward declaration, для чего они нужны и как должны бы использоваться. Но более сильно, чем просто отпустить по этому поводу замечание типа "дичь", я считаю, что я не вправе обсуждать полезность этого применённого солюшена аж до уровня "руки бы поотрывать", как здесь часто принято. Давайте допустим, что если бы они так не сделали, или, если бы не разбили main() на setup() loop(), не добавили бы бутлоадер, или ещё кучу упрощений, типа умолчальной utf8, не оказалась ли бы точка входа для новичков в мир Arduino намного сложнее, и этот девайс остался бы неприбыльным, ненужным, и известным и понятным только куче суровых схемотехников, не было бы ни этого форума, ни вас, ни меня. Да, возможно, это привыкание к расхлябанности и недисциплинированности, а возможно ведь и нет - на пути от полупроводников, затем транзисторов, триггеров, алу, ассемблера, ос, апи, юзер и опенссл.длл, менеджед рантайм, до однострочной команды в C# "скачай мне файл по https" очень много вех, очень много нижележащего, и си-шарпнику нынче не обязательно знать весь нижележащий стек из сотен тысяч элементарных вызовов, чтобы выполнить свою задачу и скачать файл. Может, это путь, которым идёт весь мир, упрощение, ускорение разработки и поддержки. Так что смотря как посмотреть :)
А про наилучший метод обучения, я имел в виду, что для новичков сперва неплохо бы узнать setup-loop, потом подёргать светодиодиком, потом выполнить пару программ на функциях, потом переходить к классам, потом переходить к дженерикам, - более лучший метод, чем сразу же, сходу, с первого-второго дня запилить "профессиональный" проЭкт на десяток тысяч строк, запихнув туда половину функционала C++17.
qwone
Тогда уж даун-си - свойство авторов/аудитории этих скетчей. Это следствие всеобщего мирового отупения. А Delay() - отличная функция, а кое-где даже и необходимая (чтобы позвать yield у esp8266 внутри тяжких вычислений, например). И кто вам сказал, что надо бороться с goto? А с jmp/jz/je в оттранслированном надо бороться? А с break()/continue()? Надо просто использовать всё в тех местах, где это действительно нужно.
я заметил :)
А delay(). Да с ним надо бороться как бы не сильнее , чем GOTO.
Чем Вам не угодили delay и goto? Нормальные инструменты при правильном применении.
... что если бы они так не сделали, или, если бы не разбили main() на setup() loop(), не добавили бы бутлоадер... не было бы ни этого форума, ни вас, ни меня. ...
"А если бы он вез патроны?" (с)
...
Что Вы, право слово, какую-то фигню несете?
Речь в топике о конкретном баге в IDE. Результат которого в том, что не компилируется пример из ВИКИПЕДИИ.
Добавление упрощений, случайно, привело к багу. Не нужно строить из себя умника и называть баг - "фичей".
Но, с другой стороны, не нужно и мазать калом разрабов IDE, поскольку, тут я с Вами полность согласен, IDE - основа популярности и смысл всей вселенной Ардуино.
Нужно просто кинуть кейс в баг-репрт разрабам и все. Поставить на этом точку и не высасывать тему обсуждаений из пальца.
Сорри, никого персонально задеть не хотел.
А delay(). Да с ним надо бороться как бы не сильнее , чем GOTO.
Чем Вам не угодили delay и goto? Нормальные инструменты при правильном применении.
Евгений! Согласен, НО - откровенно говоря, goto мы, все-таки очень маловероятно, обнаружим в коде любого современного проекта, даже если он на чистом С без ООП.
...
хотя наврал. Поглядел ярдро Линух, на котором я постоянно работаю. просто
>grep -r goto ./>> 11111
сотни! часть, конечно, в скриптах, а не коде, но все же.
А delay(). Да с ним надо бороться как бы не сильнее , чем GOTO.
Чем Вам не угодили delay и goto? Нормальные инструменты при правильном применении.
Нельзя! ст. 148 УК РФ, оскорбление религиозных чувств.
То ли дело расставить сколько угодно "return" по всей функции - это пожалуйста, лишь бы не goto.
Вобщето зря goto и delay рядом написали. Это две большие разницы. Гнобить goto -скорей дурная традиция, пошедшая из перехода от линейного программирования к процедурно ориентированому. Действительно в линейном этих goto было уж слишком и на тот момент отакз от goto явно был прогресивным. Сейчас, если без фанатизма его применять - то очень даже и не плохо. Это вопрос стиля кода, на эффективность не влияет, более того компилятор может сгенерить абсолютно такой же код с goto и if-else или for. А понятность кода в хобийном проекте - вопрос десятый, кроме автора кода в нем никто копатся не будет.
delay - другое дело. Это пускание основного ресурса, процессорного времени, МК в никуда. Не кретично, пока ресурс в избытке. Но такое бывает только в очень простых случаях, типа блинка светодиодов. В более сложных deley - чистое зло.
ПС. Зря за шаблоны взялись. Совершенно не вкусная штука, даже на ПК. А на МК вредна скорей, сильно код раздувает. Отлаживатся с ними - просто кара небесная. Мода на них давно прошла, сфера применения ужалась очень сильно, давно не видел чтоб кто обявлял (не путать с использованием чужих ))) их в прикладном приложении, но если свой STL писать, то тогда изучайте;) В современных диалектах Си куда интересней есть вещи, лямбда функции например.