Array initialisation

D

Danny

HI

Would i be able to initialize an entire array by:-

int a[10] = 0

if not, how old be able to do it, would i have to use some form of loop
to set each individual element?

Dan
 
A

Artie Gold

John said:
HI

Would i be able to initialize an entire array by:-

int a[10] = 0

if not, how old be able to do it, would i have to use some form of loop
to set each individual element?

Dan


The code you have above will initialize the first element; all others
will be uninitialized (eg, garbage). You can do this:

int a[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

int a[10] = {0};

would be sufficient.
or use a loop as you suggested.

HTH,
--ag
 
R

Rob Williscroft

Danny wrote in
HI

Would i be able to initialize an entire array by:-

int a[10] = 0

int a[10] = {};
if not, how old be able to do it, would i have to use some form of loop
to set each individual element?

The above initializer causes all of a's elements to be default
initialized, in the case of an int this means 0, so you get what
you want.

Note that:

int b[3] = { 1 };
is the same as
int b[3] = { 1, 0, 0 };

HTH

Rob.
 
A

Andrey Tarasevich

Artie said:
...
The code you have above will initialize the first element; all others
will be uninitialized (eg, garbage). You can do this:

int a[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

int a[10] = {0};

would be sufficient.
...

As Rob noted in his message, even

int a[10] = {};

would be sufficient.
 
J

John Dibling

Artie said:
...
The code you have above will initialize the first element; all others
will be uninitialized (eg, garbage). You can do this:

int a[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

int a[10] = {0};

would be sufficient.
...

As Rob noted in his message, even

int a[10] = {};

would be sufficient.

I don't think that's correct...

8.5.1.7 :

"If there are fewer initializers in the list than there are memvers in
the aggregate, then each member not explicitly initialized shall be
default initialized."

Doesn't this mean anything not explicitly initialized would be
uninitialized in this case?


</dib>
John Dibling
Witty banter omitted for your protection
 
V

Victor Bazarov

John Dibling said:
Artie said:
...
The code you have above will initialize the first element; all others
will be uninitialized (eg, garbage). You can do this:

int a[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

int a[10] = {0};

would be sufficient.
...

As Rob noted in his message, even

int a[10] = {};

would be sufficient.

I don't think that's correct...

8.5.1.7 :

"If there are fewer initializers in the list than there are memvers in
the aggregate, then each member not explicitly initialized shall be
default initialized."

Doesn't this mean anything not explicitly initialized would be
uninitialized in this case?

Just scroll a few paragraphs back and read 8.5/5. For a POD to
default-initialise means to zero-initialise. 'int' is a POD.

Victor
 
A

Andrey Tarasevich

John said:
...
As Rob noted in his message, even

int a[10] = {};

would be sufficient.

I don't think that's correct...

8.5.1.7 :

"If there are fewer initializers in the list than there are memvers in
the aggregate, then each member not explicitly initialized shall be
default initialized."

Actually, the above is exactly what makes the '{}' initializer
sufficient in this case. I don't see what in this quote makes you think
that the initialization is incorrect.
Doesn't this mean anything not explicitly initialized would be
uninitialized in this case?

No, it means exactly what it says: everything not explicitly initialized
will be _default_ _initialized_. Default initialization for 'int's means
zero initialization. See a reference in Victor's message. Take a look at
8.5.1/8 as well.
 
W

Web Developer

...
As Rob noted in his message, even

int a[10] = {};

would be sufficient.

I don't think that's correct...

8.5.1.7 :

"If there are fewer initializers in the list than there are memvers in
the aggregate, then each member not explicitly initialized shall be
default initialized."

Actually, the above is exactly what makes the '{}' initializer
sufficient in this case. I don't see what in this quote makes you think
that the initialization is incorrect.
Doesn't this mean anything not explicitly initialized would be
uninitialized in this case?

No, it means exactly what it says: everything not explicitly initialized
will be _default_ _initialized_. Default initialization for 'int's means
zero initialization. See a reference in Victor's message. Take a look at
8.5.1/8 as well.

I noted your quote on a paragraph from some source:

8.5.1.7 :

"If there are fewer initializers in the list than there are memvers in
the aggregate, then each member not explicitly initialized shall be
default initialized."

which I assume to be some online C++ reference. Where can I view this for
myself?


Regards
WD
 
J

Josephine Schafer

Web Developer said:
...
As Rob noted in his message, even

int a[10] = {};

would be sufficient.

I don't think that's correct...

8.5.1.7 :

"If there are fewer initializers in the list than there are memvers in
the aggregate, then each member not explicitly initialized shall be
default initialized."

Actually, the above is exactly what makes the '{}' initializer
sufficient in this case. I don't see what in this quote makes you think
that the initialization is incorrect.
Doesn't this mean anything not explicitly initialized would be
uninitialized in this case?

No, it means exactly what it says: everything not explicitly initialized
will be _default_ _initialized_. Default initialization for 'int's means
zero initialization. See a reference in Victor's message. Take a look at
8.5.1/8 as well.

I noted your quote on a paragraph from some source:

8.5.1.7 :

"If there are fewer initializers in the list than there are memvers in
the aggregate, then each member not explicitly initialized shall be
default initialized."

which I assume to be some online C++ reference. Where can I view this for
myself?
The C++ standard.
http://www.zib.de/benger/C++/clause8.html#s8
 
J

J. Campbell

Rob Williscroft said:
Danny wrote in
HI

Would i be able to initialize an entire array by:-

int a[10] = 0

int a[10] = {};

Thanks for the tip...I'd been using a bunch of loops to accomplish
same.

One question. If I have an array as part of a class, initializing to
zero using empty braces doesn't work. eg

class arrayholder{
int a[100] = {};
};

doesn't work. I have to use:

class arrayholder{
int a[100];
};

arrayholder::arrayholder(){
for(int i = 0; i<100; i++)
a = 0;
}

and initialize it in the constructor. However, I'd like to do
something like:
a[] = {};

in the constructor. any ideas?


Thanks
 
J

John Dibling

which I assume to be some online C++ reference. Where can I view this for
myself?


Regards
WD

This is a reference to the ISO C++ standard document, which describes
the language in detail. AFAIK, there is no onlne location to view
this document; it is copyrighted material, and you must purchase a
copy. Here's one place where you can get one:

http://webstore.ansi.org/ansidocstore/product.asp?sku=INCITS/ISO/IEC+14882-1998

</dib>
John Dibling
Witty banter omitted for your protection
 
V

Victor Bazarov

J. Campbell said:
Rob Williscroft <[email protected]> wrote in message
Danny wrote in
HI

Would i be able to initialize an entire array by:-

int a[10] = 0

int a[10] = {};

Thanks for the tip...I'd been using a bunch of loops to accomplish
same.

One question. If I have an array as part of a class, initializing to
zero using empty braces doesn't work. eg

class arrayholder{
int a[100] = {};
};

doesn't work.

Of course it doesn't. You're not in Java any more. The class
definition can contain only _declarations_ of data members, with
a simple exception: a static const of integral type is allowed
to be initialised there.
I have to use:

class arrayholder{
int a[100];
};

arrayholder::arrayholder(){
for(int i = 0; i<100; i++)
a = 0;
}

and initialize it in the constructor. However, I'd like to do
something like:
a[] = {};

in the constructor. any ideas?


Nope. That's the limitation of the language.

Victor
 
A

Adam Fineman

J. Campbell wrote:
One question. If I have an array as part of a class, initializing to
zero using empty braces doesn't work. eg
<snip>
However, I'd like to do
something like:
a[] = {};

in the constructor. any ideas?

Perhaps you should consider using a vector, for this and many other
reasons. (See the FAQ for comp.lang.c++ for more reasons.)

In your particular case, your code could look like this:

#include <vector>

class ArrayHolder
{
public:
ArrayHolder()
: d_v(10, 0)
{ /* no code needed for vector initialization */ }
private:
std::vector<int> d_v;
};

The vector constructor I used above will initialize the vector with 10 '0's.

I understand that you need to know how arrays work in C++, as you need
to understand the basics. However, STL containers are usually a better
choice than arrays in C++.

- Adam
 
R

Rob Williscroft

J. Campbell wrote in
Rob Williscroft said:
Danny wrote in
HI

Would i be able to initialize an entire array by:-

int a[10] = 0

int a[10] = {};

Thanks for the tip...I'd been using a bunch of loops to accomplish
same.

One question. If I have an array as part of a class, initializing to
zero using empty braces doesn't work. eg

class arrayholder{
int a[100] = {};
};

doesn't work. I have to use:

class arrayholder{
int a[100];
};

arrayholder::arrayholder(){
for(int i = 0; i<100; i++)
a = 0;
}

and initialize it in the constructor. However, I'd like to do
something like:
a[] = {};



struct arrayHolderBase
{
int a[100];
};

class arrayHolder: arrayHolderBase
{

public:

arrayHolder() : arrayHolderBase() {}
};


The important part of the above is: "... : arrayHolderBase() { ..."
bit. This explicit call of the POD's (arrayHolderBase's) default
constructor causes the arrayHolderBase sub object of arrayHolder
to be defualt initialized (all fields/elements set to 0).

Just for fun I compiled the following:

#include <iostream>

struct arrayHolder
{
char a[100];
arrayHolder() : a() {}
};

void test()
{
arrayHolder a;

for (int i = 0; i < 100; ++i)
{
if (a.a)
{
std::cerr << "non 0 at " << i << "\n";
return;
}
}
}

void set()
{
arrayHolder a;

for (int i = 0; i < 100; ++i)
{
a.a = i + 20;
}
}

int main()
{
set();
test();
std::cerr << "OK";
}

I fouund the results a bit suprising, No Errors/Warning's
(aka diagnostics) with any of the 3 compilers I tried.

g++ (gcc 3.2 MingW) : OK
msvc (7.1) : non 0 at 0 - OK
bcc32 (borland): non 0 at 0 - OK

I was really expecting (hopeing for) a diagnostic, BTW I used
-W -Wall -pedantic with g++.

I suspect all 3 compilers are conforming implementation's (in this
regard) of our beloved C++ Standard.

Rob.
 
A

Andrey Tarasevich

Rob said:
...
struct arrayHolderBase
{
int a[100];
};

class arrayHolder: arrayHolderBase
{

public:

arrayHolder() : arrayHolderBase() {}
};


The important part of the above is: "... : arrayHolderBase() { ..."
bit. This explicit call of the POD's (arrayHolderBase's) default
constructor causes the arrayHolderBase sub object of arrayHolder
to be defualt initialized (all fields/elements set to 0).

Strictly speaking, in standard terminology the '... : arrayHolderBase()
{ ...' bit is not and explicit call to 'arrayHolderBase' constructor.
The '()' is just a form of member initializer which causes this member
to be default-initialized. No constructors are involved in this process.
Just for fun I compiled the following:

#include <iostream>

struct arrayHolder
{
char a[100];
arrayHolder() : a() {}
};

void test()
{
arrayHolder a;

for (int i = 0; i < 100; ++i)
{
if (a.a)
{
std::cerr << "non 0 at " << i << "\n";
return;
}
}
}

void set()
{
arrayHolder a;

for (int i = 0; i < 100; ++i)
{
a.a = i + 20;
}
}

int main()
{
set();
test();
std::cerr << "OK";
}

I fouund the results a bit suprising, No Errors/Warning's
(aka diagnostics) with any of the 3 compilers I tried.


There shouldn't be any. The code is legal.
g++ (gcc 3.2 MingW) : OK
msvc (7.1) : non 0 at 0 - OK
bcc32 (borland): non 0 at 0 - OK

I was really expecting (hopeing for) a diagnostic, BTW I used
-W -Wall -pedantic with g++.

I suspect all 3 compilers are conforming implementation's (in this
regard) of our beloved C++ Standard.

No. Looks like only 'g++' was able to produce the correct result. The
'msvc' and 'bcc32' are not conforming in this respect. As for 'msvc',
this problem existed in version 6 as well.
 
R

Rob Williscroft

Andrey Tarasevich wrote in
struct arrayHolder
{
char a[100];
arrayHolder() : a() {}
};

I fouund the results a bit suprising, No Errors/Warning's
(aka diagnostics) with any of the 3 compilers I tried.

There shouldn't be any. The code is legal.
g++ (gcc 3.2 MingW) : OK
msvc (7.1) : non 0 at 0 - OK
bcc32 (borland): non 0 at 0 - OK

I was really expecting (hopeing for) a diagnostic, BTW I used
-W -Wall -pedantic with g++.

I suspect all 3 compilers are conforming implementation's (in this
regard) of our beloved C++ Standard.

No. Looks like only 'g++' was able to produce the correct result. The
'msvc' and 'bcc32' are not conforming in this respect. As for 'msvc',
this problem existed in version 6 as well.

Thanks for the correction.

Rob.
 
W

Web Developer

which I assume to be some online C++ reference. Where can I view this
for
This is a reference to the ISO C++ standard document, which describes
the language in detail. AFAIK, there is no onlne location to view
this document; it is copyrighted material, and you must purchase a
copy. Here's one place where you can get one:
http://webstore.ansi.org/ansidocstore/product.asp?sku=INCITS/ISO/IEC+148
82%2D1998

What is the latest version for this document? version 1.0?


WD
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,054
Latest member
TrimKetoBoost

Latest Threads

Top