Sketch doesnt compile after just Including a common library[SOLVED]

Hi…

So my lengthy sketch compiled just fine till I added the following include statement :

#include <LiquidCrystal_I2C.h>

Please note that I haven’t even used the library yet, haven’t called any of its functions. Only added the line above and then the compiler complains

“expected primary-expression before ‘static’” referring to the line static enum {…} see function below below.

This is a really long sketch and I wouldnt expect anyone to go through it. I am just looking for ideas on where to look for the problem. Why would a common library cause a compilation error in an otherwise working sketch?

Just to note, the following libraries are also included:

#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>
#include <avr/pgmspace.h>
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>

Commenting out the first line, the error disappears!

bool checkIncData_SM() {

  static enum  {IDLE, AA1, LEN, DATA} state;
  static int index;
  byte c;

  if (Serial1.available() < 1 ) { return false;  } // No data; stay in the current state
  while (Serial1.available()>0) {
  c = Serial1.read();                             // read the available data
  
  switch (state) {
  
  case IDLE:                                      // between packets; wait for first 0xAA
    if (c == 0xAA) {
      state = AA1;
      }
   
   break;                                         // Otherwise stay in IDLE.
  
  
  case AA1:                                      // Say first AA, waiting for the second
      if (c == 0xAA) {
        state = LEN;
        
   
      } else
        {state = IDLE;return false;}                // some sort of error
  
      break;
      
  
  case LEN:

    if (c == 0xAA) {break;}                           // Additional AA are ignored 
    if (c == 1) {
     
      overflowpackets++;
      state = IDLE;
      c=0;
      return false;
    }
    if (c > MAX_PACKET_SIZE  || c < 3)  {              // in case packet size is received out of range or 0, packet is droped 
     if (c > 0){
   
        
      overflowpackets++;}
     state = IDLE;
     c=0;
    // break;
     return false;
    }
    else{
    IncPacket[0] = c;             // save length
    index = 1;
    state = DATA;
    break;
    }
    
  case DATA:
    IncPacket[index++] = c;        // save data from pkt
    if (index == IncPacket[0]) {   // Was that the last byte of the packet?
      state = IDLE;                // ready to start another packet.
      index = 1;  
      return (Check_crc(IncPacket) );
  
       
    }
   
    break;
  } // end of switch
 
}
 return false;   // nothing to do yet, return null
}

Please post the full text of the error message

UKHeliBob:
Please post the full text of the error message

Using library LiquidCrystal_I2C in folder: D:\Dropbox\MCU\Controller_Firmware\libraries\LiquidCrystal_I2C (legacy)
Using library EEPROM at version 2.0 in folder: C:\Users\John\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.2\libraries\EEPROM 
Using library Wire at version 1.0 in folder: C:\Users\John\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.2\libraries\Wire 
Using library OneWire at version 2.3.5 in folder: D:\Dropbox\MCU\Controller_Firmware\libraries\OneWire 
Using library DallasTemperature at version 3.8.0 in folder: D:\Dropbox\MCU\Controller_Firmware\libraries\DallasTemperature 
exit status 1
expected primary-expression before 'static'

The below line is also left highlighted:

static enum {IDLE, AA1, LEN, DATA} state;

What about GitHub and conflicts? I clone the library and edit it but then I have two versions and you can’t choose one of them. So I have to delete the original from the arduino instalation or wherever it is to avoid the conflict.

alannaihs:
What about GitHub and conflicts?

You mean there are known conflicts with this library ?

Watcher:

Using library LiquidCrystal_I2C in folder: D:\Dropbox\MCU\Controller_Firmware\libraries\LiquidCrystal_I2C (legacy)

Using library EEPROM at version 2.0 in folder: C:\Users\John\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.2\libraries\EEPROM
Using library Wire at version 1.0 in folder: C:\Users\John\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.2\libraries\Wire
Using library OneWire at version 2.3.5 in folder: D:\Dropbox\MCU\Controller_Firmware\libraries\OneWire
Using library DallasTemperature at version 3.8.0 in folder: D:\Dropbox\MCU\Controller_Firmware\libraries\DallasTemperature
exit status 1
expected primary-expression before 'static'





The below line is also left highlighted:

static enum {IDLE, AA1, LEN, DATA} state;

Is that the full error message or just what you can see in the window at the bottom of the IDE editor without scrolling ? If you did not use the "Copy error messages" button then please use it and post the full error message

Oops… sorry! Here 's the whole thing.
Attached in text file as its too big…

(I know some warnings about unused variables etc…)

verbose.txt (26 KB)

Could it be that one of the states in your enum is also defined in the lcd library? I'd try prefixing all of them with an x or similar to see if you can get a clean compile that way.

And now the full sketch please

Did you note this error ?

BUS_Basic_Functions:283:39: error: 'state' was not declared in this scope

   static enum  {IDLE, AA1, LEN, DATA} state;

Thanks so much for looking into this for me!

No, I didnt notice the 'not declared in this scope' message.
It appears after the 'expected primary-expression before 'static' ' error and I tend to .. ignore any compiler errors after the first as they are usually misleading.

Again none of those errors appears if the above library in removed.

The sketch spans in 13 tabs - files!
Shall I zip the whole folder?

Shall I zip the whole folder?

It would be better if you could reproduce the problem with a much smaller sketch, but I realise that is difficult. By all means post the whole set of files but it is unlikely that many members will be able to compile it if it uses several (possibly obscure) libraries but it may still be possible to spot something wrong

Ok..i will try to size down the program to make things easier for everyine. I ll do it tomorrow.

By the way, it appears that the problem is somehow related to the above function.
Removing this function or replacing it with another without the enum clause (using blocking code) solves everything!
Same happens of course if the abive library is removed.

So, Ive managed to size down the sketch in just two functions and replicate the problem :

#include <LiquidCrystal_I2C.h>
#include <Wire.h> 
#include <avr/pgmspace.h>

const word CRC_TAB[]PROGMEM = { 
  0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 
  0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 
  0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, 
  0x9339, 0x8318, 0xb37b, 0xa35a,0xd3bd, 0xc39c, 0xf3ff, 0xe3de, 
  0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, 
  0xa56a, 0xb54b, 0x8528, 0x9509,0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, 
  0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, 
  0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 
  0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, 
  0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, 
  0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, 
  0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e,0x9b79, 0x8b58, 0xbb3b, 0xab1a, 
  0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03,0x0c60, 0x1c41, 
  0xedae, 0xfd8f, 0xcdec, 0xddcd,0xad2a, 0xbd0b, 0x8d68, 0x9d49, 
  0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, 
  0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,0x9f59, 0x8f78, 
  0x9188, 0x81a9, 0xb1ca, 0xa1eb,0xd10c, 0xc12d, 0xf14e, 0xe16f, 
  0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, 
  0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, 
  0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, 
  0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, 
  0x34e2, 0x24c3, 0x14a0, 0x0481,0x7466, 0x6447, 0x5424, 0x4405, 
  0xa7db, 0xb7fa, 0x8799, 0x97b8,0xe75f, 0xf77e, 0xc71d, 0xd73c, 
  0x26d3, 0x36f2, 0x0691, 0x16b0,0x6657, 0x7676, 0x4615, 0x5634, 
  0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, 
  0x5844, 0x4865, 0x7806, 0x6827,0x18c0, 0x08e1, 0x3882, 0x28a3, 
  0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8,0xabbb, 0xbb9a, 
  0x4a75, 0x5a54, 0x6a37, 0x7a16,0x0af1, 0x1ad0, 0x2ab3, 0x3a92, 
  0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 
  0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, 
  0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, 
  0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0 
}; 

byte IncPacket[80];

void setup() {
  Serial.begin(9600);                  // Initialise serial port for USB to PC
  Serial1.begin(9600,SERIAL_8E1);    // Initialise serial port for RS485   11 bits: start bit , 8 data bits, efficacy bit, stop bit
  Wire.begin();

}

void loop() {
  // put your main code here, to run repeatedly:

}


bool checkIncData_SM() {

  static enum  {IDLE, AA1, LEN, DATA} state;
  static int index;
  byte c;

  if (Serial1.available() < 1 ) { return false;  } // No data; stay in the current state
  while (Serial1.available()>0) {
  c = Serial1.read();                             // read the available data
  
  switch (state) {
  
  case IDLE:                                      // between packets; wait for first 0xAA
    if (c == 0xAA) {
      state = AA1;
      }
   
   break;                                         // Otherwise stay in IDLE.
  
  
  case AA1:                                      // Say first AA, waiting for the second
      if (c == 0xAA) {
        state = LEN;
        
   
      } else
        {state = IDLE;return false;}                // some sort of error
  
      break;
      
  
  case LEN:

    if (c == 0xAA) {break;}                           // Additional AA are ignored 
    if (c == 1) {
     
      
      state = IDLE;
      c=0;
      return false;
    }
    if (c > 78  || c < 3)  {              // in case packet size is received out of range or 0, packet is droped 
     if (c > 0){
    
        
      }
     state = IDLE;
     c=0;
    // break;
     return false;
    }
    else{
    IncPacket[0] = c;             // save length
    index = 1;
    state = DATA;
    break;
    }
    
  case DATA:
    IncPacket[index++] = c;        // save data from pkt
    if (index == IncPacket[0]) {   // Was that the last byte of the packet?
      state = IDLE;                // ready to start another packet.
      index = 1;  
      return (Check_crc(IncPacket) );
  //     {for (int x=0; x<tempPacket[0]; x++) {IncPacket[x]=tempPacket[x];}
  //      return true;}               // If pkt is good, return it to caller!
  //    else {return false;}         // indicate bad packet somehow?
       
    }
   
    break;
  } // end of switch
 
}
 return false;   // nothing to do yet, return null
}


// ****** CRC ROUTINES ******


bool Check_crc(byte *ptr ) {

  unsigned int crc; 
  byte dat; 
  crc=0; 
  byte len=ptr[0]-2;
  while(len--!=0) 
  { 
    dat=crc>>8; 
    crc<<=8; 
    // crc^= CRC_TAB [dat^*ptr]; // Original statement when array is stored in RAM
    crc^= pgm_read_word_near (&CRC_TAB [dat^*ptr]); 
    ptr++; 
  } 
  dat=crc; 
  if((*ptr==(crc>>8))&&(*(ptr+1)==dat)) 
  { 
    return(true);
  } 
  else 
  { 
    return(false);
  } 
}

If the first include statement is comented out, the program compiles.
You will notice that the LiquidCrystal_I2C library is not ever used. Its just included…

The problem is the DATA constant defined in the enum. My guess is that it conflicts with a variable of the same name used in the LCD library as previously suggested. Change the name used to DATAX and the code compiles

Indeed it does compile now!

Thank you sooo much! (Karma added!)

Just out of curiosity, how did you pinpoint this? Trial and error ?

how did you pinpoint this

See reply #7

See reply #7

Oops! I missed that one!

Wish I had seen it earlier!