Array initialisation

Discussion in 'C++' started by Danny, Aug 4, 2003.

  1. Danny

    Danny Guest

    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
    Danny, Aug 4, 2003
    #1
    1. Advertising

  2. Danny

    Artie Gold Guest

    John Dibling wrote:
    > On Mon, 04 Aug 2003 19:15:59 +0100, Danny <>
    > wrote:
    >
    >
    >>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


    --
    Artie Gold -- Austin, Texas
    Artie Gold, Aug 4, 2003
    #2
    1. Advertising

  3. Danny wrote in news::

    > 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.
    --
    http://www.victim-prime.dsl.pipex.com/
    Rob Williscroft, Aug 4, 2003
    #3
  4. Artie Gold wrote:
    > ...
    >> 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.

    --
    Best regards,
    Andrey Tarasevich
    Brainbench C and C++ Programming MVP
    Andrey Tarasevich, Aug 4, 2003
    #4
  5. Danny

    John Dibling Guest

    On Mon, 04 Aug 2003 13:27:41 -0700, Andrey Tarasevich
    <> wrote:

    >Artie Gold wrote:
    >> ...
    >>> 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
    John Dibling, Aug 4, 2003
    #5
  6. "John Dibling" <dib@substitute_my_full_last_name_here.com> wrote...
    > On Mon, 04 Aug 2003 13:27:41 -0700, Andrey Tarasevich
    > <> wrote:
    >
    > >Artie Gold wrote:
    > >> ...
    > >>> 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
    Victor Bazarov, Aug 4, 2003
    #6
  7. John Dibling wrote:
    >> ...
    >>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.

    --
    Best regards,
    Andrey Tarasevich
    Brainbench C and C++ Programming MVP
    Andrey Tarasevich, Aug 4, 2003
    #7
  8. > >> ...
    > >>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
    Web Developer, Aug 5, 2003
    #8
  9. "Web Developer" <> wrote in message
    news:...
    > > >> ...
    > > >>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
    Josephine Schafer, Aug 5, 2003
    #9
  10. Danny

    J. Campbell Guest

    Rob Williscroft <> wrote in message news:<Xns93CDC96C98109ukcoREMOVEfreenetrtw@195.129.110.130>...
    > Danny wrote in news::
    >
    > > 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. Campbell, Aug 5, 2003
    #10
  11. Danny

    John Dibling Guest

    On Tue, 5 Aug 2003 19:48:17 +0930, "Web Developer"
    <> wrote:

    >
    > 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
    John Dibling, Aug 5, 2003
    #11
  12. "J. Campbell" <> wrote...
    > Rob Williscroft <> wrote in message

    news:<Xns93CDC96C98109ukcoREMOVEfreenetrtw@195.129.110.130>...
    > > Danny wrote in news::
    > >
    > > > 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
    Victor Bazarov, Aug 5, 2003
    #12
  13. Danny

    Adam Fineman Guest

    J. Campbell wrote:
    <snip>
    > 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
    Adam Fineman, Aug 5, 2003
    #13
  14. J. Campbell wrote in
    news::

    > Rob Williscroft <> wrote in message
    > news:<Xns93CDC96C98109ukcoREMOVEfreenetrtw@195.129.110.130>...
    >> Danny wrote in news::
    >>
    >> > 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.
    --
    http://www.victim-prime.dsl.pipex.com/
    Rob Williscroft, Aug 5, 2003
    #14
  15. Rob Williscroft wrote:
    > ...
    > 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.

    --
    Best regards,
    Andrey Tarasevich
    Brainbench C and C++ Programming MVP
    Andrey Tarasevich, Aug 5, 2003
    #15
  16. Andrey Tarasevich wrote in news::

    >> 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.
    --
    http://www.victim-prime.dsl.pipex.com/
    Rob Williscroft, Aug 5, 2003
    #16
  17. > > 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 148
    82%2D1998

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


    WD



    ---
    Outgoing mail is certified Virus Free.
    Checked by AVG anti-virus system (http://www.grisoft.com).
    Version: 6.0.504 / Virus Database: 302 - Release Date: 24/07/2003
    Web Developer, Aug 6, 2003
    #17
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Koster

    Array initialisation

    Koster, Sep 6, 2003, in forum: C Programming
    Replies:
    4
    Views:
    483
    Joe Wright
    Sep 8, 2003
  2. Michael

    Define and array initialisation

    Michael, Jul 7, 2004, in forum: C Programming
    Replies:
    7
    Views:
    308
    Michael
    Jul 7, 2004
  3. Replies:
    3
    Views:
    334
    Al Balmer
    Dec 21, 2006
  4. Tim Clacy
    Replies:
    8
    Views:
    382
    Tim Clacy
    May 30, 2006
  5. Olaf P.

    Array of Array Initialisation

    Olaf P., Apr 24, 2007, in forum: C Programming
    Replies:
    2
    Views:
    314
    Duncan Muirhead
    Apr 24, 2007
Loading...

Share This Page