array of 2 dimensions, one being known and the other unknown










2















I need to efficiently allocate an array of two dimensions, one being known (5) and the other being unknown.



My aim is to have a continuous block of memory named block that stores my data in the following way :
block[0,0] block[0,1] block[0,2] block[0,3] block[0,4] block[1,0] ...]



The following code compiles (in C++) :



unsigned int size2=200;
auto block = new float[size2][5];


Is it correct ?
What is the type of the variable block ?
I have tried :



float[5]* block = new float[size2][5];
float[5] block = new float[size2][5];
float block[5] = new float[size2][5];
float block*[5] = new float[size2][5];


All of them leads to an error.
I am running out of imagination...










share|improve this question
























  • How about creating array of pointers each points to a dynamic Array?

    – Ali Kanat
    Nov 14 '18 at 16:23











  • it allocates additional memory and will fragment allocated memory

    – Arnaud Mégret
    Nov 14 '18 at 16:24






  • 1





    What not use vectors?

    – eshirima
    Nov 14 '18 at 16:24















2















I need to efficiently allocate an array of two dimensions, one being known (5) and the other being unknown.



My aim is to have a continuous block of memory named block that stores my data in the following way :
block[0,0] block[0,1] block[0,2] block[0,3] block[0,4] block[1,0] ...]



The following code compiles (in C++) :



unsigned int size2=200;
auto block = new float[size2][5];


Is it correct ?
What is the type of the variable block ?
I have tried :



float[5]* block = new float[size2][5];
float[5] block = new float[size2][5];
float block[5] = new float[size2][5];
float block*[5] = new float[size2][5];


All of them leads to an error.
I am running out of imagination...










share|improve this question
























  • How about creating array of pointers each points to a dynamic Array?

    – Ali Kanat
    Nov 14 '18 at 16:23











  • it allocates additional memory and will fragment allocated memory

    – Arnaud Mégret
    Nov 14 '18 at 16:24






  • 1





    What not use vectors?

    – eshirima
    Nov 14 '18 at 16:24













2












2








2








I need to efficiently allocate an array of two dimensions, one being known (5) and the other being unknown.



My aim is to have a continuous block of memory named block that stores my data in the following way :
block[0,0] block[0,1] block[0,2] block[0,3] block[0,4] block[1,0] ...]



The following code compiles (in C++) :



unsigned int size2=200;
auto block = new float[size2][5];


Is it correct ?
What is the type of the variable block ?
I have tried :



float[5]* block = new float[size2][5];
float[5] block = new float[size2][5];
float block[5] = new float[size2][5];
float block*[5] = new float[size2][5];


All of them leads to an error.
I am running out of imagination...










share|improve this question
















I need to efficiently allocate an array of two dimensions, one being known (5) and the other being unknown.



My aim is to have a continuous block of memory named block that stores my data in the following way :
block[0,0] block[0,1] block[0,2] block[0,3] block[0,4] block[1,0] ...]



The following code compiles (in C++) :



unsigned int size2=200;
auto block = new float[size2][5];


Is it correct ?
What is the type of the variable block ?
I have tried :



float[5]* block = new float[size2][5];
float[5] block = new float[size2][5];
float block[5] = new float[size2][5];
float block*[5] = new float[size2][5];


All of them leads to an error.
I am running out of imagination...







c++ arrays types






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 14 '18 at 16:32









YSC

24k554109




24k554109










asked Nov 14 '18 at 16:15









Arnaud MégretArnaud Mégret

1157




1157












  • How about creating array of pointers each points to a dynamic Array?

    – Ali Kanat
    Nov 14 '18 at 16:23











  • it allocates additional memory and will fragment allocated memory

    – Arnaud Mégret
    Nov 14 '18 at 16:24






  • 1





    What not use vectors?

    – eshirima
    Nov 14 '18 at 16:24

















  • How about creating array of pointers each points to a dynamic Array?

    – Ali Kanat
    Nov 14 '18 at 16:23











  • it allocates additional memory and will fragment allocated memory

    – Arnaud Mégret
    Nov 14 '18 at 16:24






  • 1





    What not use vectors?

    – eshirima
    Nov 14 '18 at 16:24
















How about creating array of pointers each points to a dynamic Array?

– Ali Kanat
Nov 14 '18 at 16:23





How about creating array of pointers each points to a dynamic Array?

– Ali Kanat
Nov 14 '18 at 16:23













it allocates additional memory and will fragment allocated memory

– Arnaud Mégret
Nov 14 '18 at 16:24





it allocates additional memory and will fragment allocated memory

– Arnaud Mégret
Nov 14 '18 at 16:24




1




1





What not use vectors?

– eshirima
Nov 14 '18 at 16:24





What not use vectors?

– eshirima
Nov 14 '18 at 16:24












3 Answers
3






active

oldest

votes


















3














unsigned int size2=200;
auto block = new float[size2][5];



Is it correct?




Yes it is correct.




What is the type of the variable block?




Using auto here is the best you can do. But for learning purpose, the type of block is float(*)[5]. To define a variable with that type, you must use the following syntax:



unsigned int size2=200;
float(*block)[5] = new float[size2][5];


Demo: https://godbolt.org/z/4iJMA5




"How can I read such a thing as float(*block)[5]?" you might ask. It's simple, use the C++ Guru Snail Rule.






share|improve this answer

























  • You can do something similar defining a typedef allowing a somewhat more natural pointer to array allocation, e.g. typedef float row_t[5]; ... row_t *block = new row_t[200]; (whether that is more clear or not is arguable)

    – David C. Rankin
    Nov 14 '18 at 17:54


















2















unsigned int size2=200;
auto block = new float[size2][5];


Is it correct ?




Yes, although a bare owning pointer is a bad idea. It's better to use std::vector for dynamic arrays.




What is the type of the variable block ?




It is float (*)[5] i.e. pointer to an array of 5 float.




As I mentioned, I recommend using std::vector instead to avoid pitfalls with memory management:



std::vector<std::array<float, 5>> block(size2);





share|improve this answer






























    1














    I'm a bit old-school, but the simplest is really



    new float[size2 * 5];


    and access it with



    my_array[y * 5 + x]


    You can even add an inline helper function



    int at(int x, int y) return y * 5 + x;


    ...



    my_array[at(x,y)]


    And ideally combine with a std::vector instead of a dynamic array.






    share|improve this answer























    • I don't see how this is better than the questioner's own version tbh. Using this is more complicated.

      – Galik
      Nov 14 '18 at 17:21










    Your Answer






    StackExchange.ifUsing("editor", function ()
    StackExchange.using("externalEditor", function ()
    StackExchange.using("snippets", function ()
    StackExchange.snippets.init();
    );
    );
    , "code-snippets");

    StackExchange.ready(function()
    var channelOptions =
    tags: "".split(" "),
    id: "1"
    ;
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function()
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled)
    StackExchange.using("snippets", function()
    createEditor();
    );

    else
    createEditor();

    );

    function createEditor()
    StackExchange.prepareEditor(
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader:
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    ,
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    );



    );













    draft saved

    draft discarded


















    StackExchange.ready(
    function ()
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53304521%2farray-of-2-dimensions-one-being-known-and-the-other-unknown%23new-answer', 'question_page');

    );

    Post as a guest















    Required, but never shown

























    3 Answers
    3






    active

    oldest

    votes








    3 Answers
    3






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    3














    unsigned int size2=200;
    auto block = new float[size2][5];



    Is it correct?




    Yes it is correct.




    What is the type of the variable block?




    Using auto here is the best you can do. But for learning purpose, the type of block is float(*)[5]. To define a variable with that type, you must use the following syntax:



    unsigned int size2=200;
    float(*block)[5] = new float[size2][5];


    Demo: https://godbolt.org/z/4iJMA5




    "How can I read such a thing as float(*block)[5]?" you might ask. It's simple, use the C++ Guru Snail Rule.






    share|improve this answer

























    • You can do something similar defining a typedef allowing a somewhat more natural pointer to array allocation, e.g. typedef float row_t[5]; ... row_t *block = new row_t[200]; (whether that is more clear or not is arguable)

      – David C. Rankin
      Nov 14 '18 at 17:54















    3














    unsigned int size2=200;
    auto block = new float[size2][5];



    Is it correct?




    Yes it is correct.




    What is the type of the variable block?




    Using auto here is the best you can do. But for learning purpose, the type of block is float(*)[5]. To define a variable with that type, you must use the following syntax:



    unsigned int size2=200;
    float(*block)[5] = new float[size2][5];


    Demo: https://godbolt.org/z/4iJMA5




    "How can I read such a thing as float(*block)[5]?" you might ask. It's simple, use the C++ Guru Snail Rule.






    share|improve this answer

























    • You can do something similar defining a typedef allowing a somewhat more natural pointer to array allocation, e.g. typedef float row_t[5]; ... row_t *block = new row_t[200]; (whether that is more clear or not is arguable)

      – David C. Rankin
      Nov 14 '18 at 17:54













    3












    3








    3







    unsigned int size2=200;
    auto block = new float[size2][5];



    Is it correct?




    Yes it is correct.




    What is the type of the variable block?




    Using auto here is the best you can do. But for learning purpose, the type of block is float(*)[5]. To define a variable with that type, you must use the following syntax:



    unsigned int size2=200;
    float(*block)[5] = new float[size2][5];


    Demo: https://godbolt.org/z/4iJMA5




    "How can I read such a thing as float(*block)[5]?" you might ask. It's simple, use the C++ Guru Snail Rule.






    share|improve this answer















    unsigned int size2=200;
    auto block = new float[size2][5];



    Is it correct?




    Yes it is correct.




    What is the type of the variable block?




    Using auto here is the best you can do. But for learning purpose, the type of block is float(*)[5]. To define a variable with that type, you must use the following syntax:



    unsigned int size2=200;
    float(*block)[5] = new float[size2][5];


    Demo: https://godbolt.org/z/4iJMA5




    "How can I read such a thing as float(*block)[5]?" you might ask. It's simple, use the C++ Guru Snail Rule.







    share|improve this answer














    share|improve this answer



    share|improve this answer








    edited Nov 14 '18 at 16:37

























    answered Nov 14 '18 at 16:29









    YSCYSC

    24k554109




    24k554109












    • You can do something similar defining a typedef allowing a somewhat more natural pointer to array allocation, e.g. typedef float row_t[5]; ... row_t *block = new row_t[200]; (whether that is more clear or not is arguable)

      – David C. Rankin
      Nov 14 '18 at 17:54

















    • You can do something similar defining a typedef allowing a somewhat more natural pointer to array allocation, e.g. typedef float row_t[5]; ... row_t *block = new row_t[200]; (whether that is more clear or not is arguable)

      – David C. Rankin
      Nov 14 '18 at 17:54
















    You can do something similar defining a typedef allowing a somewhat more natural pointer to array allocation, e.g. typedef float row_t[5]; ... row_t *block = new row_t[200]; (whether that is more clear or not is arguable)

    – David C. Rankin
    Nov 14 '18 at 17:54





    You can do something similar defining a typedef allowing a somewhat more natural pointer to array allocation, e.g. typedef float row_t[5]; ... row_t *block = new row_t[200]; (whether that is more clear or not is arguable)

    – David C. Rankin
    Nov 14 '18 at 17:54













    2















    unsigned int size2=200;
    auto block = new float[size2][5];


    Is it correct ?




    Yes, although a bare owning pointer is a bad idea. It's better to use std::vector for dynamic arrays.




    What is the type of the variable block ?




    It is float (*)[5] i.e. pointer to an array of 5 float.




    As I mentioned, I recommend using std::vector instead to avoid pitfalls with memory management:



    std::vector<std::array<float, 5>> block(size2);





    share|improve this answer



























      2















      unsigned int size2=200;
      auto block = new float[size2][5];


      Is it correct ?




      Yes, although a bare owning pointer is a bad idea. It's better to use std::vector for dynamic arrays.




      What is the type of the variable block ?




      It is float (*)[5] i.e. pointer to an array of 5 float.




      As I mentioned, I recommend using std::vector instead to avoid pitfalls with memory management:



      std::vector<std::array<float, 5>> block(size2);





      share|improve this answer

























        2












        2








        2








        unsigned int size2=200;
        auto block = new float[size2][5];


        Is it correct ?




        Yes, although a bare owning pointer is a bad idea. It's better to use std::vector for dynamic arrays.




        What is the type of the variable block ?




        It is float (*)[5] i.e. pointer to an array of 5 float.




        As I mentioned, I recommend using std::vector instead to avoid pitfalls with memory management:



        std::vector<std::array<float, 5>> block(size2);





        share|improve this answer














        unsigned int size2=200;
        auto block = new float[size2][5];


        Is it correct ?




        Yes, although a bare owning pointer is a bad idea. It's better to use std::vector for dynamic arrays.




        What is the type of the variable block ?




        It is float (*)[5] i.e. pointer to an array of 5 float.




        As I mentioned, I recommend using std::vector instead to avoid pitfalls with memory management:



        std::vector<std::array<float, 5>> block(size2);






        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Nov 14 '18 at 16:37









        eerorikaeerorika

        82.8k661127




        82.8k661127





















            1














            I'm a bit old-school, but the simplest is really



            new float[size2 * 5];


            and access it with



            my_array[y * 5 + x]


            You can even add an inline helper function



            int at(int x, int y) return y * 5 + x;


            ...



            my_array[at(x,y)]


            And ideally combine with a std::vector instead of a dynamic array.






            share|improve this answer























            • I don't see how this is better than the questioner's own version tbh. Using this is more complicated.

              – Galik
              Nov 14 '18 at 17:21















            1














            I'm a bit old-school, but the simplest is really



            new float[size2 * 5];


            and access it with



            my_array[y * 5 + x]


            You can even add an inline helper function



            int at(int x, int y) return y * 5 + x;


            ...



            my_array[at(x,y)]


            And ideally combine with a std::vector instead of a dynamic array.






            share|improve this answer























            • I don't see how this is better than the questioner's own version tbh. Using this is more complicated.

              – Galik
              Nov 14 '18 at 17:21













            1












            1








            1







            I'm a bit old-school, but the simplest is really



            new float[size2 * 5];


            and access it with



            my_array[y * 5 + x]


            You can even add an inline helper function



            int at(int x, int y) return y * 5 + x;


            ...



            my_array[at(x,y)]


            And ideally combine with a std::vector instead of a dynamic array.






            share|improve this answer













            I'm a bit old-school, but the simplest is really



            new float[size2 * 5];


            and access it with



            my_array[y * 5 + x]


            You can even add an inline helper function



            int at(int x, int y) return y * 5 + x;


            ...



            my_array[at(x,y)]


            And ideally combine with a std::vector instead of a dynamic array.







            share|improve this answer












            share|improve this answer



            share|improve this answer










            answered Nov 14 '18 at 16:28









            JeffreyJeffrey

            1,514620




            1,514620












            • I don't see how this is better than the questioner's own version tbh. Using this is more complicated.

              – Galik
              Nov 14 '18 at 17:21

















            • I don't see how this is better than the questioner's own version tbh. Using this is more complicated.

              – Galik
              Nov 14 '18 at 17:21
















            I don't see how this is better than the questioner's own version tbh. Using this is more complicated.

            – Galik
            Nov 14 '18 at 17:21





            I don't see how this is better than the questioner's own version tbh. Using this is more complicated.

            – Galik
            Nov 14 '18 at 17:21

















            draft saved

            draft discarded
















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid


            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.

            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53304521%2farray-of-2-dimensions-one-being-known-and-the-other-unknown%23new-answer', 'question_page');

            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            這個網誌中的熱門文章

            How to read a connectionString WITH PROVIDER in .NET Core?

            Node.js Script on GitHub Pages or Amazon S3

            Museum of Modern and Contemporary Art of Trento and Rovereto