Go Down

Topic: Header file headaches (Read 401 times) previous topic - next topic

dougp

I managed to compile a library in this thread.  I then modified that code to use a . a virtual function which is, b . called by derived classes (shown below) - to avoid the complications with the 'type' parameter from the original. For the sake of clarity the derived classes are presently omitted .

Code: [Select]

/*
    Basic timer converted to polymorphic/inherited form.
    Utilizes virtual function to effect timer reset.

    reference Arduino.cc thread http://forum.arduino.cc/index.php?topic=567010.new#new
*/

// debounce disabled for users without the library
//#include <Bounce2.h>

#define BUTTON_PIN 6   // to enable the timer DIO6
#define RESET_PIN 8    // to reset a timer DIO8
#define externalLED1 7 //  +5--/\/\/-->|--DIO7

byte LED_PIN = 13;    // on board LED

// Instantiate a Bounce object
//Bounce debouncer = Bounce();

// create a class called 'PLCtimer'

class PLCtimer {
    /*
       This is the base class - All types:
       > produce a positive-going one-scan pulse 'os' upon reaching
       preset value.
       > respond to a reset command by setting accumulated value to
       zero and resetting done and tt.
       > set the done bit upon reaching preset.
    */

  public:
    unsigned long _Accumulator = 0;
    bool _Reset: 1;
    bool _Enable: 1;
    bool _Done: 1;
    bool _OSRise: 1;
    bool _Control: 1;

  private:
    unsigned long _Preset;
    unsigned long _CurrentMillis;
    unsigned long _LastMillis = 0;
    bool _TimerRunning: 1;
    bool _OSFall: 1;
    bool _OSRSetup: 1;
    bool _OSFSetup: 1;


  public:
    // constructor - permits setting of variables upon instantiation
    // Timers are instantiated with enable false by default

    PLCtimer::PLCtimer(unsigned long pre, boolean en = 0)
    {
      _Preset = pre;
      negativePresetWarning(pre); // preset validation
    }; // end constructor
    /*
       User-added error handler from pert @ Arduino.cc, post #13
       thread http://forum.arduino.cc/index.php?topic=559655.new#new
       Timers may not have a negative preset value.
    */
    void negativeError( void ) __attribute__((error("Negative PLCtimer preset! Check instantiations!")));
    void negativePresetWarning(unsigned long number) {
      if (number < 0) {
        negativeError();
      }
    }
    /*
      ===== Access functions for timer status/controls
    */
    // Allows to start/stop a timer
    void setEN(bool en) {
      _Enable = en;
    }
    // Allows to reset a timer
    void setres(bool res) {
      _Reset = res;
    }
    // Returns enable state of timer
    byte getEN() {
      return _Enable;
    }
    // Returns reset state of timer
    bool getres() {
      return _Reset;
    }
    // Returns done status of timer
    bool getDn() {
      return _Done;
    }
    // Returns timer timing state of timer
    bool getTt() {
      return _TimerRunning;
    }
    // Returns timer timing state of timer
    bool getIntv() {
      return _TimerRunning;
    }
    // Returns state of timer done rising one-shot
    bool getOSRise() {
      return _OSRise;
    }
    // Returns state of timer done falling one-shot
    bool getOSFall() {
      return _OSFall;
    }
  private:
    /*
       Virtual timer Reset function
       Reset conditions to be determined by descendants
    */
    virtual bool Reset();

  public:

    //    Function to operate timers created under PLCtimer
    //    ----------------------------------------
    //    Update timer accumulated value & condition
    //    flags 'tt' (timer timing) and 'dn' (done) based
    //    on timer type.
    //    Function returns boolean status of done, 'dn'
    //    ===========================

    boolean update() {
      _CurrentMillis = millis(); // Get system clock ticks
      if (_Enable or _Control) { // timer is enabled to run
        _Accumulator = _Accumulator + _CurrentMillis - _LastMillis;
        if (_Accumulator >= _Preset) { // timer done?
          _Accumulator = _Preset; // Don't let accumulator run away
          _Done = true;
        }
      }
      _LastMillis = _CurrentMillis;

      // 9/25/18 - Modified the virtual function Reset() to return
      // a boolean.  The derived classes now only return a yes/no
      // to the base class to handle resetting of done and clearing
      // of accumulator.
      // This saves 50+ bytes versus resetting in the derived classes.

      if ( Reset()) { // Find out if reset needed based on derived class' criteria.
        _Done = false;
        _Accumulator = 0;
      }
     
      /*
        ----- Generate a positive going one-shot pulse on timer done f-t transition
      */
      _OSRise = (_Done and _OSRSetup);
      _OSRSetup = !_Done;
      /*
        ----- and another positive going one-shot pulse on timer done t-f transition
      */
      _OSFall = (!_Done and _OSFSetup);
      _OSFSetup = _Done;
      /*
        ----- condition the timer timing status
      */
      if ((_Enable or _Control) and !_Done and !_Reset) {
        _TimerRunning = true;
      }
      else _TimerRunning = false;
      return _Done;
    }; // end of base class update Timer operation

} ; // end of class PLCtimer

void setup() {
}

void loop() {
 
} //end of loop


 

This does compile and I'm now trying to produce a library from this new code.  I have used the working library files from the other thread as a guide to producing the current one.  I am now getting this error:

mkdir C:\Users\Owner\AppData\Local\Temp\arduino_build_132568\sketch: Access is denied.
Error compiling for board Arduino/Genuino Uno.


No other Arduino sketches give this error so I've bollixed something up but don't have a clue - no lines are highlighted to indicate the error.  My idea was to get the base class to compile then incrementally add the derived classes.  The three files .ino, .cpp, .h are in separate tabs, attached below.  I put in what looks right but, I don't know.

I'm asking for some direction to find the cause of this error.
So two neutrinos went into a bar.  Nothing happened.  They were just passing through.

septillion

That error seems unrelated to the code... Seems a pure IDE error which thinks it may not access a file. Try restart.

Couple of remarks on the code:

It's pretty confusing to name the library completely different then the class.

The virtual functions are only part of the class definition aka in the .h

So are the variable declarations (which dangle at the end of the .cpp)

You should end the class definition with };

If you want to separate the declaration and initialization I think the value assignment should happen in the .cpp.

And if you make those changes, the compiler is right. 'number' in  negativePresetWarning() can't be negative so the check is useless.

So is it about 'en' in the constructor.

Use fricking code tags!!!!
I want x => I would like x, I need help => I would like help, Need fast => Go and pay someone to do the job...

NEW Library to make fading leds a piece of cake
https://github.com/septillion-git/FadeLed

dougp

That error seems unrelated to the code... Seems a pure IDE error which thinks it may not access a file. Try restart.
Thanks for the reply.  That did the trick!  At least the errors now can be seen and corrected.  I'll work on your recommendations.
So two neutrinos went into a bar.  Nothing happened.  They were just passing through.

dougp

OK, after restarting the IDE a new list of real errors appeared - these are resolved and the code compiled until I added the implementation for the first of the derived classes.
Code: [Select]
Multi_Timer.cpp:94: error: expected unqualified-id before ')' token

 OnDelay_tmr()::Multi_timer() {

             ^

Multi_Timer.cpp:97: error: expected unqualified-id before ')' token

 OnDelay_tmr() {

             ^

exit status 1
expected unqualified-id before ')' token


I've tried to make my code look like what's in Savitch's Problem Solving with C++ (5th ed.) in the section dealing with inheritance and derived classes but, no joy.

Main file

Code: [Select]


#include "Multi_Timer.h"

#define BUTTON_PIN 6   // to enable the timer DIO6
#define RESET_PIN 8    // to reset a timer DIO8
#define externalLED1 7 //  +5--/\/\/-->|--DIO7

byte LED_PIN = 13;    // on board LED

//Multi_timer wdt_01(1000UL);

void setup() {
}

void loop() {
}



                                .cpp file

Code: [Select]

#include "Multi_Timer.h"
#include "Arduino.h"

Multi_timer::Multi_timer(unsigned long pre)
{
  _Preset = pre;
  negativePresetWarning(pre); // preset validation
}; // end constructor

//  ===== Access functions for timer status/controls

void Multi_timer::setEN(bool en) {
  _Enable = en;
}

void Multi_timer::setres(bool res) {
  _Reset = res;
}

byte Multi_timer::getEN() {
  return _Enable;
}

bool Multi_timer::getres() {
  return _Reset;
}

bool Multi_timer::getDn() {
  return _Done;
}

bool Multi_timer::getTt() {
  return _TimerRunning;
}

bool Multi_timer::getIntv() {
  return _TimerRunning;
}

bool Multi_timer::getOSRise() {
  return _OSRise;
}

bool Multi_timer::getOSFall() {
  return _OSFall;
}

bool Multi_timer::Reset();

boolean Multi_timer::update() {
  _CurrentMillis = millis(); // Get system clock ticks
  if (_Enable or _Control) { // timer is enabled to run
    _Accumulator = _Accumulator + _CurrentMillis - _LastMillis;
    if (_Accumulator >= _Preset) { // timer done?
      _Accumulator = _Preset; // Don't let accumulator run away
      _Done = true;
    }
  }
  _LastMillis = _CurrentMillis;

//  if ( Multi_timer::Reset()) { // Find out if reset needed based on derived class' criteria.
//    _Done = false;
//    _Accumulator = 0;
 // }

  _OSRise = (_Done and _OSRSetup);
  _OSRSetup = !_Done;

  _OSFall = (!_Done and _OSFSetup);
  _OSFSetup = _Done;

  if ((_Enable or _Control) and !_Done and !_Reset) {
    _TimerRunning = true;
  }
  else _TimerRunning = false;
  return _Done;
/*
  unsigned long _Accumulator = 0;
  bool _Reset = false;
  bool _Enable = false;
  bool _Done = false;
  bool _OSRise = false;
  bool _Control = false;

  unsigned long _Preset;
  unsigned long _CurrentMillis;
  unsigned long _LastMillis = 0;
  bool _TimerRunning = false;
  bool _OSFall = false;
  bool _OSRSetup = false;
  bool _OSFSetup = false;
  */
}

OnDelay_tmr()::Multi_timer() {
}

OnDelay_tmr() {
  Reset() {
    return (_Reset or !_Enable);
  }
}



                     .h file

Code: [Select]

#ifndef MULTI_TIMER_H
#define MULTI_TIMER_H
#include "Arduino.h"

class Multi_timer {

  public:

    Multi_timer(unsigned long);

    void setEN(bool);

    void setres(bool);

    byte getEN();

    bool getres();

    bool getDn();

    bool getTt();

    bool getIntv();

    bool getOSRise();

    bool getOSFall();

  protected:

    virtual bool Reset();

  public:

    //    Function to operate timers created under Multi_timer
    boolean update();

  private:

    void negativeError( void ) __attribute__((error("Negative Multi_timer preset! Check instantiations!")));
    void negativePresetWarning(unsigned long number) {
      if (number < 0) {
        negativeError();
      }
    }

  public:
    unsigned long _Accumulator;
    bool _Reset: 1;
    bool _Enable: 1;
    bool _Done: 1;
    bool _OSRise: 1;
    bool _Control: 1;

  private:
    unsigned long _Preset;
    unsigned long _CurrentMillis;
    unsigned long _LastMillis;
    bool _TimerRunning: 1;
    bool _OSFall: 1;
    bool _OSRSetup: 1;
    bool _OSFSetup: 1;
}; //end of base class Multi_timer declarations

class OnDelay_tmr: public Multi_timer
{
  public:

    bool  Reset();
}; // End of class OnDelay_tmr

#endif


What exactly is "expected unqualified-id before ')' token" telling me?  I removed nearly all the comments in the attached code to get under the 9K limit.
So two neutrinos went into a bar.  Nothing happened.  They were just passing through.

septillion

Code: [Select]
OnDelay_tmr()::Multi_timer() {
That's indeed not valid.

Code: [Select]
class OnDelay_tmr: public Multi_timer
Already is all the inheritance. If you make an object of OnDelay_tmr it has all the functions of Multi_timer including the basic constructor. If you want to also call the Multi_timer(unsigned long) constructor when you construct the OnDelay_tmr you need to tell it just that:
Code: [Select]
OnDelay_tmr::OnDelay_tmr(unsigned long x) : Multi_timer(x){
}



PS Very weird to use Multi_Timer but OnDelay_tmr...
PPS I think it's even neater to give each class it's on files.
Use fricking code tags!!!!
I want x => I would like x, I need help => I would like help, Need fast => Go and pay someone to do the job...

NEW Library to make fading leds a piece of cake
https://github.com/septillion-git/FadeLed

dougp

PPS I think it's even neater to give each class it's on files.
That had not occurred to me.  I got on this virtual function track and got stuck.  After no real progress in a week my frustration level is such that I am ready to look at other means.

My understanding then is that there could be one folder, say 'timer.x', which would in turn contain the .h/.cpp files for each flavor of timer.  The main file has an #include "timer.h" and then one or more instantiations of the form

#include "timer.h"
// blah, blah
Timer OnDelay_tmr(1000UL);

Timer some_other_type(nnnUL);
etc.


Also, only the timers instantiated would occupy memory, any not instantiated would simply be omitted by the compiler.  Is this correct?
So two neutrinos went into a bar.  Nothing happened.  They were just passing through.

septillion

That's possible. This this would make the most sense, especially if you only want to use the TimerBaseClass as prototype.
Code: [Select]
Timer
- /scr.
-- Timer.h
-- TimerBaseClass.h
-- TimerBaseClass.cpp
-- TimerSomething.h
-- TimerSomething.cpp
-- TimerSomethingElse.h
-- TimerSomethingElse.cpp


In Timer.h you include al real classed (here TimerSomething.h and TimerSomethingElse.h) which will contain equally named classed.
And in each instance you include the base class.

BUT, I would not go for the name Timer for the library. It's so damn common it's very easy to come across a similar named library and break it... So 'DougpTimer' or 'WickedTimer' or something.
Use fricking code tags!!!!
I want x => I would like x, I need help => I would like help, Need fast => Go and pay someone to do the job...

NEW Library to make fading leds a piece of cake
https://github.com/septillion-git/FadeLed

dougp

That's possible. This this would make the most sense, especially if you only want to use the TimerBaseClass as prototype.


In Timer.h you include al real classed (here TimerSomething.h and TimerSomethingElse.h) which will contain equally named classed.
And in each instance you include the base class.
I'm unclear on this.  My thought was to make the folder and place in it only complete, standalone .h/.cpp files for each variant - no base class or other files involved.  If prototypes are still in use doesn't that imply inheritance/polymorphism?


// main file
#include "timer.h"
// blah blah
OnDelay timer1(1UL);
2nd_type timer2(3UL);

etc.
Where the folders contain:

// timer.h
#include "OnDelay.h"
#include "2nd_type.h"
#include "3rd_type.h"

// timer.cpp
#include "OnDelay.cpp"
#include "2nd_type.cpp"
#include "3rd_type.cpp"


BUT, I would not go for the name Timer for the library. It's so damn common it's very easy to come across a similar named library and break it... So 'DougpTimer' or 'WickedTimer' or something.
No, 'timer' is just for this conversation.  Final name will be more unique/descriptive.
So two neutrinos went into a bar.  Nothing happened.  They were just passing through.

septillion

You need to store that base class you inherent from somewhere, don't you?

Where the folders contain:
How can a folders contain includes? ???

No, 'timer' is just for this conversation.  Final name will be more unique/descriptive.
Great!
Use fricking code tags!!!!
I want x => I would like x, I need help => I would like help, Need fast => Go and pay someone to do the job...

NEW Library to make fading leds a piece of cake
https://github.com/septillion-git/FadeLed

dougp

Still stuck.  Back to the virtual Reset function.  The separate files is not a rabbit hole I want to go down - I'm in three levels already from where I started.  I have modified the code and tried to make it look like Savitch's - see post #4 - example ( he shows .h/.cpp files for base and derived classes ) but I'm getting these errors:

Code: [Select]

Multi_Timer.cpp:80: error: definition of implicitly-declared 'OnDelay_tmr::OnDelay_tmr()'

 OnDelay_tmr::OnDelay_tmr(): Multi_timer(pre)

                         ^

C:\Users\Owner\AppData\Local\Temp\arduino_build_456117\sketch\Multi_Timer.cpp: In function 'int Reset()':

Multi_Timer.cpp:85: error: '_Reset' was not declared in this scope

   return (_Reset or !_Enable);

           ^

Multi_Timer.cpp:85: error: '_Enable' was not declared in this scope

   return (_Reset or !_Enable);

                      ^

exit status 1
definition of implicitly-declared 'OnDelay_tmr::OnDelay_tmr()'


I appreciate @septillion's aid but the responses are too cryptic for this ossified brain.
This line, the constructor: OnDelay_tmr::OnDelay_tmr(): Multi_timer(pre) is structured like in the book yet it gives an error.  Bafflement.

main file:

Code: [Select]


#include "Multi_Timer.h"

#define BUTTON_PIN 6   // to enable the timer DIO6
#define RESET_PIN 8    // to reset a timer DIO8
#define externalLED1 7 //  +5--/\/\/-->|--DIO7

byte LED_PIN = 13;    // on board LED

Multi_timer wdt_01(1000UL);

void setup() {
}

void loop() {
}




.cpp file

Code: [Select]

#include "Multi_Timer.h"
#include "Arduino.h"

Multi_timer::Multi_timer(unsigned long pre)
{
  _Preset = pre;
  negativePresetWarning(pre); // preset validation
}; // end constructor

//  ===== Access functions for timer status/controls

void Multi_timer::setEN(bool en) {
  _Enable = en;
}

void Multi_timer::setres(bool res) {
  _Reset = res;
}

byte Multi_timer::getEN() {
  return _Enable;
}

bool Multi_timer::getres() {
  return _Reset;
}

bool Multi_timer::getDn() {
  return _Done;
}

bool Multi_timer::getTt() {
  return _TimerRunning;
}

bool Multi_timer::getIntv() {
  return _TimerRunning;
}

bool Multi_timer::getOSRise() {
  return _OSRise;
}

bool Multi_timer::getOSFall() {
  return _OSFall;
}

bool Multi_timer::Reset();

boolean Multi_timer::update() {
  _CurrentMillis = millis(); // Get system clock ticks
  if (_Enable or _Control) { // timer is enabled to run
    _Accumulator = _Accumulator + _CurrentMillis - _LastMillis;
    if (_Accumulator >= _Preset) { // timer done?
      _Accumulator = _Preset; // Don't let accumulator run away
      _Done = true;
    }
  }
  _LastMillis = _CurrentMillis;

  if ( Multi_timer::Reset()) { // Find out if reset needed based on derived class' criteria.
    _Done = false;
    _Accumulator = 0;
  }

  _OSRise = (_Done and _OSRSetup);
  _OSRSetup = !_Done;

  _OSFall = (!_Done and _OSFSetup);
  _OSFSetup = _Done;

  if ((_Enable or _Control) and !_Done and !_Reset) {
    _TimerRunning = true;
  }
  else _TimerRunning = false;
  return _Done;

}// end update

OnDelay_tmr::OnDelay_tmr(): Multi_timer(pre)
{
}

Reset() {
  return (_Reset or !_Enable);
}




.h file

Code: [Select]

#ifndef MULTI_TIMER_H
#define MULTI_TIMER_H
#include "Arduino.h"

class Multi_timer {

  public:

    Multi_timer(unsigned long pre);

    void setEN(bool);

    void setres(bool);

    byte getEN();

    bool getres();

    bool getDn();

    bool getTt();

    bool getIntv();

    bool getOSRise();

    bool getOSFall();

  protected:

    virtual bool Reset();

  public:

    //    Function to operate timers created under Multi_timer
    boolean update();

  private:

    void negativeError( void ) __attribute__((error("Negative Multi_timer preset! Check instantiations!")));
    void negativePresetWarning(unsigned long number) {
      if (number < 0) {
        negativeError();
      }
    }

  public:
    unsigned long _Accumulator;
    bool _Reset: 1;
    bool _Enable: 1;
    bool _Done: 1;
    bool _OSRise: 1;
    bool _Control: 1;

  private:
    unsigned long _Preset;
    unsigned long _CurrentMillis;
    unsigned long _LastMillis;
    bool _TimerRunning: 1;
    bool _OSFall: 1;
    bool _OSRSetup: 1;
    bool _OSFSetup: 1;
   
}; //end of base class Multi_timer declarations

class OnDelay_tmr: public Multi_timer
{
  public:

    bool  Reset();
}; // End of class OnDelay_tmr

#endif


The three files are together on separate IDE tabs.  Board = UNO

Can someone explain?
So two neutrinos went into a bar.  Nothing happened.  They were just passing through.

septillion

Mm, separate files is indeed a rabbit hole. But with inheritance you're already in that hole :D

But you header files doesn't define a constructor for OnDelay_tmr.

Next, if you add it, where is 'pre' supposed to come from? ;)
Use fricking code tags!!!!
I want x => I would like x, I need help => I would like help, Need fast => Go and pay someone to do the job...

NEW Library to make fading leds a piece of cake
https://github.com/septillion-git/FadeLed

dougp

But you header files doesn't define a constructor for OnDelay_tmr.
Thanks.  I will look at that again.

Next, if you add it, where is 'pre' supposed to come from? ;)
I dunno.  I'm at the point of Easter-egging it, just trying anything to see if some progress can be made.  999,999 more monkeys would be a help.
So two neutrinos went into a bar.  Nothing happened.  They were just passing through.

dougp

Excerpts from my latest efforts.Any suggestions?


.cpp file

Code: [Select]

OnDelay_tmr::OnDelay_tmr(): Multi_timer()
{
}
bool OnDelay_tmr::Reset() {
  return (_Reset or !_Enable);
};




.h file

Code: [Select]

class OnDelay_tmr: public Multi_timer
{
  public:
    OnDelay_tmr();
    bool  Reset();
}; // End of class OnDelay_tmr



Quote
C:\Users\Owner\AppData\Local\Temp\arduino_build_289517\sketch\Multi_Timer.cpp: In constructor 'OnDelay_tmr::OnDelay_tmr()':

Multi_Timer.cpp:81: error: no matching function for call to 'Multi_timer::Multi_timer()'

 OnDelay_tmr::OnDelay_tmr(): Multi_timer()

                                         ^

C:\Users\Owner\AppData\Local\Temp\arduino_build_289517\sketch\Multi_Timer.cpp:81:41: note: candidates are:

C:\Users\Owner\AppData\Local\Temp\arduino_build_289517\sketch\Multi_Timer.cpp:4:1: note: Multi_timer::Multi_timer(long unsigned int)

 Multi_timer::Multi_timer(unsigned long pre)

 ^

C:\Users\Owner\AppData\Local\Temp\arduino_build_289517\sketch\Multi_Timer.cpp:4:1: note:   candidate expects 1 argument, 0 provided

In file included from C:\Users\Owner\AppData\Local\Temp\arduino_build_289517\sketch\Multi_Timer.cpp:1:0:

C:\Users\Owner\AppData\Local\Temp\arduino_build_289517\sketch\Multi_Timer.h:5:7: note: constexpr Multi_timer::Multi_timer(const Multi_timer&)

 class Multi_timer {

       ^

C:\Users\Owner\AppData\Local\Temp\arduino_build_289517\sketch\Multi_Timer.h:5:7: note:   candidate expects 1 argument, 0 provided

C:\Users\Owner\AppData\Local\Temp\arduino_build_289517\sketch\Multi_Timer.h:5:7: note: constexpr Multi_timer::Multi_timer(Multi_timer&&)

C:\Users\Owner\AppData\Local\Temp\arduino_build_289517\sketch\Multi_Timer.h:5:7: note:   candidate expects 1 argument, 0 provided

exit status 1
no matching function for call to 'Multi_timer::Multi_timer()'
Any suggestions?

So two neutrinos went into a bar.  Nothing happened.  They were just passing through.

septillion

Please, if you change the code post all the code and error, both in code tags. Now it's a jigsaw puzzle...

But uhm
Code: [Select]
Multi_Timer.cpp:81: error: no matching function for call to 'Multi_timer::Multi_timer()'
That's true isn't it? There is NO parameter-less constructor of 'Multi_timer' so what you don't have you cannot call. ;)
Use fricking code tags!!!!
I want x => I would like x, I need help => I would like help, Need fast => Go and pay someone to do the job...

NEW Library to make fading leds a piece of cake
https://github.com/septillion-git/FadeLed

dougp

Please, if you change the code post all the code and error, both in code tags. Now it's a jigsaw puzzle...
Since only the OnDelay part was changed I thought to not clutter the thread/expend bandwidth.

None of these work in .cpp:81 -

OnDelay_tmr::OnDelay_tmr(): Multi_timer::Multi_timer(unsigned long)
expected primary-expression before 'unsigned'

OnDelay_tmr::OnDelay_tmr(): Multi_timer::Multi_timer(unsigned long pre)
expected primary-expression before 'unsigned'

OnDelay_tmr::OnDelay_tmr(): Multi_timer::Multi_timer(pre)
'pre' was not declared in this scope

OnDelay_tmr::OnDelay_tmr(): Multi_timer(pre)
'pre' was not declared in this scope

OnDelay_tmr::OnDelay_tmr(): Multi_timer(unsigned long)
expected primary-expression before 'unsigned'

OnDelay_tmr::OnDelay_tmr(): Multi_timer(unsigned long pre)
expected primary-expression before 'unsigned'
So two neutrinos went into a bar.  Nothing happened.  They were just passing through.

Go Up