So you didn’t actually get an error. You just thought you would. Or-?but I thought N dimensional array initialization had some quirks
L. Spiro
So you didn’t actually get an error. You just thought you would. Or-?but I thought N dimensional array initialization had some quirks
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? :)
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?
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
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++
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++.
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
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.
If you're using C++ I'd be tempted to go for this syntax as it covers all cases:
int multArr[3][2] = {};
It behaves the same in C and in C++: All values not explicitly set to 0 will be throughout the entirety of the array.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.
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 declarationint y[4][3] = {{ 1, 3,5},{ 2, 4,6},{ 3, 5,7},};is a de?nition with a fully bracketed initialization: 1, 3, and 5 initialize the ?rst row of y (the array objecty[0]), namely y[0][0], y[0][1], and y[0][2]. Likewise the next two lines initialize y[1] andy[2]. The initializer ends early, so y[3] is initialized with zeros. Precisely the same effect could havebeen achieved byint 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 thenext three are taken successively for y[1] and y[2].