Расположение библиотек и пространства имен

rygoravich
Offline
Зарегистрирован: 04.05.2016

Не знаю, как понятно поставить вопрос, посему изложу ситуацию... Возможно, вопрос выеденного яйца не стоит, но пожалуйста, ногами сильно не пинайте - я не сишник, пока только учусь :) .

Обнаружил, что большинство моих скетчей (я начинающий, посему - в основном пока тестовых) содержат одни и те же участки кода. Естественным образом возникла мысль разложить такие участки в отдельные библиотеки. Почитал про библиотеки среды arduino, в азах разобрался. Далее встал вопрос о пространствах имен. Поскольку я не могу знать заранее, какие сторонние библиотеки могут понадобиться в неопределенном будущем, то решил все собственные библиотеки сложить в отдельное "свое" пространство имен. О пространствах имен применительно к ардуино инфы не нашел - нигде этот вопрос не освещается. Я, конечно, понимаю, что при всей ограниченности памяти, размера программ для ардуино эта тема не стоит так остро, как в больших проектах для других платформ, но - ситуация, что сначала я напишу свой класс Button, а потом мне для других проектов понадобится какой-нибудь сторонний класс Button из сторонней библиотеки не представляется мне абсолютно невозможной. Я не сишник, так что пришлось еще почитать о том, как пространства имен реализованы в си. Вроде бы тоже разобрался. Накатал простейшую тестовую библиотеку в отдельном пространстве имен и тут возник вопрос - как сложить библиотеки, реализованные в конкретном пространстве имен в подпапку с таким же именем? Например, создать в папке со скетчами имеется папка libraries. Идея в том, чтобы создать в ней, папку, например, "rygoravich", куда уже складывать папки конкретных собственных библиотек. И вот тут уже возникла проблема - если, например библиотека Test (функции которой заданы в пространстве имен rygoravich), лежит в ~/sketchbook/libraries/rygoravich/Test, то компилятор никак не может ее подключить. Т.е. надо из файла скетча подключать строкой наподобие #include "rygoravich/Test.h" библиотеку, которая лежит в папке ~/sketchbook/libraries/rygoravich/Test.

Как такое правильно реализовать?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Вот потому что вы начинающий и лезет куча непонятных вопросов не о чем. Первое- это классы. пространство имен, и наконец ООП (в даномм случае проектирование)

ПС: Классы в моей интерплетации http://arduino.ru/forum/programmirovanie/klassy-arduino-po-qwone-dlya-chainikov

Пространства имен #164

ППС: И не стремитесь пихать все в библиотеки . Это ущербная практика для человека, который плохо знает как правильно спроектировать программу.

rygoravich
Offline
Зарегистрирован: 04.05.2016

qwone пишет:

Вот потому что вы начинающий и лезет куча непонятных вопросов не о чем.

Ну, это я в микроконтроллерах и си начинающий, но с другой стороны я профессиональный программист и с ООП и пространствами имен имею дело постоянно. Просто я не знаю, как эти моменты в си реализованы, при этом спланировать архитектуру приложения для меня не проблема.

Кстати, я удивлен, что все поголовно виденные мной статьи о библиотеках ардуино настаивают, что библиотека - это такая форма реализации класса... Первым делом проверил - выяснилось, что вполне можно создавать "внеклассовые" библиотеки, состоящие из обычных функций.

Неймспейсы мне нужны не для того, чтобы заменить ими ООП, как в приведенной Вами ссылке, я собираюсь использовать их по прямому назначению - чтобы не париться о возможных конфликтах имен. Вопрос в том, как расположить библиотеку, чтобы она подключалась в скетче конструкцией вроде #include "<имя_пространства_имен>/<имя_библиотеки>" и при этом положить все библиотеки конкретного неймспейса в конкретную отдельную папку. Что-то мне подсказывает, что си должен такое уметь :) .

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

rygoravich пишет:

но с другой стороны я профессиональный программист и с ООП и пространствами имен имею дело постоянно. Просто я не знаю, как эти моменты в си реализованы, 

Неймспейсы мне нужны

Что-то мне подсказывает, что си должен такое уметь :) .

Не стыкуется, батенька. Профессиональный программист должен знать, хотя бы навскидку, стандарты, а вы, выходит, "не знаю, как эти моменты в си реализованы", и "Что-то мне подсказывает". Думаю, вы ошибаетесь в оценке своего профессионализма, чуть-чуть ;) Конечно, если вы профессиональный программист на С/С++.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

rygoravich пишет:
Кстати, я удивлен, что все поголовно виденные мной статьи о библиотеках ардуино настаивают, что библиотека - это такая форма реализации класса... Первым делом проверил - выяснилось, что вполне можно создавать "внеклассовые" библиотеки, состоящие из обычных функций.

Вообще-то как раз классы и возникли из !!! "внеклассовых" библиотек. Ведь что такое класс - это связь обычных функций и переменных закрытых от внешнего доступа.   namespace - это тоже сделать закрытые или полузакрытые переменные и функции. 

ПС: DIYMan прав. Вам надо подучить теорию программирования как ООП, так и Си/Си+ . Сильно много дыр у вас в знаниях. 

rygoravich
Offline
Зарегистрирован: 04.05.2016

DIYMan пишет:

Не стыкуется, батенька. Профессиональный программист должен знать, хотя бы навскидку, стандарты, а вы, выходит, "не знаю, как эти моменты в си реализованы", и "Что-то мне подсказывает". Думаю, вы ошибаетесь в оценке своего профессионализма, чуть-чуть ;) Конечно, если вы профессиональный программист на С/С++.

Читайте внимательно - я писал, что я НЕ сишник. Бывают другие языки программирования, представляете?

qwone пишет:

Вообще-то как раз классы и возникли из !!! "внеклассовых" библиотек. Ведь что такое класс - это связь обычных функций и переменных закрытых от внешнего доступа.   namespace - это тоже сделать закрытые или полузакрытые переменные и функции. 

WAT? Открою вам великий секрет - можно реализовать класс, где все переменные и методы будут открыты для внешнего доступа. А неймспейсы вообще никоим образом ничего не закрывают, они просто дают возможность гибкого управления именами.

qwone пишет:

ПС: DIYMan прав. Вам надо подучить теорию программирования как ООП, так и Си/Си+ . Сильно много дыр у вас в знаниях. 

Насчет теории программирования - с учетом вашего поста, боюсь, вам куда больше нужно его учить, чем мне. А касательно конкретно си - я ж сам в самом начале титульного поста сам писал "я не сишник, пока только учусь". Тут пока мои знания практически одна сплошная дыра - так я как бы и не отрицаю.

Поналетели специалисты - на простой вопрос ответить не могут, зато пальцы гнут и пытаются объяснить, что такое класс, сами понятия об этом не имея.

Хорошо бы в тему заглянул нормальный сишник...

Logik
Offline
Зарегистрирован: 05.08.2014

rygoravich пишет:

Хорошо бы в тему заглянул нормальный сишник...

Ну пробовал я както делать вложеные папки в папке с проектом, где *.ino лежит.  Ниче хорошего из этого не вышло. Препроцессор ардуиновский при вызове gcc устанавливает путь к проекту на левый каталог, потому и в инклудах попытки указать что либо относительно каталога проекта заканчивается ничем. Абсолютные пути типа "c:\......." работают пока кирилицу не встретит. Может в новых версиях чего полечили, у них там каждый раз переворот вселенной :(( 

В либах пути к инклудам работают корректно, препроцессор виринга туда не лазит. Чем я и пользуюсь.

Неймспейсы должны вобще работать корректно. Ардуино про них просто не знает, отправит в gcc как есть. И это хороше.

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

rygoravich пишет:

 

Читайте внимательно - я писал, что я НЕ сишник. Бывают другие языки программирования, представляете?

Читайте внимательно - я написал "Конечно, если вы профессиональный программист на С/С++.".

 

rygoravich пишет:

Поналетели специалисты - на простой вопрос ответить не могут, зато пальцы гнут и пытаются объяснить, что такое класс, сами понятия об этом не имея.

С таким подходом вы слона не продадите.

rygoravich пишет:

Хорошо бы в тему заглянул нормальный сишник...

Открою "профессиональному" секрет: новый язык в копилку начинается с чтения стандартов и изучения конструкций языка. Если намёк на это до "профессионального" не доходит (а намёк был), да и вообще "профессиональный" не в курсе, как это - учить новые языки, то у профессионального лихо развито ЧСВ, имхо. Тут есть такие товарищи, вам будет с ними весело :)

Умерьте гонор, и просите с уважением, тогда вам помогут.

З.Ы. Что касается темы - то исходные файлы, которые называются "библиотеками" в рамках Arduino IDE - ничем не отличаются от обычных исходных файлов. Вы можете и рядом со скетчем их положить, и подключать как #include "file.h", вместо #include <file.h>. Что там будет в исходных файлах - пофиг, дело ваше.

Однако, сама Arduino IDE - по сути надстройка над gcc, и она перед сборкой проекта сама лихо обходится с *.ino-файлом: делает всякие непотребства. Из-за некоторых особенностей сложные пути подключения (типа #include <MyLib/SubFolder/SomeFile.h> могут банально не взлететь. Говорю по состоянию на версию 1.6.7, возможно, в более новых версиях что-то из этого пофиксено.

rygoravich
Offline
Зарегистрирован: 04.05.2016

Logic, признаться, я вообще не понимаю, как среда ищет библиотеки... Например, есть файл blin.h. Кладу его в корневой каталог с пользовательскими либами (куда и сторонние библиотеки разворачиваю - в моем случае ~/sketchbook/libraries). Пишу в скетче

#include "blin.h"

Не подключает. Создаю в том же каталоге каталог blin, переношу в него blin.h. Скетч подключает сей blin.h и нормально компилируется (с тем же кодом подключения).

Упс... Еще поэкспериментировал, нашел решение :) . Выглядит коряво, правда, зато работает. Опишу, может еще кому понадобится:

Итак, создаю отдельную папку для своих библиотек (в моем случае ~/sketchbook/libraries/rygoravich). Туда складываю папки с собственно библиотеками (т.е. пока просто с тестовой, ну да не суть). В папке, где лежит собственно среда разработки (у меня ~/progs/arduino-1.8.5) открываем hardware/tools/avr/avr/include и там создаем симлинк на папку для собственных библиотек. В скетче подключаем так:

#include "rygoravich/Test/Test.h"

И оно вроде работает :) . Нюанс - если либа предполагает наличие отдельных файлов для заголовков и кода (т.е. есть еще Test.cpp), то файл с кодом автоматом не подключается - надо либо прописывать код непосредственно в Test.h (мой вариант, я пока еще не разобрался, зачем вообще придумали их разделять), либо подключать Test.cpp внутри Test.h.

Logic, за наводку спасибо :) !

rygoravich
Offline
Зарегистрирован: 04.05.2016

DIYMan пишет:

Открою "профессиональному" секрет: новый язык в копилку начинается с чтения стандартов и изучения конструкций языка. Если намёк на это до "профессионального" не доходит (а намёк был), да и вообще "профессиональный" не в курсе, как это - учить новые языки, то у профессионального лихо развито ЧСВ, имхо. Тут есть такие товарищи, вам будет с ними весело :)

Можно прочитать все стандарты запоем, даже вызубрить их - и абсолютно ничему не научиться. Крайне важно теорию обильно разбавлять практикой - без этого можно получить диплом специалиста, но стать специалистом невозможно. Так что лично я предпочитаю учиться в процессе.

DIYMan пишет:

Умерьте гонор, и просите с уважением, тогда вам помогут.

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

Позвольте аналогию - если таксист никогда не водил трактор, то впервые садясь за руль последнего будет вынужден научиться чему-то новому. Первые его выезды вряд ли можно будет назвать чрезмерно изящными. Но - то, что он плохо водит трактор нисколько не умаляет его профессионализма как таксиста.

Кстати, насчет помощи - Logic вот уже помог - не прямым ответом, но так даже интереснее :) .

DIYMan пишет:

Однако, сама Arduino IDE - по сути надстройка над gcc, и она перед сборкой проекта сама лихо обходится с *.ino-файлом: делает всякие непотребства. Из-за некоторых особенностей сложные пути подключения (типа #include <MyLib/SubFolder/SomeFile.h> могут банально не взлететь. Говорю по состоянию на версию 1.6.7, возможно, в более новых версиях что-то из этого пофиксено.

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