Расположение библиотек и пространства имен
- Войдите на сайт для отправки комментариев
Не знаю, как понятно поставить вопрос, посему изложу ситуацию... Возможно, вопрос выеденного яйца не стоит, но пожалуйста, ногами сильно не пинайте - я не сишник, пока только учусь :) .
Обнаружил, что большинство моих скетчей (я начинающий, посему - в основном пока тестовых) содержат одни и те же участки кода. Естественным образом возникла мысль разложить такие участки в отдельные библиотеки. Почитал про библиотеки среды arduino, в азах разобрался. Далее встал вопрос о пространствах имен. Поскольку я не могу знать заранее, какие сторонние библиотеки могут понадобиться в неопределенном будущем, то решил все собственные библиотеки сложить в отдельное "свое" пространство имен. О пространствах имен применительно к ардуино инфы не нашел - нигде этот вопрос не освещается. Я, конечно, понимаю, что при всей ограниченности памяти, размера программ для ардуино эта тема не стоит так остро, как в больших проектах для других платформ, но - ситуация, что сначала я напишу свой класс Button, а потом мне для других проектов понадобится какой-нибудь сторонний класс Button из сторонней библиотеки не представляется мне абсолютно невозможной. Я не сишник, так что пришлось еще почитать о том, как пространства имен реализованы в си. Вроде бы тоже разобрался. Накатал простейшую тестовую библиотеку в отдельном пространстве имен и тут возник вопрос - как сложить библиотеки, реализованные в конкретном пространстве имен в подпапку с таким же именем? Например, создать в папке со скетчами имеется папка libraries. Идея в том, чтобы создать в ней, папку, например, "rygoravich", куда уже складывать папки конкретных собственных библиотек. И вот тут уже возникла проблема - если, например библиотека Test (функции которой заданы в пространстве имен rygoravich), лежит в ~/sketchbook/libraries/rygoravich/Test, то компилятор никак не может ее подключить. Т.е. надо из файла скетча подключать строкой наподобие #include "rygoravich/Test.h" библиотеку, которая лежит в папке ~/sketchbook/libraries/rygoravich/Test.
Как такое правильно реализовать?
Вот потому что вы начинающий и лезет куча непонятных вопросов не о чем. Первое- это классы. пространство имен, и наконец ООП (в даномм случае проектирование)
ПС: Классы в моей интерплетации http://arduino.ru/forum/programmirovanie/klassy-arduino-po-qwone-dlya-chainikov
Пространства имен #164
ППС: И не стремитесь пихать все в библиотеки . Это ущербная практика для человека, который плохо знает как правильно спроектировать программу.
Вот потому что вы начинающий и лезет куча непонятных вопросов не о чем.
Ну, это я в микроконтроллерах и си начинающий, но с другой стороны я профессиональный программист и с ООП и пространствами имен имею дело постоянно. Просто я не знаю, как эти моменты в си реализованы, при этом спланировать архитектуру приложения для меня не проблема.
Кстати, я удивлен, что все поголовно виденные мной статьи о библиотеках ардуино настаивают, что библиотека - это такая форма реализации класса... Первым делом проверил - выяснилось, что вполне можно создавать "внеклассовые" библиотеки, состоящие из обычных функций.
Неймспейсы мне нужны не для того, чтобы заменить ими ООП, как в приведенной Вами ссылке, я собираюсь использовать их по прямому назначению - чтобы не париться о возможных конфликтах имен. Вопрос в том, как расположить библиотеку, чтобы она подключалась в скетче конструкцией вроде #include "<имя_пространства_имен>/<имя_библиотеки>" и при этом положить все библиотеки конкретного неймспейса в конкретную отдельную папку. Что-то мне подсказывает, что си должен такое уметь :) .
но с другой стороны я профессиональный программист и с ООП и пространствами имен имею дело постоянно. Просто я не знаю, как эти моменты в си реализованы,
Неймспейсы мне нужны
Что-то мне подсказывает, что си должен такое уметь :) .
Не стыкуется, батенька. Профессиональный программист должен знать, хотя бы навскидку, стандарты, а вы, выходит, "не знаю, как эти моменты в си реализованы", и "Что-то мне подсказывает". Думаю, вы ошибаетесь в оценке своего профессионализма, чуть-чуть ;) Конечно, если вы профессиональный программист на С/С++.
Вообще-то как раз классы и возникли из !!! "внеклассовых" библиотек. Ведь что такое класс - это связь обычных функций и переменных закрытых от внешнего доступа. namespace - это тоже сделать закрытые или полузакрытые переменные и функции.
ПС: DIYMan прав. Вам надо подучить теорию программирования как ООП, так и Си/Си+ . Сильно много дыр у вас в знаниях.
Не стыкуется, батенька. Профессиональный программист должен знать, хотя бы навскидку, стандарты, а вы, выходит, "не знаю, как эти моменты в си реализованы", и "Что-то мне подсказывает". Думаю, вы ошибаетесь в оценке своего профессионализма, чуть-чуть ;) Конечно, если вы профессиональный программист на С/С++.
Читайте внимательно - я писал, что я НЕ сишник. Бывают другие языки программирования, представляете?
Вообще-то как раз классы и возникли из !!! "внеклассовых" библиотек. Ведь что такое класс - это связь обычных функций и переменных закрытых от внешнего доступа. namespace - это тоже сделать закрытые или полузакрытые переменные и функции.
WAT? Открою вам великий секрет - можно реализовать класс, где все переменные и методы будут открыты для внешнего доступа. А неймспейсы вообще никоим образом ничего не закрывают, они просто дают возможность гибкого управления именами.
ПС: DIYMan прав. Вам надо подучить теорию программирования как ООП, так и Си/Си+ . Сильно много дыр у вас в знаниях.
Насчет теории программирования - с учетом вашего поста, боюсь, вам куда больше нужно его учить, чем мне. А касательно конкретно си - я ж сам в самом начале титульного поста сам писал "я не сишник, пока только учусь". Тут пока мои знания практически одна сплошная дыра - так я как бы и не отрицаю.
Поналетели специалисты - на простой вопрос ответить не могут, зато пальцы гнут и пытаются объяснить, что такое класс, сами понятия об этом не имея.
Хорошо бы в тему заглянул нормальный сишник...
Хорошо бы в тему заглянул нормальный сишник...
Ну пробовал я както делать вложеные папки в папке с проектом, где *.ino лежит. Ниче хорошего из этого не вышло. Препроцессор ардуиновский при вызове gcc устанавливает путь к проекту на левый каталог, потому и в инклудах попытки указать что либо относительно каталога проекта заканчивается ничем. Абсолютные пути типа "c:\......." работают пока кирилицу не встретит. Может в новых версиях чего полечили, у них там каждый раз переворот вселенной :((
В либах пути к инклудам работают корректно, препроцессор виринга туда не лазит. Чем я и пользуюсь.
Неймспейсы должны вобще работать корректно. Ардуино про них просто не знает, отправит в gcc как есть. И это хороше.
Читайте внимательно - я писал, что я НЕ сишник. Бывают другие языки программирования, представляете?
Читайте внимательно - я написал "Конечно, если вы профессиональный программист на С/С++.".
Поналетели специалисты - на простой вопрос ответить не могут, зато пальцы гнут и пытаются объяснить, что такое класс, сами понятия об этом не имея.
С таким подходом вы слона не продадите.
Хорошо бы в тему заглянул нормальный сишник...
Открою "профессиональному" секрет: новый язык в копилку начинается с чтения стандартов и изучения конструкций языка. Если намёк на это до "профессионального" не доходит (а намёк был), да и вообще "профессиональный" не в курсе, как это - учить новые языки, то у профессионального лихо развито ЧСВ, имхо. Тут есть такие товарищи, вам будет с ними весело :)
Умерьте гонор, и просите с уважением, тогда вам помогут.
З.Ы. Что касается темы - то исходные файлы, которые называются "библиотеками" в рамках Arduino IDE - ничем не отличаются от обычных исходных файлов. Вы можете и рядом со скетчем их положить, и подключать как #include "file.h", вместо #include <file.h>. Что там будет в исходных файлах - пофиг, дело ваше.
Однако, сама Arduino IDE - по сути надстройка над gcc, и она перед сборкой проекта сама лихо обходится с *.ino-файлом: делает всякие непотребства. Из-за некоторых особенностей сложные пути подключения (типа #include <MyLib/SubFolder/SomeFile.h> могут банально не взлететь. Говорю по состоянию на версию 1.6.7, возможно, в более новых версиях что-то из этого пофиксено.
Logic, признаться, я вообще не понимаю, как среда ищет библиотеки... Например, есть файл blin.h. Кладу его в корневой каталог с пользовательскими либами (куда и сторонние библиотеки разворачиваю - в моем случае ~/sketchbook/libraries). Пишу в скетче
Не подключает. Создаю в том же каталоге каталог blin, переношу в него blin.h. Скетч подключает сей blin.h и нормально компилируется (с тем же кодом подключения).
Упс... Еще поэкспериментировал, нашел решение :) . Выглядит коряво, правда, зато работает. Опишу, может еще кому понадобится:
Итак, создаю отдельную папку для своих библиотек (в моем случае ~/sketchbook/libraries/rygoravich). Туда складываю папки с собственно библиотеками (т.е. пока просто с тестовой, ну да не суть). В папке, где лежит собственно среда разработки (у меня ~/progs/arduino-1.8.5) открываем hardware/tools/avr/avr/include и там создаем симлинк на папку для собственных библиотек. В скетче подключаем так:
И оно вроде работает :) . Нюанс - если либа предполагает наличие отдельных файлов для заголовков и кода (т.е. есть еще Test.cpp), то файл с кодом автоматом не подключается - надо либо прописывать код непосредственно в Test.h (мой вариант, я пока еще не разобрался, зачем вообще придумали их разделять), либо подключать Test.cpp внутри Test.h.
Logic, за наводку спасибо :) !
Открою "профессиональному" секрет: новый язык в копилку начинается с чтения стандартов и изучения конструкций языка. Если намёк на это до "профессионального" не доходит (а намёк был), да и вообще "профессиональный" не в курсе, как это - учить новые языки, то у профессионального лихо развито ЧСВ, имхо. Тут есть такие товарищи, вам будет с ними весело :)
Можно прочитать все стандарты запоем, даже вызубрить их - и абсолютно ничему не научиться. Крайне важно теорию обильно разбавлять практикой - без этого можно получить диплом специалиста, но стать специалистом невозможно. Так что лично я предпочитаю учиться в процессе.
Умерьте гонор, и просите с уважением, тогда вам помогут.
Ну, если перегнул палку - извините, не хочу ни с кем ругаться, но не я начал. Дело в том, что когда я чего-то не знаю, я не боюсь в этом признаться, что должно быть понятно хотя бы даже из первого поста темы. И в итоге на основании того, что я не знаю языка, на котором не специализируюсь, меня обвиняют в непрофессионализме. Вы считаете это нормальным?
Позвольте аналогию - если таксист никогда не водил трактор, то впервые садясь за руль последнего будет вынужден научиться чему-то новому. Первые его выезды вряд ли можно будет назвать чрезмерно изящными. Но - то, что он плохо водит трактор нисколько не умаляет его профессионализма как таксиста.
Кстати, насчет помощи - Logic вот уже помог - не прямым ответом, но так даже интереснее :) .
Однако, сама Arduino IDE - по сути надстройка над gcc, и она перед сборкой проекта сама лихо обходится с *.ino-файлом: делает всякие непотребства. Из-за некоторых особенностей сложные пути подключения (типа #include <MyLib/SubFolder/SomeFile.h> могут банально не взлететь. Говорю по состоянию на версию 1.6.7, возможно, в более новых версиях что-то из этого пофиксено.
Вы будете смеяться, но такие вот особенности среды на текущем этапе для меня даже важнее, чем собственно, сами стандарты и конструкции си - последние всегда можно подсмотреть по ходу, а нюансы среды - вещь недокументированная (с точки зрения человека, не владеющего английским языком).