Есть готовый рабочий файл fanju.ino (декодирование сигнала датчика погодной станции). Компилируется без проблем. Хочу сделать свой проект метеостанции с применением функций из него. Попытался начать так:
Создал свой пустой скетч (файл ws.ino)
Скопировал полностью весь код из оригинального скетча. Проверил - скомпилировал свой - компилируется.
Добавил в папку своего проекта файл fanju.cpp с текстом
#include "fanju.h"
Добавил в папку своего проекта файл fanju.h с текстом
#ifndef FANJU_H
#define FANJU_H
#endif
Проверил - ws.ino по прежнему компилируется.
Вырезаю из ws.ino функцию и вставляю её в файл fanju.cpp, а в файл fanju.h строчу, и скетч перестаёт компилироваться.
fanju.cpp:
Видимо, читать не умеешь… Он же тебе говорит: error: ‘uint8_t’ was not declared in this scope – Я, говорит, не знаю что это еще такое за uint8_t ? Самогон?
In file included from D:\ws\fanju.cpp:1:0:
D:\ws\fanju.h:4:11: error: variable or field ‘push’ declared void
void push(uint8_t v);
^~~~~~~
D:\ws\fanju.h:4:11: error: ‘uint8_t’ was not declared in this scope
D:\ws\fanju.cpp: In function ‘void push(uint8_t)’:
D:\ws\fanju.cpp:6:3: error: ‘buffer’ was not declared in this scope
buffer[widx++] = v;
^~~~~~
D:\ws\fanju.cpp:6:10: error: ‘widx’ was not declared in this scope
buffer[widx++] = v;
^~~~
D:\ws\fanju.cpp:7:3: error: ‘lvl’ was not declared in this scope
lvl++;
^~~
D:\ws\fanju.cpp:8:15: error: ‘BUF_SIZE’ was not declared in this scope
if (widx == BUF_SIZE)
^~~~~~~~
D:\ws\fanju.cpp:8:15: note: suggested alternative: ‘BUFSIZ’
if (widx == BUF_SIZE)
^~~~~~~~
BUFSIZ
D:\ws\fanju.cpp: In function ‘void isr()’:
D:\ws\fanju.cpp:15:14: error: ‘last’ was not declared in this scope
push(cur - last);
^~~~
D:\ws\fanju.cpp:15:14: note: suggested alternative: ‘labs’
push(cur - last);
^~~~
labs
exit status 1
Compilation error: variable or field ‘push’ declared void
Я тут писал в другой теме вчера, хоть и по другому поводу: “функция - это отдельный мир”. К вам относится в полной мере.
Чтобы вы могли вынести функцию в отдельный файл - она не должна использовать никаких глобальных переменных, таких как у вас lastbufferlvl и тд Все переменные должны быть или локальными для функции или файла, или передаваться ей как параметры.
Да, про “;” просмотрел. Но про подключение Ардуино.аш там не сказано.
Делать библиотеку не вижу смысла, достаточно было бы в отдельные файлы вынести процедуры и функции, относящиеся к отдельной структурной части проекта.
Если укажете где правильная, подробная инструкция, буду премного благодарен.
начните с обдумывания последней фразы в сообщении 7
Просто так перенести функции в другой файл редко когда удается. Программу придется серьезно переписывать.
Хотя, если вы сразу создаете функции правильно - будет легче.
Она и не уйдет. Arduino.h нужно подключать в .h файле. Для начала. А затем разбираться, почему в .cpp файле вы используете переменные, которые там не объявлены
Не знаю почему, но я стараюсь extern не использовать. Во всяком случае, свой код проектирую так, чтобы extern не понадобился. В чужом коде иногда приходится добавлять extern, чтобы не переписывать слишком много.
В целом, воспринимаю его как “костыль”, прибегать к которому недостойно “нормальных пацанов”
Нет, зачем? Просто почти не использую глобальных переменных и статических уровня файла. (уточнение - статические переменные использую, но стараюсь не обращаться к переменным одного файла из другого).
Все, что нужно функциям в другом модуле компиляции - передаю в виде параметров. Если параметров становится слишком много - организую их в структуры или обьекты и передаю ссылку на обьект.
Хотя, необходимость передачи слишком многих параметров - тоже обычно признак плохого проектирования программы.