Jump to content

  • Log In with Google      Sign In   
  • Create Account


\why can't I initialize a multidimensional C array with zeroes


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
19 replies to this topic

#1 gasto   Members   -  Reputation: 256

Like
-1Likes
Like

Posted 31 March 2014 - 07:41 PM

Why can't I simply initialize to zeroes a C multidimensional array as one would normally initialize a one dimensional array:

 

int arr[3]= {0}; / *yep.*/
int multArr[3][2] = {{0}}; /* nicht! */

Intel Core 2 Quad CPU Q6600, 2.4 GHz. 3GB RAM. ATI Radeon HD 3400.

Sponsor:

#2 Álvaro   Crossbones+   -  Reputation: 11846

Like
5Likes
Like

Posted 31 March 2014 - 07:42 PM

Do you have a compiler error, or something?

#3 incertia   Crossbones+   -  Reputation: 777

Like
0Likes
Like

Posted 31 March 2014 - 07:45 PM

Use
int multArr[3][2] = {0};

what

#4 aregee   Members   -  Reputation: 766

Like
3Likes
Like

Posted 31 March 2014 - 08:20 PM

Technically this is the correct way:

 

int multArr[3][2] = { {0, 0}, {0, 0}, {0, 0} };

 

Doing as incertia suggests works too, but technically this is what happens:

 

1. The first value will be set to 0.

2. The values the are lacking will be set to 0.

 

Meaning that if you would initialise like this:

 

int multArr[3][2] = { 1 };

 

You would set the first value to 1, and the values that are lacking will be set to 0.


Edited by aregee, 31 March 2014 - 08:56 PM.


#5 Samurai Jack   Members   -  Reputation: 162

Like
2Likes
Like

Posted 01 April 2014 - 01:57 AM

int multArr[3][2] = { {0, 0}, {0, 0}, {0, 0} };

 

Yes. Aregee has it correct. On the other hand, you can allways use memset?

memset(multArr, 0, sizeof(multArr));


#6 Álvaro   Crossbones+   -  Reputation: 11846

Like
4Likes
Like

Posted 01 April 2014 - 02:33 AM

Can anyone explain what the problem was with the original code? It works for me...

#7 L. Spiro   Crossbones+   -  Reputation: 12196

Like
12Likes
Like

Posted 01 April 2014 - 03:29 AM

There is absolutely nothing wrong with the original code; it is fully standard compliant and likely compiles on all compilers. It even compiles on the C compiler I wrote, and I wasn’t really aiming to be fully featured in some areas.
 

Use

int multArr[3][2] = {0};

This compiles but it in terms of correctness, “int multArr[3][2] = {{0}};” is better.

 

Technically this is the correct way:
 
int multArr[3][2] = { {0, 0}, {0, 0}, {0, 0} };

The original poster is likely looking for a way that does not require him or her to rewrite the whole initializer should the array dimensions change.
“int multArr[3][2] = {{0}};” is the best way to accomplish this goal.

 

Can anyone explain what the problem was with the original code? It works for me...

The original poster has misunderstood the error output of his or her compiler or his or her compiler is extremely broken.
It works in Visual Studio (all versions), GCC (all versions), and whatever they use on codepad.com.
http://codepad.org/opwFC94e (for those who do not know it compiles and runs the code, and compile errors are listed, if any (see this version: http://codepad.org/eusvaaHZ))


L. Spiro


Edited by L. Spiro, 01 April 2014 - 03:30 AM.

It is amazing how often people try to be unique, and yet they are always trying to make others be like them. - L. Spiro 2011
I spent most of my life learning the courage it takes to go out and get what I want. Now that I have it, I am not sure exactly what it is that I want. - L. Spiro 2013
I went to my local Subway once to find some guy yelling at the staff. When someone finally came to take my order and asked, “May I help you?”, I replied, “Yeah, I’ll have one asshole to go.”
L. Spiro Engine: http://lspiroengine.com
L. Spiro Engine Forums: http://lspiroengine.com/forums

#8 gasto   Members   -  Reputation: 256

Like
-3Likes
Like

Posted 01 April 2014 - 08:09 AM

The original poster has misunderstood the error output of his or her compile

You must be kidding me.

 

I know that one dimensional arrays initialize to 0 once at least one value is set, but I thought N dimensional array initialization had some quirks, like many things in C++.


Edited by gasto, 01 April 2014 - 08:10 AM.

Intel Core 2 Quad CPU Q6600, 2.4 GHz. 3GB RAM. ATI Radeon HD 3400.

#9 TheComet   Members   -  Reputation: 1382

Like
0Likes
Like

Posted 01 April 2014 - 08:45 AM

Can you post the error output you're getting?


YOUR_OPINION >/dev/null


#10 DeafManNoEars   Members   -  Reputation: 452

Like
0Likes
Like

Posted 01 April 2014 - 09:18 AM


Meaning that if you would initialise like this:
 
int multArr[3][2] = { 1 };
 
You would set the first value to 1, and the values that are lacking will be set to 0.

 

Correct.  Just try it and ye shall see.  Though the OP explicitly asks why he can't...

 

 

simply initialize to zeroes a C multidimensional array as one would normally initialize a one dimensional array:

int arr[3]= {0}; / *yep.*/
int multArr[3][2] = {{0}}; /* nicht! */

 

Not sure what is not working for him as he has not mentioned what error he gets or how it is not working.



#11 L. Spiro   Crossbones+   -  Reputation: 12196

Like
3Likes
Like

Posted 01 April 2014 - 10:03 AM

but I thought N dimensional array initialization had some quirks

So you didn’t actually get an error. You just thought you would. Or-?


L. Spiro
It is amazing how often people try to be unique, and yet they are always trying to make others be like them. - L. Spiro 2011
I spent most of my life learning the courage it takes to go out and get what I want. Now that I have it, I am not sure exactly what it is that I want. - L. Spiro 2013
I went to my local Subway once to find some guy yelling at the staff. When someone finally came to take my order and asked, “May I help you?”, I replied, “Yeah, I’ll have one asshole to go.”
L. Spiro Engine: http://lspiroengine.com
L. Spiro Engine Forums: http://lspiroengine.com/forums

#12 Vortez   Crossbones+   -  Reputation: 2688

Like
0Likes
Like

Posted 01 April 2014 - 02:15 PM

Im surprise no one said ZeroMemory or memset. I know, i know, that's old school and ZeroMemory is not portable i think, but it work, no? :)



#13 L. Spiro   Crossbones+   -  Reputation: 12196

Like
0Likes
Like

Posted 01 April 2014 - 03:02 PM

Im surprise no one said ZeroMemory or memset. I know, i know, that's old school and ZeroMemory is not portable i think, but it work, no? smile.png

Samurai Jack mentioned memset(), and no, ZeroMemory() (which is a macro) is not portable.  But since it is a macro it is trivial enough to define on any other platform.


L. Spiro


Edited by L. Spiro, 01 April 2014 - 07:46 PM.

It is amazing how often people try to be unique, and yet they are always trying to make others be like them. - L. Spiro 2011
I spent most of my life learning the courage it takes to go out and get what I want. Now that I have it, I am not sure exactly what it is that I want. - L. Spiro 2013
I went to my local Subway once to find some guy yelling at the staff. When someone finally came to take my order and asked, “May I help you?”, I replied, “Yeah, I’ll have one asshole to go.”
L. Spiro Engine: http://lspiroengine.com
L. Spiro Engine Forums: http://lspiroengine.com/forums

#14 Chris_F   Members   -  Reputation: 1937

Like
2Likes
Like

Posted 01 April 2014 - 05:23 PM


This compiles but it in terms of correctness, “int multArr[3][2] = {{0}};” is better.

 

What's better about it? Correct code is correct code, and the first example is shorter while being very concise about its intent.

int multArr[3][2] = {0}; for C
 
int multArr[3][2] = {}; for C++

Edited by Chris_F, 01 April 2014 - 05:24 PM.


#15 Pink Horror   Members   -  Reputation: 1081

Like
1Likes
Like

Posted 01 April 2014 - 07:20 PM

I know that one dimensional arrays initialize to 0 once at least one value is set, but I thought N dimensional array initialization had some quirks, like many things in C++.


Your topic says "C array". Are you using C, or C++?

Edited by Pink Horror, 01 April 2014 - 07:21 PM.


#16 L. Spiro   Crossbones+   -  Reputation: 12196

Like
6Likes
Like

Posted 01 April 2014 - 07:45 PM

Correct code is correct code, and the first example is shorter while being very concise about its intent.

Code that compiles is technically immediately “correct”; that doesn’t mean it can’t be made “better”.

“int multArr[3][2] = {0};” may be shorter, but “int multArr[3][2] = {{0}};” matches the actual definition and is consistent with what you would have to do (barring {}) in the following case:

typedef enum {
    Radians,
    Meters
} Unit;
typedef struct {
    Unit uUnits;
} MyUnits;

static MyUnits g_muUnitsArray[3][2] = { Radians }; /* Error */
typedef enum {
    Radians,
    Meters
} Unit;
typedef struct {
    Unit uUnits;
} MyUnits;

static MyUnits g_muUnitsArray[3][2] = { { Radians } }; /* No error */

I will choose consistency over saving a few characters any day. It’s not clear and concise when this bit is formatted this way and that bit is formatted another way. Consistency makes concise far more than a few dropped characters.

 

 

L. Spiro


Edited by L. Spiro, 02 April 2014 - 12:08 AM.

It is amazing how often people try to be unique, and yet they are always trying to make others be like them. - L. Spiro 2011
I spent most of my life learning the courage it takes to go out and get what I want. Now that I have it, I am not sure exactly what it is that I want. - L. Spiro 2013
I went to my local Subway once to find some guy yelling at the staff. When someone finally came to take my order and asked, “May I help you?”, I replied, “Yeah, I’ll have one asshole to go.”
L. Spiro Engine: http://lspiroengine.com
L. Spiro Engine Forums: http://lspiroengine.com/forums

#17 gasto   Members   -  Reputation: 256

Like
0Likes
Like

Posted 02 April 2014 - 04:28 PM

According to C primer Plus by Stephen Prata, in the multidimensional array section:

 

int multArr[3][2] = {{0}}; /* nicht! */

 

only the first row would be initialized to 0.

 

Yes, I know it is C, but I am wondering if it also applies for C++.

 

Whether it compiles or not in one or two compilers does not ensure that it is standard compliant.


Intel Core 2 Quad CPU Q6600, 2.4 GHz. 3GB RAM. ATI Radeon HD 3400.

#18 Adam_42   Crossbones+   -  Reputation: 2360

Like
1Likes
Like

Posted 02 April 2014 - 04:43 PM

If you're using C++ I'd be tempted to go for this syntax as it covers all cases:

int multArr[3][2] = {};



					
					

#19 L. Spiro   Crossbones+   -  Reputation: 12196

Like
2Likes
Like

Posted 02 April 2014 - 05:11 PM

According to C primer Plus by Stephen Prata, in the multidimensional array section:
 
 

int multArr[3][2] = {{0}}; /* nicht! */
 
only the first row would be initialized to 0.
 
Yes, I know it is C, but I am wondering if it also applies for C++.
 
Whether it compiles or not in one or two compilers does not ensure that it is standard compliant.

It behaves the same in C and in C++: All values not explicitly set to 0 will be throughout the entirety of the array.


L. Spiro
It is amazing how often people try to be unique, and yet they are always trying to make others be like them. - L. Spiro 2011
I spent most of my life learning the courage it takes to go out and get what I want. Now that I have it, I am not sure exactly what it is that I want. - L. Spiro 2013
I went to my local Subway once to find some guy yelling at the staff. When someone finally came to take my order and asked, “May I help you?”, I replied, “Yeah, I’ll have one asshole to go.”
L. Spiro Engine: http://lspiroengine.com
L. Spiro Engine Forums: http://lspiroengine.com/forums

#20 Pink Horror   Members   -  Reputation: 1081

Like
0Likes
Like

Posted 04 April 2014 - 10:15 AM

According to C primer Plus by Stephen Prata, in the multidimensional array section:

 

 

I do not have C Primer Plus. I do have access to the publically available C standards. I'm looking at this right now:

http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf

 

In section 6.7.8, starting with 26, there are many examples of partially initializing multidimensional arrays. Here's item 26:

 

 

 

EXAMPLE 3 The declaration
int y[4][3] = {
{ 1, 3,5},
{ 2, 4,6},
{ 3, 5,7},
};
is a definition with a fully bracketed initialization: 1, 3, and 5 initialize the first row of y (the array object
y[0]), namely y[0][0], y[0][1], and y[0][2]. Likewise the next two lines initialize y[1] and
y[2]. The initializer ends early, so y[3] is initialized with zeros. Precisely the same effect could have
been achieved by
int y[4][3] = {
1, 3, 5, 2, 4, 6, 3, 5, 7
};
The initializer for y[0] does not begin with a left brace, so three items from the list are used. Likewise the
next three are taken successively for y[1] and y[2].

 

 






Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS