Работа с #ifdef и *.h

BSHON
Offline
Зарегистрирован: 05.06.2015

Добрый день.

Чтобы при тестировании не таскать с собой датчики, а только мегу, хочу использовать #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.
Ошибка компиляции.
 
Через скетч естественно ошибок не выдает.
 
Кто-то решал подобную проблему?
 
Спасибо.
kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Про spi.h не подскажу, компа нет под рукой, а на счёт остального:
1. H файл подключен два раза. Смысл не понятен
2. В H файле нет "защиты" от повторного включения, посмотрите штатные файлы из АрдуиноИДЕ, как это нужно оформлять. Я про ifndef, define
3. Объявлять переменные в H плохая практика. Переменные нужно объявлять в ino, cpp файлах, а в H файлах писать extern int i;
Это в двух словах.
Вообще, посмотрите примеры (не Ардуино) использования H файлов.

BSHON
Offline
Зарегистрирован: 05.06.2015

1 и 2 - файл подключен 2 раза как раз тестировал  ifndef, define. Полное понимание как делать. Просто не убрал строчку когда выкладывал :( Извиняюсь. 

3. Спасибо!  

Основная проблема, что не хочет цеплять sdi.h и прочие стандартные файлы.

При этом   inttypes.h компилятор пропускает.

Файл .h который был.

#ifndef IFDEFTEST
#define IFDEFTEST
 
#include <SPI.h>
#include <SD.h>
 
 
#define SENSOR 
 
#ifdef SENSOR
int i = 123;
#else // SENSOR 
int i = 989;
#endif // SENSOR 
 
#endif // IFDEFTEST
 
Если перенести в скетч sdi.h и sd.h файлы все работает.
Но для меня это не решает задачу.
 
Если в скетче использовать ifdef и пр - компилятор работает криво ( у меня да и в интернете много об этом написано)
 
Если убрать в свой .h файл - работает с переменными, но не позволяет вставить туда библиотеки. 
 
 
 
 
Logik
Offline
Зарегистрирован: 05.08.2014

Попробуйте заглянуть в папку типа "..\Documents and Settings\User\Local Settings\Temp\build*.tmp" Там можна найти файл cpp с именем как у вашего проекта. Это то, во что превратился Ваш скетч ino. Посмотрите этот cpp, сравните с скетчем. Думаю ответ найдется.

BSHON
Offline
Зарегистрирован: 05.06.2015

Спасибо.

Интересно было посмотреть.

Но там практически 100% ino файл. :(

Проблема не решена :((((

Никто не пользуется  ifdef (и пр) ?

 

 

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Пример в начальном сообщении не содержит ifdef, другие куски вставлены некорректно, да и собирать их по аэродрому нет времени.
Приложите конкретный пример и какая ошибка возникает, я посмотрю.
Есть на эту тему "проблемы" но их можно решить. Уже об этом писали и решение было. Вот бы ещё вспомнить где :)

Datak
Offline
Зарегистрирован: 09.10.2014

Когда-то тоже плевался, из-за того что не мог понять как работает этот дополнительный ino-препроцессор. В конце концов, просто оставил файл .ino пустым, или почти пустым, а всё содержимое перенёс в отдельный .cpp файл.

Вполне стандартный файл, со стандартным и давно документированным препроцессором и компилятором - это, по-моему, лучше чем новоиспечённая и малопонятная ардуиновская самоделка.

BSHON
Offline
Зарегистрирован: 05.06.2015

Вот тут поподробнее, плз.

Если я пользуюсь "стандартным" компилятором, как потом это в ардуину загрузить?

Datak
Offline
Зарегистрирован: 09.10.2014

BSHON пишет:

Выдает ошибку :

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> 
 
А если конкретно об этой ошибке - компилятор же просто не нашёл нужный файл.
Проверьте, где лежит файл в который включается SPI.h, и где сам этот SPI.h.
 
Если они не в одном каталоге, то компилятору придётся как-то объяснить, где конкретно искать включаемые файлы. То есть, или изменить настройки ардуиновской среды (скорее всего в соответствующем конфигурационном файле), или попробовать добавить нужный путь к системной переменной PATH - это уже в ностройках Windows, или под чем вы компилите, не знаю.
 
Ну, или просто указать в #include полный путь к файлу SPI.h.
Datak
Offline
Зарегистрирован: 09.10.2014

BSHON пишет:

Вот тут поподробнее, плз.

Если я пользуюсь "стандартным" компилятором, как потом это в ардуину загрузить?

Загружать как обычно. Ардуиновская среда сама пользуется вполне "стандартным" компилятором.

Но .ino файлы она ещё предварительно как-то обрабатывает - считается, что это упрощает программирование для неопытных пользователей.

Для .C и .CPP файлов такая дополнительная обработка не выполняется, поэтому при их компиляции никаких недокументированных неожиданностей скорее всего не будет.

BSHON
Offline
Зарегистрирован: 05.06.2015

Спасибо. 

Смысл ошибки, я понимаю.

Работаю в стандартной среде ардуино.

Проблема в том, что среда работает корректно если spi.h находится в .ino файле.

Как только я выношу его в свой .h файл - ошибка. Те компилятор не корректно всталяет мой .h файл. Боюсь что корректировкой "путей" это не исправить. Хотя попробую. Очень хочется пользоваться ifdef.