Help in OOP

V

vsrajput

Hi guys

I am not good OOP programmer ,trying to implement my already working
code in OOP.

I have somthing like this class.

class Datalogger{
public:
UINT Port;
BOOL bReady ;

Datalogger (UINT x ,bool y);
~Datalogger ();

bool LOpen ();
bool LStatus ();

};


Everything is OK till "bool LStatus ();"

bool LStatus ()
{
...... Here I have bunch of stuff;
but I get problem here

Waitforevent( Port , INFINTE , &bReady)
if(bReady)
{
.......
.....some stuff ;
.......

}
}


Where "Waitforevent" is fucntion came with driver of my I/O board .I
did not make this function.
it gives
bReady= true on events.

My question is that "CAN I USE member variable like this"
I means Can I use address of member variable to some function.
 
P

Phlip

vsrajput said:
I am not good OOP programmer ,trying to implement my already working
code in OOP.

If that's just a learning thing that's cool. Don't do that on the job
because you shouldn't spend too much time changing code that already works.
I have somthing like this class.

class Datalogger{
public:
UINT Port;
BOOL bReady ;

Does anything assign bReady?

What did the following code look like before you OOP-ed it?
Waitforevent( Port , INFINTE , &bReady)
if(bReady)
Where "Waitforevent" is fucntion came with driver of my I/O board .I
did not make this function.
it gives
bReady= true on events.

Try adding this to the constructor:

Datalogger::Datalogger(UINT x ,bool y): bReady(false) {}
My question is that "CAN I USE member variable like this"
I means Can I use address of member variable to some function.

Yes, because the variable lives longer than the call to Waitforevent().
However, your variable might now contain garbage, and Waitforevent() might
read bReady's value and expect true or false.
 
V

Victor Bazarov

I have somthing like this class.

class Datalogger{
public:
UINT Port;
BOOL bReady ;

Datalogger (UINT x ,bool y);
~Datalogger ();

bool LOpen ();
bool LStatus ();

};


Everything is OK till "bool LStatus ();"

bool LStatus ()
{
..... Here I have bunch of stuff;
but I get problem here

Waitforevent( Port , INFINTE , &bReady)
if(bReady)
{
......
....some stuff ;
......

}
}


Where "Waitforevent" is fucntion came with driver of my I/O board .I
did not make this function.
it gives
bReady= true on events.

My question is that "CAN I USE member variable like this"
I means Can I use address of member variable to some function.

Sure. What's the problem you're encountering?

V
 
R

rageratwork

Hi guys

I am not good OOP programmer ,trying to implement my already working
code in OOP.

I have somthing like this class.

class Datalogger{
public:
UINT Port;
BOOL bReady ;

Datalogger (UINT x ,bool y);
~Datalogger ();

bool LOpen ();
bool LStatus ();

};


Everything is OK till "bool LStatus ();"

bool LStatus ()
{
..... Here I have bunch of stuff;
but I get problem here

Waitforevent( Port , INFINTE , &bReady)
if(bReady)
{
......
....some stuff ;
......

}
}


Where "Waitforevent" is fucntion came with driver of my I/O board .I
did not make this function.
it gives
bReady= true on events.

My question is that "CAN I USE member variable like this"
I means Can I use address of member variable to some function.

Yes you can...

....but in this case why? From what you have written, it looks like it
might be better if bReady was a local variable of LStatus(). Unless you
need to use the value in bReady somewhere else...

Dave
 
V

vsrajput

Hi guys ,

Thanks for your reply

Actually I want to use bReady in both member functions LStatus and
LOpen.

Thats why I didnt define bReady as local variable in LStatus.

But I solved my problem from ur suggestion.
What I did is follow.

bool LStatus ()
{
bool bbReady ; // defined one local variable
bbReady = bReady

Waitforevent( Port , INFINTE , &bbReady)
if(bbReady)
{
.......
.....some stuff ;
.......

}
}


Now everything is fine.
But I didnt understand why is this happing ,why cant I directly use
class member variable inside LStatus.
and If I make another copy of that variable inside LStatus ,then its
fine ??
Can anyone explain to me ??
 
V

Victor Bazarov

Actually I want to use bReady in both member functions LStatus and
LOpen.

Thats why I didnt define bReady as local variable in LStatus.

But I solved my problem from ur suggestion.
What I did is follow.

bool LStatus ()
{
bool bbReady ; // defined one local variable
bbReady = bReady

There is no need in a separate assignment. Initialise!

bool bbReady = bReady;
Waitforevent( Port , INFINTE , &bbReady)
if(bbReady)
{
......
....some stuff ;
......

}
}


Now everything is fine.
But I didnt understand why is this happing ,why cant I directly use
class member variable inside LStatus.

You can. Who said you couldn't?
and If I make another copy of that variable inside LStatus ,then its
fine ??

What's the difference now? Did you have any problem before?
Can anyone explain to me ??

Explain what?

V
 
V

vsrajput

Yeah I understand i didnt need to do it in two statement. I can
initialise with declaration.

now my question is that i have a class .
class Datalogger{
public:
UINT Port;
BOOL bReady ;
Datalogger (UINT x ,bool y);
~Datalogger ();
bool LOpen ();
bool LStatus ();
};

Datalogger::Datalogger(UINT x ,bool y){
Port = x;
bReady=y;}

Datalogger::LOpen(){

.....
.....
// it is also using bReady and Port and doing other stuff
....
}

Datalogger::LStatus()
{
//it is also using bReady and Port in following manner.
Waitforevent( Port , INFINTE , &bReady) // waitforevent is a function
come with I/O driver
// It waits
for event and on event it makes bReady=true;
if(bReady)
{
.......
.....some stuff ;
.......
}
}

But if I am using bReady in this manner ,it gives in run time error and
program crashes.
 
V

vsrajput

Yeah I understand i didnt need to do it in two statement. I can
initialise with declaration.

now my question is that i have a class .
class Datalogger{
public:
UINT Port;
BOOL bReady ;
Datalogger (UINT x ,bool y);
~Datalogger ();
bool LOpen ();
bool LStatus ();
};

Datalogger::Datalogger(UINT x ,bool y){
Port = x;
bReady=y;}

Datalogger::LOpen(){

.....
.....
// it is also using bReady and Port and doing other stuff
....
}

Datalogger::LStatus()
{
//it is also using bReady and Port in following manner.
Waitforevent( Port , INFINTE , &bReady) // waitforevent is a function
come with I/O driver
// It waits
for event and on event it makes bReady=true;
if(bReady)
{
.......
.....some stuff ;
.......
}
}

But if I am using bReady in this manner ,it gives in run time error and
program crashes.
 
R

rageratwork

Hi guys ,

Thanks for your reply

Actually I want to use bReady in both member functions LStatus and
LOpen.

Ok, that's fine. Then you don't need the local variable.
But I didnt understand why is this happing ,why cant I directly use
class member variable inside LStatus.

You can. There is no problem there.

Dave.
 
P

Phlip

vsrajput said:
Thanks for your reply

Does bReady contain garbage or did you make sure it's assigned correctly?
Actually I want to use bReady in both member functions LStatus and
LOpen.

Does it convey a value between those two functions?

Never re-use a variable for a separate purpose, and never "prematurely
optimize". Making the variable a member won't make it faster or anything.
Just make it local.
bool LStatus ()
{
bool bbReady ; // defined one local variable
bbReady = bReady

You are missing a ;. This suggests you are not copying and pasting code into
your editor. Copying will be more accurate.
Waitforevent( Port , INFINTE , &bbReady)
Now everything is fine.
But I didnt understand why is this happing ,why cant I directly use
class member variable inside LStatus.

You can. Something else is going on. Does Waitforevent() store the address
of its argument so something can use it later, after the Waitforevent()
returns?
and If I make another copy of that variable inside LStatus ,then its
fine ??
Can anyone explain to me ??

Not with the current information. You probably still have undefined
behavior. That means anything could happen, including the program appears to
work correctly.

Specifically, using the & could lead to memory corruption. However, some
corruption doesn't crash a program immediately.

Write a unit test that stresses your class, and Waitforevent(), and if you
are still corrupting memory, calling the unit test many times may reveal the
corruption. However, it may reveal as a crash far from the source of your
bug.
 
V

Victor Bazarov

Yeah I understand i didnt need to do it in two statement. I can
initialise with declaration.

Please use quoting when replying. It is useful [for others] to
see what you're replying to.
now my question is that i have a class .
class Datalogger{
public:
UINT Port;
BOOL bReady ;

Why are those data members public, BTW?
Datalogger (UINT x ,bool y);
~Datalogger ();
bool LOpen ();
bool LStatus ();
};

Datalogger::Datalogger(UINT x ,bool y){
Port = x;
bReady=y;}

Prefer initialisation over assignment. See FAQ about that.
Datalogger::LOpen(){

bool Datalogger::LOpen(){
....
....
// it is also using bReady and Port and doing other stuff
...
}

Datalogger::LStatus()

bool Datalogger::LStatus()
{
//it is also using bReady and Port in following manner.
Waitforevent( Port , INFINTE , &bReady) // waitforevent is a function
come with I/O driver
// It waits
for event and on event it makes bReady=true;
OK.

if(bReady)
{
......
....some stuff ;
......
}
}

But if I am using bReady in this manner ,it gives in run time error
and program crashes.

Are you sure you're calling it for a valid object? What's the "this"
value in that function? How do you call this function?

V
 
P

Phlip

vsrajput said:
Yeah I understand i didnt need to do it in two statement. I can
initialise with declaration.

Please include the replied-to text. Google makes this possible with
Reply->Preview->Edit. (Without that sequence, Google optimizes your post for
their viewer program, which not everyone uses.)
Datalogger::Datalogger(UINT x ,bool y){
Port = x;
bReady=y;}

Okay. Post the code that calls Datalogger.
 
J

Joe Van Dyk

Hi guys

I am not good OOP programmer ,trying to implement my already working
code in OOP.

I have somthing like this class.

class Datalogger{
public:
UINT Port;

unsigned int Port;
BOOL bReady ;

bool bReady;
Datalogger (UINT x ,bool y);

Datalogger (unsigned int x, bool y);
~Datalogger ();

bool LOpen ();
bool LStatus ();

};


Everything is OK till "bool LStatus ();"

bool LStatus ()
{
..... Here I have bunch of stuff;
but I get problem here

Waitforevent( Port , INFINTE , &bReady)
if(bReady)
{
......
....some stuff ;
......

}
}


Where "Waitforevent" is fucntion came with driver of my I/O board .I
did not make this function.
it gives
bReady= true on events.

My question is that "CAN I USE member variable like this"
I means Can I use address of member variable to some function.

Do you initialize bReady in the constructor initialization list?
 
J

Joe Van Dyk

Yeah I understand i didnt need to do it in two statement. I can
initialise with declaration.

now my question is that i have a class .
class Datalogger{
public:
UINT Port;
BOOL bReady ;
Datalogger (UINT x ,bool y);
~Datalogger ();
bool LOpen ();
bool LStatus ();
};

Datalogger::Datalogger(UINT x ,bool y){
Port = x;
bReady=y;}

Horrible names, these are. Change 'x' and 'y' to something more meaningful.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,770
Messages
2,569,583
Members
45,073
Latest member
DarinCeden

Latest Threads

Top