array of 2 dimensions, one being known and the other unknown
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
add a comment |
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
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
add a comment |
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
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
c++ arrays types
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
add a comment |
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
add a comment |
3 Answers
3
active
oldest
votes
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.
You can do something similar defining atypedef
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
add a comment |
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);
add a comment |
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.
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
add a comment |
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
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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.
You can do something similar defining atypedef
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
add a comment |
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.
You can do something similar defining atypedef
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
add a comment |
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.
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.
edited Nov 14 '18 at 16:37
answered Nov 14 '18 at 16:29
YSCYSC
24k554109
24k554109
You can do something similar defining atypedef
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
add a comment |
You can do something similar defining atypedef
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
add a comment |
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);
add a comment |
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);
add a comment |
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);
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);
answered Nov 14 '18 at 16:37
eerorikaeerorika
82.8k661127
82.8k661127
add a comment |
add a comment |
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.
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
add a comment |
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.
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
add a comment |
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.
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.
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
add a comment |
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
add a comment |
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.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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 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