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   Members   

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

#2   Members   

20268
Like
5Likes
Like

Posted 31 March 2014 - 07:42 PM

*
POPULAR

Do you have a compiler error, or something?

#3   Members   

779
Like
0Likes
Like

Posted 31 March 2014 - 07:45 PM

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

what

#4   Members   

1072
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   Members   

454
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   Members   

20268
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   Members   

24838
Like
12Likes
Like

Posted 01 April 2014 - 03:29 AM

*
POPULAR

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.


#8   Members   

303
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   Members   

2678
Like
0Likes
Like

Posted 01 April 2014 - 08:45 AM

Can you post the error output you're getting?


"I would try to find halo source code by bungie best fps engine ever created, u see why call of duty loses speed due to its detail." -- GettingNifty


#10   Members   

500
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   Members   

24838
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

#12   Members   

2705
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   Members   

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


#14   Members   

3018
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   Members   

2459
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   Members   

24838
Like
6Likes
Like

Posted 01 April 2014 - 07:45 PM

*
POPULAR

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.


#17   Members   

303
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   Members   

3482
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   Members   

24838
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

#20   Members   

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