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. C / C++ / MFC
  4. Return bidimensional array

Return bidimensional array

Scheduled Pinned Locked Moved C / C++ / MFC
questiongraphicsdata-structures
13 Posts 6 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.
  • _ Offline
    _ Offline
    _Flaviu
    wrote on last edited by
    #1

    I have a class (taken from somewhere). Here, I have a member like this:

    public:
    void SetBitmapDataSize(const int x, const int y);

    private:
    int m_PixelNumberX;
    int m_PixelNumberY;
    vector > BitmapData;

    and SetBitmapDataSize is implemented:

    void CBitmapOp::SetBitmapDataSize(const int x, const int y)
    {
    m_PixelNumberX = x;
    m_PixelNumberY = y;
    if((x>=0) && (y>=0))
    {
    BitmapData.resize(m_PixelNumberX);
    for(int x = 0; x < m_PixelNumberX; x++)
    BitmapData[x].resize(m_PixelNumberY);
    }
    }

    Now, I want to replace vector > with this CArray: I had tried:

    private:
    int m_PixelNumberX;
    int m_PixelNumberY;
    CArray< CArray, CArray > m_arrBitmapData;

    my question is, how can replace vector.resize method, and how can I return CArray< CArray<COLORREF, COLORREF&>, CArray<COLORREF, COLORREF&> > data type ? Thank you.

    D C N R 4 Replies Last reply
    0
    • _ _Flaviu

      I have a class (taken from somewhere). Here, I have a member like this:

      public:
      void SetBitmapDataSize(const int x, const int y);

      private:
      int m_PixelNumberX;
      int m_PixelNumberY;
      vector > BitmapData;

      and SetBitmapDataSize is implemented:

      void CBitmapOp::SetBitmapDataSize(const int x, const int y)
      {
      m_PixelNumberX = x;
      m_PixelNumberY = y;
      if((x>=0) && (y>=0))
      {
      BitmapData.resize(m_PixelNumberX);
      for(int x = 0; x < m_PixelNumberX; x++)
      BitmapData[x].resize(m_PixelNumberY);
      }
      }

      Now, I want to replace vector > with this CArray: I had tried:

      private:
      int m_PixelNumberX;
      int m_PixelNumberY;
      CArray< CArray, CArray > m_arrBitmapData;

      my question is, how can replace vector.resize method, and how can I return CArray< CArray<COLORREF, COLORREF&>, CArray<COLORREF, COLORREF&> > data type ? Thank you.

      D Offline
      D Offline
      David Crow
      wrote on last edited by
      #2

      Flaviu2 wrote:

      my question is, how can replace vector.resize method...

      Have you tried this.

      Flaviu2 wrote:

      ...and how can I return CArray< CArray<COLORREF, COLORREF&>, CArray<COLORREF, COLORREF&> > data type ?

      From where?

      "One man's wage rise is another man's price increase." - Harold Wilson

      "Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons

      "You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles

      _ 1 Reply Last reply
      0
      • _ _Flaviu

        I have a class (taken from somewhere). Here, I have a member like this:

        public:
        void SetBitmapDataSize(const int x, const int y);

        private:
        int m_PixelNumberX;
        int m_PixelNumberY;
        vector > BitmapData;

        and SetBitmapDataSize is implemented:

        void CBitmapOp::SetBitmapDataSize(const int x, const int y)
        {
        m_PixelNumberX = x;
        m_PixelNumberY = y;
        if((x>=0) && (y>=0))
        {
        BitmapData.resize(m_PixelNumberX);
        for(int x = 0; x < m_PixelNumberX; x++)
        BitmapData[x].resize(m_PixelNumberY);
        }
        }

        Now, I want to replace vector > with this CArray: I had tried:

        private:
        int m_PixelNumberX;
        int m_PixelNumberY;
        CArray< CArray, CArray > m_arrBitmapData;

        my question is, how can replace vector.resize method, and how can I return CArray< CArray<COLORREF, COLORREF&>, CArray<COLORREF, COLORREF&> > data type ? Thank you.

        C Offline
        C Offline
        CPallini
        wrote on last edited by
        #3

        Quote:

        Now, I want to replace vector > with this CArray:

        That's not advisable. I wouldn't do it. As matter of fact the vector container is much better than the CArray one.

        Quote:

        how can replace vector.resize method,

        Use the Carray::SetSize[^] method.

        Quote:

        how can I return CArray< CArray, CArray > data type

        The same way you return other data, e.g.

        return m_arrBitmapData;

        THESE PEOPLE REALLY BOTHER ME!! How can they know what you should do without knowing what you want done?!?! -- C++ FQA Lite

        1 Reply Last reply
        0
        • D David Crow

          Flaviu2 wrote:

          my question is, how can replace vector.resize method...

          Have you tried this.

          Flaviu2 wrote:

          ...and how can I return CArray< CArray<COLORREF, COLORREF&>, CArray<COLORREF, COLORREF&> > data type ?

          From where?

          "One man's wage rise is another man's price increase." - Harold Wilson

          "Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons

          "You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles

          _ Offline
          _ Offline
          _Flaviu
          wrote on last edited by
          #4

          Ok, resize issue has been solved. Secondly, as long m_arrBitmapData is private memeber, I want to return this memeber through a public method, I mean from this class ... Something like that:

          public:
          CArray< CArray<COLORREF, COLORREF&>, CArray<COLORREF, COLORREF&> > GetBitmapArray(){return m_arrBitmapData;}

          because this trial give me:

          error C2558: class 'CArray<class CArray<unsigned long,unsigned long &>,class CArray<unsigned long,unsigned long &> >' : no copy constructor available

          F 1 Reply Last reply
          0
          • _ _Flaviu

            Ok, resize issue has been solved. Secondly, as long m_arrBitmapData is private memeber, I want to return this memeber through a public method, I mean from this class ... Something like that:

            public:
            CArray< CArray<COLORREF, COLORREF&>, CArray<COLORREF, COLORREF&> > GetBitmapArray(){return m_arrBitmapData;}

            because this trial give me:

            error C2558: class 'CArray<class CArray<unsigned long,unsigned long &>,class CArray<unsigned long,unsigned long &> >' : no copy constructor available

            F Offline
            F Offline
            Freak30
            wrote on last edited by
            #5

            Just return a constant reference as in

            const CArray< CArray, CArray > & GetBitmapArray()

            The good thing about pessimism is, that you are always either right or pleasently surprised.

            _ 1 Reply Last reply
            0
            • F Freak30

              Just return a constant reference as in

              const CArray< CArray, CArray > & GetBitmapArray()

              The good thing about pessimism is, that you are always either right or pleasently surprised.

              _ Offline
              _ Offline
              _Flaviu
              wrote on last edited by
              #6

              I think is working ... :) I have one more question: there is a way to pass a paramanter as CArray< CArray<COLORREF, COLORREF&>, CArray<COLORREF, COLORREF&> >, just like:

              // header
              void SetPlotData(CArray< CArray<COLORREF, COLORREF&>, CArray<COLORREF, COLORREF&> > InputArray);

              and

              // implementation
              void CGraphCtrl::SetPlotData(CArray< CArray<COLORREF, COLORREF&>, CArray<COLORREF, COLORREF&> > InputArray)
              {
              if ((m_PixelNumberX>0) && (m_PixelNumberY > 0))
              {
              PlotData = InputArray;
              }
              }

              because code above doesn't work:

              error C2582: 'CArray<class CArray<unsigned long,unsigned long &>,class CArray<unsigned long,unsigned long &> >' : 'operator =' function is unavailable

              As soon as I solve this error, my program will run ...

              1 Reply Last reply
              0
              • _ _Flaviu

                I have a class (taken from somewhere). Here, I have a member like this:

                public:
                void SetBitmapDataSize(const int x, const int y);

                private:
                int m_PixelNumberX;
                int m_PixelNumberY;
                vector > BitmapData;

                and SetBitmapDataSize is implemented:

                void CBitmapOp::SetBitmapDataSize(const int x, const int y)
                {
                m_PixelNumberX = x;
                m_PixelNumberY = y;
                if((x>=0) && (y>=0))
                {
                BitmapData.resize(m_PixelNumberX);
                for(int x = 0; x < m_PixelNumberX; x++)
                BitmapData[x].resize(m_PixelNumberY);
                }
                }

                Now, I want to replace vector > with this CArray: I had tried:

                private:
                int m_PixelNumberX;
                int m_PixelNumberY;
                CArray< CArray, CArray > m_arrBitmapData;

                my question is, how can replace vector.resize method, and how can I return CArray< CArray<COLORREF, COLORREF&>, CArray<COLORREF, COLORREF&> > data type ? Thank you.

                N Offline
                N Offline
                nv3
                wrote on last edited by
                #7

                I would neither store nor return the bitmap data in that way. What you are creating here is a so-called "ragged" array, in which each row can have a different length. In a bitmap this luxury is not needed, all rows are of equal length by definition. Therefore a one-dimensional array is good enough and in some regards even superior. a) A one-dimensional array can be allocated in one chunk (whereas your ragged array needs N allocations, N being the number of rows) b) A one-dimensional array does not incur the overhead that comes with a ragged array, which is easily 3 x 64bits per row. To access the members of the one-dimensional array in a 2D fashion, simply use the algorithm:

                index of pixel (x, y) = x + y\*pixelsPerRow
                

                As a return value for your access function I would suggest you use a simple pointer (const COLORREF*). For the caller to know how to access that 1D array you should provide addition access functions for the number or rows and number of columns.

                _ 1 Reply Last reply
                0
                • N nv3

                  I would neither store nor return the bitmap data in that way. What you are creating here is a so-called "ragged" array, in which each row can have a different length. In a bitmap this luxury is not needed, all rows are of equal length by definition. Therefore a one-dimensional array is good enough and in some regards even superior. a) A one-dimensional array can be allocated in one chunk (whereas your ragged array needs N allocations, N being the number of rows) b) A one-dimensional array does not incur the overhead that comes with a ragged array, which is easily 3 x 64bits per row. To access the members of the one-dimensional array in a 2D fashion, simply use the algorithm:

                  index of pixel (x, y) = x + y\*pixelsPerRow
                  

                  As a return value for your access function I would suggest you use a simple pointer (const COLORREF*). For the caller to know how to access that 1D array you should provide addition access functions for the number or rows and number of columns.

                  _ Offline
                  _ Offline
                  _Flaviu
                  wrote on last edited by
                  #8

                  Ohh, I would love to get rif of 2D array ... I had taken the class from here[^], could you assit me how to give up vector> BitmapData ? If I am not asking too much ... I will start working, to see what is happen ... See you.

                  N 1 Reply Last reply
                  0
                  • _ _Flaviu

                    Ohh, I would love to get rif of 2D array ... I had taken the class from here[^], could you assit me how to give up vector> BitmapData ? If I am not asking too much ... I will start working, to see what is happen ... See you.

                    N Offline
                    N Offline
                    nv3
                    wrote on last edited by
                    #9

                    It is not very difficult to get rid of this 2D array. 1) replace it with a vector m_bitmapData; 2) Replace any reference to the old BitmapData array as follows: BitmapData[x][y] should be replaced by m_bitmapData[x + m_PixelNumberX*y] 3) In SetBitmapDataSize allocate the new array by m_bitmapData.resize (x * y); Change the function interfaces accordingly. Should be really easy.

                    _ 2 Replies Last reply
                    0
                    • N nv3

                      It is not very difficult to get rid of this 2D array. 1) replace it with a vector m_bitmapData; 2) Replace any reference to the old BitmapData array as follows: BitmapData[x][y] should be replaced by m_bitmapData[x + m_PixelNumberX*y] 3) In SetBitmapDataSize allocate the new array by m_bitmapData.resize (x * y); Change the function interfaces accordingly. Should be really easy.

                      _ Offline
                      _ Offline
                      _Flaviu
                      wrote on last edited by
                      #10

                      Kindly thank you NV3 ! I will let you know what I have done. :)

                      1 Reply Last reply
                      0
                      • N nv3

                        It is not very difficult to get rid of this 2D array. 1) replace it with a vector m_bitmapData; 2) Replace any reference to the old BitmapData array as follows: BitmapData[x][y] should be replaced by m_bitmapData[x + m_PixelNumberX*y] 3) In SetBitmapDataSize allocate the new array by m_bitmapData.resize (x * y); Change the function interfaces accordingly. Should be really easy.

                        _ Offline
                        _ Offline
                        _Flaviu
                        wrote on last edited by
                        #11

                        Great ! Is working, just like the original one ... I didn't replace 2D array by vector, but with CArray ... and is working ! Kindly thank you, NV3 !

                        N 1 Reply Last reply
                        0
                        • _ _Flaviu

                          Great ! Is working, just like the original one ... I didn't replace 2D array by vector, but with CArray ... and is working ! Kindly thank you, NV3 !

                          N Offline
                          N Offline
                          nv3
                          wrote on last edited by
                          #12

                          You are welcome.

                          1 Reply Last reply
                          0
                          • _ _Flaviu

                            I have a class (taken from somewhere). Here, I have a member like this:

                            public:
                            void SetBitmapDataSize(const int x, const int y);

                            private:
                            int m_PixelNumberX;
                            int m_PixelNumberY;
                            vector > BitmapData;

                            and SetBitmapDataSize is implemented:

                            void CBitmapOp::SetBitmapDataSize(const int x, const int y)
                            {
                            m_PixelNumberX = x;
                            m_PixelNumberY = y;
                            if((x>=0) && (y>=0))
                            {
                            BitmapData.resize(m_PixelNumberX);
                            for(int x = 0; x < m_PixelNumberX; x++)
                            BitmapData[x].resize(m_PixelNumberY);
                            }
                            }

                            Now, I want to replace vector > with this CArray: I had tried:

                            private:
                            int m_PixelNumberX;
                            int m_PixelNumberY;
                            CArray< CArray, CArray > m_arrBitmapData;

                            my question is, how can replace vector.resize method, and how can I return CArray< CArray<COLORREF, COLORREF&>, CArray<COLORREF, COLORREF&> > data type ? Thank you.

                            R Offline
                            R Offline
                            Raushank03
                            wrote on last edited by
                            #13

                            Your answer is available on http://techgurulab.com/course/c-study-material/

                            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