Работа с #ifdef и *.h
- Войдите на сайт для отправки комментариев
Вс, 07/06/2015 - 09:49
Добрый день.
Чтобы при тестировании не таскать с собой датчики, а только мегу, хочу использовать #ifdef и пр.
И при отсутствии датчиков эмулировать их работу.
Но столкнулся с тем что все это криво работает. Или у меня руки кривые :)
Например не могу запустить простой пример.
#include "C:\Users\I\Documents\Arduino\sketch_ifdef\ifdeftest.h" #include "C:\Users\I\Documents\Arduino\sketch_ifdef\ifdeftest.h" // #include <SPI.h> // int i = 10; void setup() { // put your setup code here, to run once: // start serial port at 9600 bps: Serial.begin(9600); } void loop() { // put your main code here, to run repeatedly: Serial.print(" i = "); Serial.println( i ); }
ifdeftest.h
// #include <inttypes.h> // пригодится, мы будем использовать числовые типы #include <SPI.h> int i = 10; #define PI 3.14 // два знака после запятой — достаточная точность. //Объявляем нашу библиотечную функцию, ради которой все и затевалось float circleArea(float radius);
Выдает ошибку :
In file included from sketch_ifdef.ino:1:0:
C:\Users\I\Documents\Arduino\sketch_ifdef\ifdeftest.h:4:18: fatal error: SPI.h: No such file or directory
#include <SPI.h>
^
compilation terminated.
Ошибка компиляции.
Через скетч естественно ошибок не выдает.
Кто-то решал подобную проблему?
Спасибо.
Про spi.h не подскажу, компа нет под рукой, а на счёт остального:
1. H файл подключен два раза. Смысл не понятен
2. В H файле нет "защиты" от повторного включения, посмотрите штатные файлы из АрдуиноИДЕ, как это нужно оформлять. Я про ifndef, define
3. Объявлять переменные в H плохая практика. Переменные нужно объявлять в ino, cpp файлах, а в H файлах писать extern int i;
Это в двух словах.
Вообще, посмотрите примеры (не Ардуино) использования H файлов.
1 и 2 - файл подключен 2 раза как раз тестировал ifndef, define. Полное понимание как делать. Просто не убрал строчку когда выкладывал :( Извиняюсь.
3. Спасибо!
Основная проблема, что не хочет цеплять sdi.h и прочие стандартные файлы.
При этом inttypes.h компилятор пропускает.
Файл .h который был.
Попробуйте заглянуть в папку типа "..\Documents and Settings\User\Local Settings\Temp\build*.tmp" Там можна найти файл cpp с именем как у вашего проекта. Это то, во что превратился Ваш скетч ino. Посмотрите этот cpp, сравните с скетчем. Думаю ответ найдется.
Спасибо.
Интересно было посмотреть.
Но там практически 100% ino файл. :(
Проблема не решена :((((
Никто не пользуется ifdef (и пр) ?
Пример в начальном сообщении не содержит ifdef, другие куски вставлены некорректно, да и собирать их по аэродрому нет времени.
Приложите конкретный пример и какая ошибка возникает, я посмотрю.
Есть на эту тему "проблемы" но их можно решить. Уже об этом писали и решение было. Вот бы ещё вспомнить где :)
Когда-то тоже плевался, из-за того что не мог понять как работает этот дополнительный ino-препроцессор. В конце концов, просто оставил файл .ino пустым, или почти пустым, а всё содержимое перенёс в отдельный .cpp файл.
Вполне стандартный файл, со стандартным и давно документированным препроцессором и компилятором - это, по-моему, лучше чем новоиспечённая и малопонятная ардуиновская самоделка.
Вот тут поподробнее, плз.
Если я пользуюсь "стандартным" компилятором, как потом это в ардуину загрузить?
Выдает ошибку :
Вот тут поподробнее, плз.
Если я пользуюсь "стандартным" компилятором, как потом это в ардуину загрузить?
Загружать как обычно. Ардуиновская среда сама пользуется вполне "стандартным" компилятором.
Но .ino файлы она ещё предварительно как-то обрабатывает - считается, что это упрощает программирование для неопытных пользователей.
Для .C и .CPP файлов такая дополнительная обработка не выполняется, поэтому при их компиляции никаких недокументированных неожиданностей скорее всего не будет.
Спасибо.
Смысл ошибки, я понимаю.
Работаю в стандартной среде ардуино.
Проблема в том, что среда работает корректно если spi.h находится в .ino файле.
Как только я выношу его в свой .h файл - ошибка. Те компилятор не корректно всталяет мой .h файл. Боюсь что корректировкой "путей" это не исправить. Хотя попробую. Очень хочется пользоваться ifdef.