Help in OOP

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • vsrajput@gmail.com

    Help in OOP

    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 "Waitforeve nt" 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.

  • Phlip

    #2
    Re: Help in OOP

    vsrajput wrote:
    [color=blue]
    > I am not good OOP programmer ,trying to implement my already working
    > code in OOP.[/color]

    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.
    [color=blue]
    > I have somthing like this class.
    >
    > class Datalogger{
    > public:
    > UINT Port;
    > BOOL bReady ;[/color]

    Does anything assign bReady?

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

    Try adding this to the constructor:

    Datalogger::Dat alogger(UINT x ,bool y): bReady(false) {}
    [color=blue]
    > My question is that "CAN I USE member variable like this"
    > I means Can I use address of member variable to some function.[/color]

    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.

    --
    Phlip
    http://c2.com/cgi/wiki?ZeekLand <-- NOT a blog!!!


    Comment

    • Victor Bazarov

      #3
      Re: Help in OOP

      vsrajput@gmail. com wrote:[color=blue]
      > 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 "Waitforeve nt" 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.[/color]

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

      V
      --
      Please remove capital 'A's when replying by e-mail
      I do not respond to top-posted replies, please don't ask


      Comment

      • rageratwork@gmail.com

        #4
        Re: Help in OOP

        vsrajput@gmail. com wrote:[color=blue]
        > 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 "Waitforeve nt" 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.[/color]

        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

        Comment

        • vsrajput@gmail.com

          #5
          Re: Help in OOP

          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 ??

          Comment

          • Victor Bazarov

            #6
            Re: Help in OOP

            vsrajput@gmail. com wrote:[color=blue]
            > 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[/color]

            There is no need in a separate assignment. Initialise!

            bool bbReady = bReady;
            [color=blue]
            >
            > 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.[/color]

            You can. Who said you couldn't?
            [color=blue]
            > and If I make another copy of that variable inside LStatus ,then its
            > fine ??[/color]

            What's the difference now? Did you have any problem before?
            [color=blue]
            > Can anyone explain to me ??[/color]

            Explain what?

            V
            --
            Please remove capital 'A's when replying by e-mail
            I do not respond to top-posted replies, please don't ask


            Comment

            • vsrajput@gmail.com

              #7
              Re: Help in OOP

              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::Dat alogger(UINT x ,bool y){
              Port = x;
              bReady=y;}

              Datalogger::LOp en(){

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

              Datalogger::LSt atus()
              {
              //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.

              Comment

              • vsrajput@gmail.com

                #8
                Re: Help in OOP

                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::Dat alogger(UINT x ,bool y){
                Port = x;
                bReady=y;}

                Datalogger::LOp en(){

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

                Datalogger::LSt atus()
                {
                //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.

                Comment

                • rageratwork@gmail.com

                  #9
                  Re: Help in OOP


                  vsrajput@gmail. com wrote:[color=blue]
                  > Hi guys ,
                  >
                  > Thanks for your reply
                  >
                  > Actually I want to use bReady in both member functions LStatus and
                  > LOpen.
                  >[/color]

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

                  You can. There is no problem there.

                  Dave.

                  Comment

                  • Phlip

                    #10
                    Re: Help in OOP

                    vsrajput wrote:
                    [color=blue]
                    > Thanks for your reply[/color]

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

                    Does it convey a value between those two functions?

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

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

                    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?
                    [color=blue]
                    > and If I make another copy of that variable inside LStatus ,then its
                    > fine ??
                    > Can anyone explain to me ??[/color]

                    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.

                    --
                    Phlip
                    http://c2.com/cgi/wiki?ZeekLand <-- NOT a blog!!!


                    Comment

                    • Victor Bazarov

                      #11
                      Re: Help in OOP

                      vsrajput@gmail. com wrote:[color=blue]
                      > Yeah I understand i didnt need to do it in two statement. I can
                      > initialise with declaration.[/color]

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

                      Why are those data members public, BTW?
                      [color=blue]
                      > Datalogger (UINT x ,bool y);
                      > ~Datalogger ();
                      > bool LOpen ();
                      > bool LStatus ();
                      > };
                      >
                      > Datalogger::Dat alogger(UINT x ,bool y){
                      > Port = x;
                      > bReady=y;}[/color]

                      Prefer initialisation over assignment. See FAQ about that.
                      [color=blue]
                      >
                      > Datalogger::LOp en(){[/color]

                      bool Datalogger::LOp en(){
                      [color=blue]
                      >
                      > ....
                      > ....
                      > // it is also using bReady and Port and doing other stuff
                      > ...
                      > }
                      >
                      > Datalogger::LSt atus()[/color]

                      bool Datalogger::LSt atus()
                      [color=blue]
                      > {
                      > //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;[/color]

                      OK.
                      [color=blue]
                      > if(bReady)
                      > {
                      > ......
                      > ....some stuff ;
                      > ......
                      > }
                      > }
                      >
                      > But if I am using bReady in this manner ,it gives in run time error
                      > and program crashes.[/color]

                      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
                      --
                      Please remove capital 'A's when replying by e-mail
                      I do not respond to top-posted replies, please don't ask


                      Comment

                      • Phlip

                        #12
                        Re: Help in OOP

                        vsrajput wrote:
                        [color=blue]
                        > Yeah I understand i didnt need to do it in two statement. I can
                        > initialise with declaration.[/color]

                        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.)
                        [color=blue]
                        > Datalogger::Dat alogger(UINT x ,bool y){
                        > Port = x;
                        > bReady=y;}[/color]

                        Okay. Post the code that calls Datalogger.

                        --
                        Phlip
                        http://c2.com/cgi/wiki?ZeekLand <-- NOT a blog!!!



                        Comment

                        • Joe Van Dyk

                          #13
                          Re: Help in OOP

                          vsrajput@gmail. com wrote:[color=blue]
                          > 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::Dat alogger(UINT x ,bool y){
                          > Port = x;
                          > bReady=y;}[/color]

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


                          Comment

                          • Joe Van Dyk

                            #14
                            Re: Help in OOP

                            vsrajput@gmail. com wrote:[color=blue]
                            > 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;[/color]

                            unsigned int Port;
                            [color=blue]
                            > BOOL bReady ;[/color]

                            bool bReady;
                            [color=blue]
                            >
                            > Datalogger (UINT x ,bool y);[/color]

                            Datalogger (unsigned int x, bool y);
                            [color=blue]
                            > ~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 "Waitforeve nt" 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.[/color]

                            Do you initialize bReady in the constructor initialization list?

                            Comment

                            Working...