Как вызвать библиотеку из библиотеки?
- Войдите на сайт для отправки комментариев
Ср, 11/11/2015 - 15:31
Коллеги,
есть две библиотеки: lib1.h и lib2.h
вот думаю как можно вызвать методы lib1.h из lib2.h.
Пытался это сделать но прикомпиляции пишется ошибка, что он не видит lib1.
Как это можно сделать?
Если Вам не нужно вызывать из .cpp файла, а достаточно из .h, то это совсем просто. Сделайте так, чтобы в основном скетче include на тот .h файл в котором вызывается стоял ПОСЛЕ include того файла из которого вызывается. Если надо, могу выложить пример.
Кстати, если вызывать надо из .cpp файла, то тело этой функции (в которой есть такой вызов) всегда можно перенести в .h файл.
Да примерчик бы не помешал.....
Я попробовал это сделать теперь он говорить что идет редефинишн - переопределение.
ТО есть мы двараза файл указали ф библиотеке вызвали lib1 и в основном коде.
НО у меня основаная сложность в том как в коде смой библиотеки вызвать другую.
Какой синтаксис, надо ли использовать new ведь по сути в бибилотеке мы создвем новый экземпляр класса другой билиотеки?
А где тогда хранить сами файлы библиотек в папке libraries?
В каталоге с библиотеками смотрю файл SpacebrewYun.h, вижу строку #include <Bridge.h>
С new и всем остальным никаких проблем - если .h файл того, что мы создаём, видим из того места, где создаём, то все нормально.
Как я уже писал - всё гораздо проще, если весь текст библиотеки находится в .h файле (с файлом .cpp сложнее). Поэтому давайте сделаем так. Сейчас я Вам дам пример как всё сделать для случая, когда всё находится в .h файле. Посмотрите, запустите, убедитесь, что нормально компилируется и т.п.
Затем, если Вы сами не знаете, то я объясню как любую функцию из .cpp файла перенести в .h файл ничего при этом не сломав. И, наконец, если схранится потребность, то тогда уж поговорим как быть, если очень хочется всё держать таки в .cpp файле.
Итак,
1. имеется библиотека VoltageRange - это просто пара чисел и определённая для неё операция "==". Операция определена так, что если сравнить экземпляр VoltageRange с целым числом, то "истина" получится, если число попадает в интервал, заданный парой чисел VoltageRange и "ложь" - если не попадает.
2. Имеется библиотека ResistiveKeyboard, которая содержит несколько диапазонов (типа VoltageRange) и имеет единственный метод - keyPressed(int pin). Метод читает аналоговый пин и проверяет попало ли значение считанное с пина в один из интервалов VoltageRange. Если попало - возвращает номер интервала (считая с 1), а если не попало ни в один - возвращает 0.
3. имеется скетч, который создаёт клавиатуру с четырьмя кнопками и в loop проверяет не нажата ли какая-нибудь кнопка и, когда нажата, печатает номер кнопки.
Файлы расположены стандартно:
MySkethes\kaka\kaka.ino - файл скетча
MySkethes\libraries\VoltageRange\VoltageRange.h - файл библиотеки
MySkethes\libraries\ResistiveKeyboard\ResistiveKeyboard.h - файл библиотеки
Это важно. Библиотека VoltageRange используется в ResistiveKeyboard, поэтому VoltageRange определена выше. Когда она потребуется для ResistiveKeyboard, она уже будет определена. Если написать include наоборот, то VoltageRange не будет доступна для ResistiveKeyboard
Смотрите. Попробуйте добавить в ResistiveKeyboard new VoltageRange всё должно работать. Убедитесь, что всё поняли и ответьте на вопрос "хватит ли Вам этого".
Ну, теперь, собственно, тексты.
kaka.ino
VoltageRange.h
ResistiveKeyboard.h
Чуть не забыл! Если будете запускать, добавьте там стандартную инициализацию сериала и т.п. - я это убрал, чтобы не загромождать код.
ЕвгенийП, благодарю за развернутое пояснение возможно данный конкретный пример и будет работать, но я никак не могу уловить логику действий....
Вот например:
1. Создаем мы VoltageRange в RestrictiveKeyboard. А где new VoltageRange.
2. В каком синтаксисе писать: VoltageRange VR = new VoltageRange или VoltageRange:VR?Опять же если несколько экземпляров типа VoltageRange то всетаки как то надо создать экземпляр.
3.Взять за правило что если это делается в h файле тогда никаких include он типа и так все видит?
4.Вообще на каком языке мы это все пишем: ( С,С++,'Поскаль' на крайняк:) )?
По факту у меня он снова жалуется на редефинишен, мол я перереопределяю уже заранее определенный класс.
(Почему то код вставляется только один раз и только в начале.)
Я не понял. Что значит не работает? Чтоговорит? Что значит вставляется один раз и в начале. Это что за кусок текста? Он живёт в библиотеке или в основном скетче? Ничего не понял.
Вот в таком варианте: когда LIB1 вызывается из ino файла все работает.
Вот в таком варианте когда первая библиотека вызывается не в ino файле а в другой беблиотеку все тоже работает.
НО!
Во втором варианте необходимо обязательно указывать указатели *, обозначая переменную как ссылочный тип и осуществлять доступ к методам через указатели -> иначе не работает.
Во втором варианте также не получается отобразить результат возвращаемого методом значения так как компилятор не может сделать конвертацию типов из int в int*, не получается так же сложить 2 результата возвращаемых 2-мя методами разных обьектов.
В итоге вопрос концептуальный:
Создается ли в первом варианте 2 разных обьекта?
Не могу понять всетаки синтаксис: в первом варианте не нужно указывать ссылочные типы а во втором нужно без этого не работает?
Что правильнее?
ЗЫ: когда добавляю на форум топики код получается добавить только один раз (2 разных кода не добввляются) и он всегда помещается в начале топика.
Во втором варианте необходимо обязательно указывать указатели *, обозначая переменную как ссылочный тип и осуществлять доступ к методам через указатели -> иначе не работает.
Вот Вы говорите "не работает", но при этом не приводите ТОГО вариаанта, который собственно не работает и не приводите сообщений компилятора. Вместо неработающего варианта, Вы пишете "надо обязательно ..., а иначе ...". Но я же не вижу, как именно Вы добились, чтобы не работало. Как я могу догадаться в чём проблема?
Вот давайте спокойно и методично: дайте мне три файла (ino и две бибилиотеки), которые не компилируются и приведите сообщение компилятора.
Если не умеете постить три файла, соедините в один, только комментариями отделите.
Это что? Вы описали УКАЗАТЕЛЬ на int. Присвоили УКАЗАТЕЛЮ 0, а затем проводите арифметику с этим УКАЗАТЕЛЕМ! Вы именно этого хотели?