Официальный сайт компании Arduino по адресу arduino.cc
Обращение к переменной из библиотеки
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Вс, 15/12/2019 - 18:46
Всем привет!
Хочу в одну из библиотек добавить свою переменную. Но я не знаю как правильно обращаться к этой переменной. Библиотека: https://github.com/TMRh20/TMRpcm
В файле TMRpcm.h объявляю переменную (название взято с потолка):
volatile unsigned int Countsample567;
Потом в одной из функций в файле TMRpcm.cpp прописываю:
Countsample567 = 2568;
В скетче получаю значение переменной:
Serial.println(audio.Countsample567);
Компилирую, выдает ошибку: 'Countsample567' was not declared in this scope
Если же сделать инициализацию переменной не в TMRpcm.h, а в TMRpcm.cpp, то получаю ошибку: 'class TMRpcm' has no member named 'Countsample567'
Если же прописать инициализацию в обоих файлах, то при попытку чтения из переменной получаю "0".
Вопрос, как правильно объявить переменную и обратиться к этой переменной и считать ее значение?
Если б Вы показали нормальный код, то что-то можно было бы говорить. А то куда Вы там чего всунули, одному Богу известно.
Вот оба файла из библиотеки, TMRpcm.h, переменную прописал в строке 29:
Вот TMRpcm.cpp, переменную объявил в 169-й строке. Значение переменной задается в 657-й строке. ENABLE_RECORDING - разрешено, "задефайнино", простите за лексикон.
Мой скетч, Setup взят от другого скетча:
forfrends - начните с понимания того, что то, что вы хотите делать - вообще делать не нужно :)
Завести переменную - член класса и потом обращаться к ней непосредственно из другого куска кода - это плохой стиль программирования. Вместо непосредственного доступа к данным класса обычно используют методы класса, так называемые сеттеры и геттеры.
Внутри библиотечного класса нужно создать два метода (две процедуры), один из которых - сеттер - будет устанавливать значение для вашей переменной Countsample567, а второй - геттер - возвращать это значение для основной программы.
При этом переменная Countsample567 будет описана и использоваться только в классе TMRpcm и никаких ошибок возникать не будет
Мне просто нужно в одной из функций кроме кода самой функции выполнить еще дополнительный код, и результат сохранить в переменной. Функция ISR(TIMER1_COMPB_vect) вызывается по прерыванию, и ничего не возвращает. Нужный мне код в функции выполняется, проверял. А вот как это сохранить в переменную и потом ее считать - не могу понять. Пока что ничего у меня не получается.
у вас описано две разных переменных Countsample567 - в файле TMRpcm.h - член класса, в файле TMRpcm.cpp - переменная уровня файла
Вторую переменную вы инициализируете в строке 657, а первую - нет, поэтому ее значение равно нулю.
В скетче вы обращаетесь к первой переменной и вполне логично получаете ноль.
Решение - выкините вторичное описание переменной их файла TMRpcm.cpp
Я это уже делал (описано выше). В таком случае получаю ошибку: error: 'Countsample567' was not declared in this scope
forfrends, беда в том, что Вы ничего не понимаете в том, что делаете и пытаетесь делать методом тыка.
Вот, смотрите
TMRpcm.h, переменную прописал в строке 29:
Хорошо
Вот TMRpcm.cpp, переменную объявил в 169-й строке.
Вы объявили другую переменную, которая ни имеет никакого отношения к первой.
Значение переменной задается в 657-й строке.
Вы присвоили значение второй из двух объявленных переменных
Мой скетч, Setup взят от другого скетча:
А здесь Вы используете первую переменную, которой ничего никогда не присваивали.
Я это уже делал (описано выше). В таком случае получаю ошибку: error: 'Countsample567' was not declared in this scope
потому что неправильно делали. Вы похоже нечетко понимаете , что такое область видимости переменных. Если вы обращаетесь к переменной- члену класса "снаружи" этого класса, нужно указывать не просто имя переменной, а еще и имя экземпляра класаа, например
audio.Countsample567
Но в вашем конкретном случае вы не сможете использовать член класса в обработчике прерывания, потому что в момент, когда вы описываете этот обработчик - у вас еще не существует ни одного экземпляра класса.
Так что тут придется пойти другим путем - уберите описание вашей переменной из описания класса в файде .h, оставте только то описание, что в .cpp . Но тут проблема - вы не сможете обратится из основной программы к переменной из другого программного модуля.
Варианта решения два - либо применить функцию геттер, как я писал раньше - либо описать переменную как внешнюю
Варианта решения два -
Есть ещё третий - не делать того, что не понимаешь, а сначала как правильно советует дед, "книшки пачитать".