Ошибка переопределения класса Arduino

В своей Arduino IDE я настроил программу, которая запускает восемь светодиодов через сдвиговый регистр, и теперь я пытаюсь создать класс для управления сдвиговым регистром. До сих пор я создал файл и создал конструктор с несколькими функциями для класса, но когда я пытаюсь проверить код, IDE говорит, что я переопределяю класс shiftreg, вот сообщение об ошибке:

In file included from Lab9_step3.cpp:97:
shiftreg.h:2: error: redefinition of 'class shiftreg'
shiftreg.h:3: error: previous definition of 'class shiftreg'

и мой код для lab_9:

 /*     ---------------------------------------------------------
 *     |  Arduino Experimentation Kit Example Code             |
 *     |  CIRC-05 .: 8 More LEDs :. (74HC595 Shift Register)   |
 *     ---------------------------------------------------------
 * 
 * We have already controlled 8 LEDs however this does it in a slightly
 * different manner. Rather than using 8 pins we will use just three
 * and an additional chip.
 *
 *
 */
#include "shiftreg.h"

//Pin Definitions
//Pin Definitions
//The 74HC595 uses a serial communication 
//link which has three pins
shiftreg a(2, 3, 4);

int sensorPin = 0;    // select the input pin for the potentiometer
int sensorValue = 0;  // variable to store the value coming from the sensor




/*
 * setup() - this function runs once when you turn your Arduino on
 * We set the three control pins to outputs
 */
void setup()
{
  a.pinmode();
}

/*
 * loop() - this function will start after setup finishes and then repeat
 * we set which LEDs we want on then call a routine which sends the states to the 74HC595
 */
void loop()                     // run over and over again
{ 
   for(int i = 0; i < 256; i++){
   a.update(i);

    // read the value from the sensor:
    sensorValue = analogRead(sensorPin); 

   delay(sensorValue); 
  }
}



    /******************************

    /*
     * updateLEDsLong() - sends the LED states set in ledStates to the 74HC595
     * sequence. Same as updateLEDs except the shifting out is done in software
     * so you can see what is happening.
     */ 
//    void updateLEDsLong(int value){
//      digitalWrite(latch, LOW);    //Pulls the chips latch low
//      for(int i = 0; i < 8; i++){  //Will repeat 8 times (once for each bit)
//      int bit = value & B10000000; //We use a "bitmask" to select only the eighth 
//                                   //bit in our number (the one we are addressing this time thro
//                        //ugh
//      value = value << 1;          //we move our number up one bit value so next time bit 7 will
//                        // be
//                                   //bit 8 and we will do our math on it
//      if(bit == 128){digitalWrite(data, HIGH);} //if bit 8 is set then set our data pin high
//      else{digitalWrite(data, LOW);}            //if bit 8 is unset then set the data pin low
//      digitalWrite(clock, HIGH);                //the next three lines pulse the clock pin
//      delay(1);
//      digitalWrite(clock, LOW);
//      }
//      digitalWrite(latch, HIGH);  //pulls the latch high shifting our data into being displayed
//    }
//    
//    
//    //These are used in the bitwise math that we use to change individual LEDs
//    //For more details http://en.wikipedia.org/wiki/Bitwise_operation
//    int bits[] = {B00000001, B00000010, B00000100, B00001000, B00010000, B00100000, B01000000, B10000000};
//    int masks[] = {B11111110, B11111101, B11111011, B11110111, B11101111, B11011111, B10111111, B01111111};
//    /*
//     * changeLED(int led, int state) - changes an individual LED 
//     * LEDs are 0 to 7 and state is either 0 - OFF or 1 - ON
//     */
//     void changeLED(int led, int state){
//       ledState = ledState & masks[led];  //clears ledState of the bit we are addressing
//       if(state == ON){ledState = ledState | bits[led];} //if the bit is on we will add it to le
//                        //dState
//       updateLEDs(ledState);              //send the new LED state to the shift register
//     }
//     **********************************/

и мой код для shiftreg.h:

/*Shift Register
*/               (Error occurs here)
class shiftreg   (and here)
{
  private:
    //Pin Definitions
    //Pin Definitions
    //The 74HC595 uses a serial communication 
    //link which has three pins
    int data; 
    int clock;
    int latch;

  public:
  shiftreg (int _data, int _clock, int _latch);
  void update(int value);
  void pinmode();
};

и мой код для shiftreg.cpp:

#include "shiftreg.h"

/*shiftreg constructor:
*/
shiftreg::shiftreg (int _data, int _clock, int _latch)
{
    data = _data; 
    clock = _clock;
    latch = _latch;

    //Used for single LED manipulation
    int ledState = 0;
    const int ON = HIGH;
    const int OFF = LOW;
}

/*
 * updateLEDs() - sends the LED states set in ledStates to the 74HC595
 * sequence
 */
void shiftreg::update(int value)
{
  digitalWrite(latch, LOW);     //Pulls the chips latch low
  shiftOut(data, clock, MSBFIRST, value); //Shifts out the 8 bits to the shift register
  digitalWrite(latch, HIGH);   //Pulls the latch high displaying the data
}

/*
*/
void shiftreg::pinmode()
{
    pinMode(data, OUTPUT);
    pinMode(clock, OUTPUT);
    pinMode(latch, OUTPUT);
}

Спасибо за помощь!


person cmpickle    schedule 25.10.2012    source источник


Ответы (1)


Судя по сообщению об ошибке, вы включаете shiftreg.h в строку 97 из Lab9_step3.cpp. Что находится на 96 строках выше этого? Ошибка скорее всего кроется где-то там.

Если бы мне пришлось угадывать, я бы сказал, что вы, прямо или косвенно, включаете shiftreg.h дважды (или более) в Lab9_step3.cpp, и ошибка возникает из-за того, что в вашем заголовочном файле нет включенных охранников.

Попробуйте добавить следующее в shiftreg.h

#ifndef SHIFTREG_H
#define SHIFTREG_H

class shiftreg
{
  // ...
};

#endif
person Praetorian    schedule 25.10.2012
comment
Благодарю вас! Я не знаю, как он думает, что я добавляю shiftreg.h в строку 97, мой код не заходит так далеко! Весь код для этого файла включен. но когда я сделал то, что вы сказали, и добавил охранников включения, это сработало как шарм! Являются ли включенные охранники чем-то специфичным для Arduino? или они просто обычно используются для C++? Раньше я проводил занятия в Emacs для c++, но для Arduino это мой первый опыт. - person cmpickle; 25.10.2012
comment
@cmpickle Они никоим образом не относятся к Arduino, на самом деле очень редко заголовочный файл C / C ++ не будет их содержать. Единственный случай, о котором я могу думать, когда они вам не нужны, - это когда вы выполняете некоторые трюки с препроцессором, многократно включая один и тот же файл. - person Praetorian; 25.10.2012