Не компилируется если //#ifdef

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

Так все компилируется:

#define DISPLAY

#ifdef DISPLAY
  #include <Wire.h>
  #include <LiquidCrystal_I2C.h>
  LiquidCrystal_I2C lcd(0x20,16,2);
#else
  Serial.begin(9600);
#endif

void setup(){
  pinMode(13, OUTPUT);
}

void loop(){
}

Так не компилируется (отличие только в первой строке):

//#define DISPLAY

#ifdef DISPLAY
  #include <Wire.h>
  #include <LiquidCrystal_I2C.h>
  LiquidCrystal_I2C lcd(0x20,16,2);
#else
  Serial.begin(9600);
#endif

void setup(){
  pinMode(13, OUTPUT);
}

void loop(){
}

Почему?

com
Offline
Зарегистрирован: 06.09.2013

Serial.begin ни в сетапе, ни в лупе. низзя

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Это почему это еще нельзя ? По вашему как тогда менять скорость порта в процессе работы ? Скорее наоборот. В данном случае какая то странная конструкция. Если хотим дисплей, то подключаем библиотеки, а если нет - инициализируем уже где то подключенную. Причем не в коде, а как то директивно :) По сути вне какой либо подпрограммы. То есть Serial.begin обязан быть либо в сетапе, либо в лупе, либо в любой процедуре. А в коде сверху он вне какой либо процедуры. В космосе просто :)

com
Offline
Зарегистрирован: 06.09.2013

вы внимательно прочитайте, что я пишу, а то сначала меня опровергаете, а потом подтверждаете мои же слова

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

Tomasina пишет:

Почему?

А компилятор не сказал разве, почему он не компилирует? :)

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

компилятор, разумеется, сказал, только  это совершенно не в кассу, поэтому и пришлось вынести на обсуждение.

sketch_mar27a:16: error: expected constructor, destructor, or type conversion before '.' token
sketch_mar27a.ino: In function 'void setup()':
sketch_mar27a:16: error: 'OUTPUT' was not declared in this scope
sketch_mar27a:16: error: 'pinMode' was not declared in this scope

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

com пишет:
Serial.begin ни в сетапе, ни в лупе. низзя

Суть не в Serial.begin...

Так тоже не работает:

//#define DISPLAY

#ifdef DISPLAY
  #include <Wire.h>
  #include <LiquidCrystal_I2C.h>
  LiquidCrystal_I2C lcd(0x20,16,2);
#else
  #include <Wire.h>
#endif

void setup(){
  pinMode(13, OUTPUT);
}

void loop(){
}

 

com
Offline
Зарегистрирован: 06.09.2013

а!

нельзя переменные в блоках условной компиляции объявлять.

дело в 

LiquidCrystal_I2C lcd(0x20,16,2);

nevkon
Offline
Зарегистрирован: 20.01.2015

А вот так работает:

//#define DISPLAY

#ifdef DISPLAY
  #include <Wire.h>
  #include <LiquidCrystal_I2C.h>
  //LiquidCrystal_I2C lcd(0x20,16,2);
#endif

void setup(){
#ifndef DISPLAY
  Serial.begin(9600);
#endif
  pinMode(13, OUTPUT);
}

void loop(){
}

Но я считаю что запускать дисплей в условии не правильно. Можно отладку отключать, я применяю у себя:

#define DEBUG

....
void setup() {
#ifdef DEBUG
  Serial.begin(9600);
#endif
}
....

 

Radjah
Offline
Зарегистрирован: 06.08.2014

Для начала Serial.begin в setup().

Потом смотришь объявление контруктора для LiquidCrystal_I2C и выставляешь параметры правильно.

И где, черт возьми, текст ошибки?!

Услуги экстрасенса сильно платные на этом форуме.

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

Radjah пишет:
И где, черт возьми, текст ошибки?! Услуги экстрасенса сильно платные на этом форуме.

В посте #5. И, черт, возьми, мне несложно продублировать:

v2_0:12: error: expected constructor, destructor, or type conversion before '.' token
v2_0.ino: In function 'void setup()':
v2_0:16: error: 'OUTPUT' was not declared in this scope
v2_0:16: error: 'pinMode' was not declared in this scope

 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

nevkon пишет:
я считаю что запускать дисплей в условии не правильно. Можно отладку отключать, я применяю у себя:

#ifdef DEBUG я и так использую в других местах. В данном случае дисплей нужен эпизодически, именно для настройки параметров вывода. В планах было все, что с ним связано, в конечном релизе отключить одним комментарием, чтобы высвободить больше памяти.

Про преждевременный вызов setup уже понятно. Даже если убрать #else, все равно ругается, что мне странно - функции вызова и инициализации дисплея даже в примерах написаны до setup, мною лишь обернуты в условие:

//#define DISPLAY

#ifdef DISPLAY
  #include <Wire.h>
  #include <LiquidCrystal_I2C.h>
  LiquidCrystal_I2C lcd(0x20,16,2);
#endif

void setup(){
  pinMode(13, OUTPUT);
}

void loop(){
}
 
v2_0.ino: In function 'void setup()':
v2_0:14: error: 'OUTPUT' was not declared in this scope
v2_0:14: error: 'pinMode' was not declared in this scope
brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

com пишет:

Serial.begin ни в сетапе, ни в лупе. низзя

Вы сами себя внимательно почитайте. Или переведите то, что написали, для  стандартно мыслящих.