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

20.8k34594




20.8k34594










asked Nov 14 '18 at 16:15









Arnaud 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









    YSC

    20.8k34594




    20.8k34594












    • 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









        eerorika

        76.8k556117




        76.8k556117























            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









            Jeffrey

            1,458520




            1,458520












            • 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.





            Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


            Please pay close attention to the following guidance:


            • 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







            Popular posts from this blog

            Guess what letter conforming each word

            Port of Spain

            Run scheduled task as local user group (not BUILTIN)