Библиотеки для ардуино

Lictor
Offline
Зарегистрирован: 01.10.2015

Собрался с силами и решил написать библиотеку (для личного пользования, что бы никого кодом не пугать) для ардуино.

Создал папку в ней файл БИБЛИОТЕКА.h, где указал используемые функции, библиотека.cpp где описал функции подробно. Беда в том, что функции используют три глобальные переменные. 

 

Подскажите, как можно обьявить глобальную переменную в файлах библиотеки, что бы она была видна всем функциям?

 

#pragma once
#include <Arduino.h>

//Вот эти глобальные переменные используются в функциях, но IDE их не видит:
extern  byte dataPin;  //Передача данных
extern  byte clockPin; //Синхронизация передачи данных
extern  byte strobePin; //Chip select,выбор микросхемы, разрешение/запрет записи данных

void function1(byte dataPin1, byte clockPin1, byte strobePin1); 
void function2(byte cmd);
void function3(byte data); 

 

 

rkit
Offline
Зарегистрирован: 23.11.2016

Всё уже объявлено - строки 5,6,7. Только в неймспейс заверни, а то конфликт имен может быть.

Lictor
Offline
Зарегистрирован: 01.10.2015

rkit пишет:

Всё уже объявлено - строки 5,6,7. Только в неймспейс заверни, а то конфликт имен может быть.

 

В том то и беда, вот ошибки:

C:\Users\House\AppData\Local\Temp\cc1HiqU9.ltrans0.ltrans.o: In function `send(unsigned char)':
D:\Arduino\libraries\masterTM1639/masterTM1639.cpp:40: undefined reference to `clockPin'
D:\Arduino\libraries\masterTM1639/masterTM1639.cpp:41: undefined reference to `dataPin'
D:\Arduino\libraries\masterTM1639/masterTM1639.cpp:43: undefined reference to `clockPin'
C:\Users\House\AppData\Local\Temp\cc1HiqU9.ltrans0.ltrans.o: In function `sendCommand(unsigned char)':
D:\Arduino\libraries\masterTM1639/masterTM1639.cpp:32: undefined reference to `strobePin'

 

ну и далее по функциям...

rkit
Offline
Зарегистрирован: 23.11.2016

Так может ты определишь переменные теперь?

byte dataPin = 5;

И т.д. В файле исходников, а не заголовочном.

Lictor
Offline
Зарегистрирован: 01.10.2015

Добавил пространство имен 

#pragma once
#include <Arduino.h>


namespace TM {
	extern  byte dataPin;  //Передача данных
	extern  byte clockPin; //Синхронизация передачи данных
	extern  byte strobePin; //Chip select,выбор микросхемы, разрешение/запрет записи данных

	void initTM1639(byte dataPin1, byte clockPin1, byte strobePin1);
	void sendCommand(byte cmd);
	void send(byte data);
	void sendData(byte address, byte data);
	void printTM1639(byte a1, byte b1, byte a2, byte b2, byte a3, byte b3, byte a4, byte b4, byte a5, byte b5, byte a6, byte b6, byte a7, byte b7, byte a8, byte b8);
	void lightTM1639(byte light1);
	void controlTM1639(bool a);
	byte buttonstatusTM1639(bool b);
};

Если просто подключить библиотеку, компиляцию проходит, но при попытке вызвать функцию...

C:\Users\House\AppData\Local\Temp\ccdxnEQj.ltrans0.ltrans.o: In function `TM::send(unsigned char)':
D:\Arduino\libraries\masterTM1639/masterTM1639.cpp:40: undefined reference to `TM::clockPin'
D:\Arduino\libraries\masterTM1639/masterTM1639.cpp:41: undefined reference to `TM::dataPin'
D:\Arduino\libraries\masterTM1639/masterTM1639.cpp:43: undefined reference to `TM::clockPin'
C:\Users\House\AppData\Local\Temp\ccdxnEQj.ltrans0.ltrans.o: In function `TM::sendCommand(unsigned char)':
D:\Arduino\libraries\masterTM1639/masterTM1639.cpp:32: undefined reference to `TM::strobePin'
D:\Arduino\libraries\masterTM1639/masterTM1639.cpp:34: undefined reference to `TM::strobePin'
C:\Users\House\AppData\Local\Temp\ccdxnEQj.ltrans0.ltrans.o: In function `initTM1639':
D:\Arduino\libraries\masterTM1639/masterTM1639.cpp:4: undefined reference to `TM::dataPin'
D:\Arduino\libraries\masterTM1639/masterTM1639.cpp:5: undefined reference to `TM::clockPin'
D:\Arduino\libraries\masterTM1639/masterTM1639.cpp:6: undefined reference to `TM::strobePin'
D:\Arduino\libraries\masterTM1639/masterTM1639.cpp:9: undefined reference to `TM::clockPin'
D:\Arduino\libraries\masterTM1639/masterTM1639.cpp:10: undefined reference to `TM::strobePin'
D:\Arduino\libraries\masterTM1639/masterTM1639.cpp:12: undefined reference to `TM::strobePin'
D:\Arduino\libraries\masterTM1639/masterTM1639.cpp:13: undefined reference to `TM::clockPin'
D:\Arduino\libraries\masterTM1639/masterTM1639.cpp:22: undefined reference to `TM::strobePin'
D:\Arduino\libraries\masterTM1639/masterTM1639.cpp:27: undefined reference to `TM::strobePin'
collect2.exe: error: ld returned 1 exit status
exit status 1
Ошибка компиляции для платы Arduino Mega or Mega 2560.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

1. НАХРЕНА этим переменным быть extern? Разве они должны быть доступны извне? Они ведь используются ТОЛЬКО в библиотеке, так наюха им extern?

2. если уж используете extern, то где то ещё эта переменная должна быть определена без этого слова.

3. если переменные нужны только внутри библиотеки, то им НЕХРЕН делать в файле объявлений от слова совсем. Они объявляются в начале файла .cpp со словом static.

4. пространство имён Вам не нужно от слова "нахрен". Но уж если решили использовать, то либо функции (их тела) должны быть в том же пространстве имён, где и переменные, либо имена переменных нужно предварять префиксом пространства имён.

Lictor
Offline
Зарегистрирован: 01.10.2015

ЕвгенийП пишет:

1. НАХРЕНА этим переменным быть extern? Разве они должны быть доступны извне? Они ведь используются ТОЛЬКО в библиотеке, так наюха им extern?

2. если уж используете extern, то где то ещё эта переменная должна быть определена без этого слова.

3. если переменные нужны только внутри библиотеки, то им НЕХРЕН делать в файле объявлений от слова совсем. Они объявляются в начале файла .cpp со словом static.

4. пространство имён Вам не нужно от слова "нахрен". Но уж если решили использовать, то либо функции (их тела) должны быть в том же пространстве имён, где и переменные, либо имена переменных нужно предварять префиксом пространства имён.

 

Огромное спасибо, помогло, все скомпилировалось и запустилось после правок

rkit
Offline
Зарегистрирован: 23.11.2016

ЕвгенийП пишет:

4. пространство имён Вам не нужно от слова "нахрен".

А потом в какой-то левой библиотеке случайно окажется переменная с таким же именем, и начнутся ох какие пляски.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

rkit пишет:

А потом в какой-то левой библиотеке случайно окажется переменная с таким же именем, и начнутся ох какие пляски.

Если сделать так, как я сказал? Объявить только в .cpp файле со словом static? Где же она может оказаться, если такая переменная видна только в своём файле и нигде больше? Ни в каком другом файле её не видно, и там можно смело объявлять другую с таким же именем - она и будет другой. Так что ничего не начнётся.

Я вообще, специально писал "этюды для начинающих", а админ их в начале раздела "Программирование" прикрепил. Там и про это есть. Вы бы почитали,  такие-то простые вещи надо бы знать.

rkit
Offline
Зарегистрирован: 23.11.2016

Всё содержимое библиотеки никогда не объявляется со словом static. В этом нет смысла. Поэтому говорить, что нейспейсы НАФИГ НЕ НУЖНЫ - нельзя.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вы решили поспорить? Ну, хорошо, спорьте, только без меня.