Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. Managed C++/CLI
  4. Reference Casting question.

Reference Casting question.

Scheduled Pinned Locked Moved Managed C++/CLI
questioncsharp
17 Posts 3 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • P Offline
    P Offline
    peterdrozd
    wrote on last edited by
    #1

    Hello I am having real trouble with the following code.

    System::Boolean vDataEvent16::IsSet::get()
    {
    System::Boolean data = (System::Boolean)(((* _Event) & 0x01) != false);
    return data;
    }

    I get an invalid cast exception. How would I overcome this? :omg: _Event is defined as a System::UInt16 ^ _Event and is passed in from C# assembly to the class constructor. I wanted to use unions with some structs to view bits in the struct as individual properties but I could not cast the System::UInt16 to an unsigned short or rather to an unmanaged value type either. Any suggesions Really appreciate the response. thanks -Peter

    L M 2 Replies Last reply
    0
    • P peterdrozd

      Hello I am having real trouble with the following code.

      System::Boolean vDataEvent16::IsSet::get()
      {
      System::Boolean data = (System::Boolean)(((* _Event) & 0x01) != false);
      return data;
      }

      I get an invalid cast exception. How would I overcome this? :omg: _Event is defined as a System::UInt16 ^ _Event and is passed in from C# assembly to the class constructor. I wanted to use unions with some structs to view bits in the struct as individual properties but I could not cast the System::UInt16 to an unsigned short or rather to an unmanaged value type either. Any suggesions Really appreciate the response. thanks -Peter

      L Offline
      L Offline
      led mike
      wrote on last edited by
      #2

      peterdrozd wrote:

      I get an invalid cast exception.

      In VS2008 I cannot reproduce the exception

      led mike

      1 Reply Last reply
      0
      • P peterdrozd

        Hello I am having real trouble with the following code.

        System::Boolean vDataEvent16::IsSet::get()
        {
        System::Boolean data = (System::Boolean)(((* _Event) & 0x01) != false);
        return data;
        }

        I get an invalid cast exception. How would I overcome this? :omg: _Event is defined as a System::UInt16 ^ _Event and is passed in from C# assembly to the class constructor. I wanted to use unions with some structs to view bits in the struct as individual properties but I could not cast the System::UInt16 to an unsigned short or rather to an unmanaged value type either. Any suggesions Really appreciate the response. thanks -Peter

        M Offline
        M Offline
        Mark Salsbery
        wrote on last edited by
        #3

        peterdrozd wrote:

        != false

        You're comparing a UInt16 with false. That should be != 0

        System::Boolean vDataEvent16::IsSet::get()
        {
        return (((*_Event) & 0x01) != 0);
        }

        Mark Salsbery Microsoft MVP - Visual C++ :java:

        L P 2 Replies Last reply
        0
        • M Mark Salsbery

          peterdrozd wrote:

          != false

          You're comparing a UInt16 with false. That should be != 0

          System::Boolean vDataEvent16::IsSet::get()
          {
          return (((*_Event) & 0x01) != 0);
          }

          Mark Salsbery Microsoft MVP - Visual C++ :java:

          L Offline
          L Offline
          led mike
          wrote on last edited by
          #4

          Did you reproduce the exception? Using what version of C++?

          led mike

          M 1 Reply Last reply
          0
          • L led mike

            Did you reproduce the exception? Using what version of C++?

            led mike

            M Offline
            M Offline
            Mark Salsbery
            wrote on last edited by
            #5

            led mike wrote:

            Did you reproduce the exception?

            No sir (VS 2008 SP1). I don't know what's up with that - not enough info for me. :)

            Mark Salsbery Microsoft MVP - Visual C++ :java:

            L 1 Reply Last reply
            0
            • M Mark Salsbery

              peterdrozd wrote:

              != false

              You're comparing a UInt16 with false. That should be != 0

              System::Boolean vDataEvent16::IsSet::get()
              {
              return (((*_Event) & 0x01) != 0);
              }

              Mark Salsbery Microsoft MVP - Visual C++ :java:

              P Offline
              P Offline
              peterdrozd
              wrote on last edited by
              #6

              I tried it and it does not work. It may be that I separated the class to a header file from the implemenation.

              System::Boolean DataEvent16::IsActive::get()
              {
              System::Boolean data = (System::Boolean)(((* _Event) & 0x02) != 0); <--fails here.
              return data;
              }

              header file
              property System::Boolean IsActive
              {
              System::Boolean get();
              }

              this still fails. I am trying to get bits from an unsigned short and pass back to C# the value of the bits. I tried a union with a structure to define the bits and tried to set a variable that had all the bits as a System::UInt16 but it would not let me assign the * (System::Uint16 ^ ) to the unmanaged data type so I had to switch gears and try this method. doing a return when the class is implemented inline works fine however I can not use the class in another CPP file as a class variable because I could not make one class aware of the other with out a header. so I separated them. this led to problems with visual studio 2005 C++ CLI This should be a simple item but it's starting to take up so much time. :sigh: thanks -- Pete :)

              modified on Thursday, September 11, 2008 11:34 AM

              M 2 Replies Last reply
              0
              • M Mark Salsbery

                led mike wrote:

                Did you reproduce the exception?

                No sir (VS 2008 SP1). I don't know what's up with that - not enough info for me. :)

                Mark Salsbery Microsoft MVP - Visual C++ :java:

                L Offline
                L Offline
                led mike
                wrote on last edited by
                #7

                Mark Salsbery wrote:

                I don't know what's up with that - not enough info for me.

                Yeah I know, I plugged this in and ran it just fine

                System::Boolean data = (System::Boolean)(((* _Event) & 0x01) != false);

                led mike

                M 1 Reply Last reply
                0
                • P peterdrozd

                  I tried it and it does not work. It may be that I separated the class to a header file from the implemenation.

                  System::Boolean DataEvent16::IsActive::get()
                  {
                  System::Boolean data = (System::Boolean)(((* _Event) & 0x02) != 0); <--fails here.
                  return data;
                  }

                  header file
                  property System::Boolean IsActive
                  {
                  System::Boolean get();
                  }

                  this still fails. I am trying to get bits from an unsigned short and pass back to C# the value of the bits. I tried a union with a structure to define the bits and tried to set a variable that had all the bits as a System::UInt16 but it would not let me assign the * (System::Uint16 ^ ) to the unmanaged data type so I had to switch gears and try this method. doing a return when the class is implemented inline works fine however I can not use the class in another CPP file as a class variable because I could not make one class aware of the other with out a header. so I separated them. this led to problems with visual studio 2005 C++ CLI This should be a simple item but it's starting to take up so much time. :sigh: thanks -- Pete :)

                  modified on Thursday, September 11, 2008 11:34 AM

                  M Offline
                  M Offline
                  Mark Salsbery
                  wrote on last edited by
                  #8

                  led mike and I can't reproduce the error. Here's how I tested:

                  UInt16 ^_Event = gcnew UInt16(4);
                  Boolean boolean = (((*_Event) & 0x01) != false);

                  You don't need the (System::Boolean) cast. The != operator already returns a boolean. The only thing I can think of based on the code you've shown is _Event isn't really a UInt16 ^. Mark

                  Mark Salsbery Microsoft MVP - Visual C++ :java:

                  P 1 Reply Last reply
                  0
                  • L led mike

                    Mark Salsbery wrote:

                    I don't know what's up with that - not enough info for me.

                    Yeah I know, I plugged this in and ran it just fine

                    System::Boolean data = (System::Boolean)(((* _Event) & 0x01) != false);

                    led mike

                    M Offline
                    M Offline
                    Mark Salsbery
                    wrote on last edited by
                    #9

                    I did this:

                    UInt16 ^ _Event = gcnew UInt16(4);
                    Boolean boolean = (((*_Event) & 0x01) != false);

                    *shrug*

                    Mark Salsbery Microsoft MVP - Visual C++ :java:

                    L 1 Reply Last reply
                    0
                    • M Mark Salsbery

                      led mike and I can't reproduce the error. Here's how I tested:

                      UInt16 ^_Event = gcnew UInt16(4);
                      Boolean boolean = (((*_Event) & 0x01) != false);

                      You don't need the (System::Boolean) cast. The != operator already returns a boolean. The only thing I can think of based on the code you've shown is _Event isn't really a UInt16 ^. Mark

                      Mark Salsbery Microsoft MVP - Visual C++ :java:

                      P Offline
                      P Offline
                      peterdrozd
                      wrote on last edited by
                      #10

                      here is part of the header file.

                      public ref class DataEvent16
                      {
                      private:
                      System::UInt16 ^ _Event;

                      public:
                          DataEvent16(System::UInt16 ^ Event);
                          DataEvent16();
                          property System::UInt16 RawData
                          {
                              System::UInt16 get();
                              void set ( System::UInt16 value);
                          }
                          property System::UInt16 IsSet
                          {
                              System::UInt16  get();
                          }
                          property System::Boolean IsActive
                          {
                              System::Boolean get();
                          }
                      

                      };

                      Implementation file

                      DataEvent16::vDataEvent16(System::UInt16 ^ Event)
                      {
                      _Event = Event;
                      }
                      DataEvent16::vDataEvent16()
                      {
                      _Event = gcnew System::UInt16(0);
                      }
                      System::Boolean vDataEvent16::IsActive::get()
                      {
                      System::Boolean data = (System::Boolean)(((* _Event) & 0x02) != 0);
                      return data;
                      }

                      this will compile but explode. on the boolean statement. I know it seems like overkill but I have tried several iterations. :)

                      M 2 Replies Last reply
                      0
                      • M Mark Salsbery

                        I did this:

                        UInt16 ^ _Event = gcnew UInt16(4);
                        Boolean boolean = (((*_Event) & 0x01) != false);

                        *shrug*

                        Mark Salsbery Microsoft MVP - Visual C++ :java:

                        L Offline
                        L Offline
                        led mike
                        wrote on last edited by
                        #11

                        Mark Salsbery wrote:

                        I did this:

                        and it didn't throw any exception right?

                        led mike

                        M 1 Reply Last reply
                        0
                        • P peterdrozd

                          I tried it and it does not work. It may be that I separated the class to a header file from the implemenation.

                          System::Boolean DataEvent16::IsActive::get()
                          {
                          System::Boolean data = (System::Boolean)(((* _Event) & 0x02) != 0); <--fails here.
                          return data;
                          }

                          header file
                          property System::Boolean IsActive
                          {
                          System::Boolean get();
                          }

                          this still fails. I am trying to get bits from an unsigned short and pass back to C# the value of the bits. I tried a union with a structure to define the bits and tried to set a variable that had all the bits as a System::UInt16 but it would not let me assign the * (System::Uint16 ^ ) to the unmanaged data type so I had to switch gears and try this method. doing a return when the class is implemented inline works fine however I can not use the class in another CPP file as a class variable because I could not make one class aware of the other with out a header. so I separated them. this led to problems with visual studio 2005 C++ CLI This should be a simple item but it's starting to take up so much time. :sigh: thanks -- Pete :)

                          modified on Thursday, September 11, 2008 11:34 AM

                          M Offline
                          M Offline
                          Mark Salsbery
                          wrote on last edited by
                          #12

                          Are you sure the C# side is providing a System::Uint16 ^ and not just a System::Uint16? A System::Uint16 ^ (reference to a value type) is kind of unconventional...

                          Mark Salsbery Microsoft MVP - Visual C++ :java:

                          1 Reply Last reply
                          0
                          • P peterdrozd

                            here is part of the header file.

                            public ref class DataEvent16
                            {
                            private:
                            System::UInt16 ^ _Event;

                            public:
                                DataEvent16(System::UInt16 ^ Event);
                                DataEvent16();
                                property System::UInt16 RawData
                                {
                                    System::UInt16 get();
                                    void set ( System::UInt16 value);
                                }
                                property System::UInt16 IsSet
                                {
                                    System::UInt16  get();
                                }
                                property System::Boolean IsActive
                                {
                                    System::Boolean get();
                                }
                            

                            };

                            Implementation file

                            DataEvent16::vDataEvent16(System::UInt16 ^ Event)
                            {
                            _Event = Event;
                            }
                            DataEvent16::vDataEvent16()
                            {
                            _Event = gcnew System::UInt16(0);
                            }
                            System::Boolean vDataEvent16::IsActive::get()
                            {
                            System::Boolean data = (System::Boolean)(((* _Event) & 0x02) != 0);
                            return data;
                            }

                            this will compile but explode. on the boolean statement. I know it seems like overkill but I have tried several iterations. :)

                            M Offline
                            M Offline
                            Mark Salsbery
                            wrote on last edited by
                            #13

                            I had to remove the 'v's (vDataEvent16, vDataEvent16) to get your code to compile, but it worked fine in VS 2008. Mark

                            Mark Salsbery Microsoft MVP - Visual C++ :java:

                            1 Reply Last reply
                            0
                            • L led mike

                              Mark Salsbery wrote:

                              I did this:

                              and it didn't throw any exception right?

                              led mike

                              M Offline
                              M Offline
                              Mark Salsbery
                              wrote on last edited by
                              #14

                              Correctamundo!

                              Mark Salsbery Microsoft MVP - Visual C++ :java:

                              1 Reply Last reply
                              0
                              • P peterdrozd

                                here is part of the header file.

                                public ref class DataEvent16
                                {
                                private:
                                System::UInt16 ^ _Event;

                                public:
                                    DataEvent16(System::UInt16 ^ Event);
                                    DataEvent16();
                                    property System::UInt16 RawData
                                    {
                                        System::UInt16 get();
                                        void set ( System::UInt16 value);
                                    }
                                    property System::UInt16 IsSet
                                    {
                                        System::UInt16  get();
                                    }
                                    property System::Boolean IsActive
                                    {
                                        System::Boolean get();
                                    }
                                

                                };

                                Implementation file

                                DataEvent16::vDataEvent16(System::UInt16 ^ Event)
                                {
                                _Event = Event;
                                }
                                DataEvent16::vDataEvent16()
                                {
                                _Event = gcnew System::UInt16(0);
                                }
                                System::Boolean vDataEvent16::IsActive::get()
                                {
                                System::Boolean data = (System::Boolean)(((* _Event) & 0x02) != 0);
                                return data;
                                }

                                this will compile but explode. on the boolean statement. I know it seems like overkill but I have tried several iterations. :)

                                M Offline
                                M Offline
                                Mark Salsbery
                                wrote on last edited by
                                #15

                                BTW thanks for providing code to test with :) What does the calling code look like?

                                Mark Salsbery Microsoft MVP - Visual C++ :java:

                                P 1 Reply Last reply
                                0
                                • M Mark Salsbery

                                  BTW thanks for providing code to test with :) What does the calling code look like?

                                  Mark Salsbery Microsoft MVP - Visual C++ :java:

                                  P Offline
                                  P Offline
                                  peterdrozd
                                  wrote on last edited by
                                  #16

                                  fixed it. I had to remove all references for that data. The problem was that I have some arguments that have to be passed as references. I have others that have to be passed as value types. the _Event is a value type. I was passing it in as a reference so in that function, I was referencing the pointer I think. So it would compile but the value was probably greater than max value. I guess this all came about because I have become accustomed to coding inline classes and not removing the class definition from the implementation. there are not too many good examples online that I found on how to do it right. thanks everyone for your help. -Peter :cool:

                                  M 1 Reply Last reply
                                  0
                                  • P peterdrozd

                                    fixed it. I had to remove all references for that data. The problem was that I have some arguments that have to be passed as references. I have others that have to be passed as value types. the _Event is a value type. I was passing it in as a reference so in that function, I was referencing the pointer I think. So it would compile but the value was probably greater than max value. I guess this all came about because I have become accustomed to coding inline classes and not removing the class definition from the implementation. there are not too many good examples online that I found on how to do it right. thanks everyone for your help. -Peter :cool:

                                    M Offline
                                    M Offline
                                    Mark Salsbery
                                    wrote on last edited by
                                    #17

                                    That's what I figured - I just wasn't sure why the C# side didn't complain about a mismatched argument. :) Cheers, Mark

                                    Mark Salsbery Microsoft MVP - Visual C++ :java:

                                    1 Reply Last reply
                                    0
                                    Reply
                                    • Reply as topic
                                    Log in to reply
                                    • Oldest to Newest
                                    • Newest to Oldest
                                    • Most Votes


                                    • Login

                                    • Don't have an account? Register

                                    • Login or register to search.
                                    • First post
                                      Last post
                                    0
                                    • Categories
                                    • Recent
                                    • Tags
                                    • Popular
                                    • World
                                    • Users
                                    • Groups