Array Variable initialization
-
why don't you just do this :
TModel = {0};
[VisualCalc][Binary Guide][CommDialogs] | [Forums Guidelines]
Because it doesn't work? For instance
int a[50] = {0};
Doesn't produce the result I'm expecting (it initializes only the first array element). Am i wrong? :)
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke
[My articles] -
Because it doesn't work? For instance
int a[50] = {0};
Doesn't produce the result I'm expecting (it initializes only the first array element). Am i wrong? :)
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke
[My articles]CPallini wrote:
Am i wrong?
you are, or the compiler is ! the standard says that such a construction (when initializing a variable at the same time than declaration) initializes every element of the array to their default value. I'm even pretty sure Nemanja Trifunovic quoted me somewhere about that...
[VisualCalc][Binary Guide][CommDialogs] | [Forums Guidelines]
-
Because it doesn't work? For instance
int a[50] = {0};
Doesn't produce the result I'm expecting (it initializes only the first array element). Am i wrong? :)
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke
[My articles]CPallini wrote:
(it initializes only the first array element).
Not according to the
STOSx
instructions. Of course, I only use it to initialize POD types to0
. Otherwise, I'd usememset()
."Love people and use things, not love things and use people." - Unknown
"The brick walls are there for a reason...to stop the people who don't want it badly enough." - Randy Pausch
-
CPallini wrote:
Am i wrong?
you are, or the compiler is ! the standard says that such a construction (when initializing a variable at the same time than declaration) initializes every element of the array to their default value. I'm even pretty sure Nemanja Trifunovic quoted me somewhere about that...
[VisualCalc][Binary Guide][CommDialogs] | [Forums Guidelines]
toxcct wrote:
you are, or the compiler is !
Maybe the latter: the program:
#include <iostream>
using namespace std;void main()
{
const int N = 10;
int a[N]={7};for (int i=0; i<N;i++)
{
cout << a[i] << endl;
}
}the output:
7
0
0
0
0
0
0
0
0
0The system:
Visual C++ 2008 Express Edition
running onWin XP
. Eventually YOU may be wrong! ;P (actually I'm quite confident you're right, but don't use it unless you really want surprises!) [added] Actually I thinkVS2008
cannot be so out-of-the-standard. I suppose the standard establishing that, whenever the initialization list is too short, the remaining array items are default-initialized (to0
if integers). [/added] :)If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke
[My articles]modified on Tuesday, September 9, 2008 11:53 AM
-
CPallini wrote:
(it initializes only the first array element).
Not according to the
STOSx
instructions. Of course, I only use it to initialize POD types to0
. Otherwise, I'd usememset()
."Love people and use things, not love things and use people." - Unknown
"The brick walls are there for a reason...to stop the people who don't want it badly enough." - Randy Pausch
Sorry no
STOS
here:...
const int N = 10;
int a[N]={7};
00401003 xor eax,eax
00401005 push esi
00401006 mov dword ptr [esp+8],7
0040100E mov dword ptr [esp+0Ch],eax
00401012 mov dword ptr [esp+10h],eax
00401016 mov dword ptr [esp+14h],eax
0040101A mov dword ptr [esp+18h],eax
0040101E mov dword ptr [esp+1Ch],eax
00401022 mov dword ptr [esp+20h],eax
00401026 mov dword ptr [esp+24h],eax
0040102A mov dword ptr [esp+28h],eax
0040102E mov dword ptr [esp+2Ch],eax
...(
Visual C++ 2008 Express Edition, Win XP
). :)If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke
[My articles] -
toxcct wrote:
you are, or the compiler is !
Maybe the latter: the program:
#include <iostream>
using namespace std;void main()
{
const int N = 10;
int a[N]={7};for (int i=0; i<N;i++)
{
cout << a[i] << endl;
}
}the output:
7
0
0
0
0
0
0
0
0
0The system:
Visual C++ 2008 Express Edition
running onWin XP
. Eventually YOU may be wrong! ;P (actually I'm quite confident you're right, but don't use it unless you really want surprises!) [added] Actually I thinkVS2008
cannot be so out-of-the-standard. I suppose the standard establishing that, whenever the initialization list is too short, the remaining array items are default-initialized (to0
if integers). [/added] :)If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke
[My articles]modified on Tuesday, September 9, 2008 11:53 AM
-
Sorry no
STOS
here:...
const int N = 10;
int a[N]={7};
00401003 xor eax,eax
00401005 push esi
00401006 mov dword ptr [esp+8],7
0040100E mov dword ptr [esp+0Ch],eax
00401012 mov dword ptr [esp+10h],eax
00401016 mov dword ptr [esp+14h],eax
0040101A mov dword ptr [esp+18h],eax
0040101E mov dword ptr [esp+1Ch],eax
00401022 mov dword ptr [esp+20h],eax
00401026 mov dword ptr [esp+24h],eax
0040102A mov dword ptr [esp+28h],eax
0040102E mov dword ptr [esp+2Ch],eax
...(
Visual C++ 2008 Express Edition, Win XP
). :)If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke
[My articles]CPallini wrote:
00401003 xor eax,eax
Look two lines up from this one and you should find:
rep stosd
"Love people and use things, not love things and use people." - Unknown
"The brick walls are there for a reason...to stop the people who don't want it badly enough." - Randy Pausch
-
CPallini wrote:
00401003 xor eax,eax
Look two lines up from this one and you should find:
rep stosd
"Love people and use things, not love things and use people." - Unknown
"The brick walls are there for a reason...to stop the people who don't want it badly enough." - Randy Pausch
No luck (there isn't such insruction). On the other hand, the output of this program [^] confirms my assumption. See also Sandip's post [^]. I should admit I was very surprised by such a behaviour. :)
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke
[My articles] -
SandipG :) wrote:
Same output with Visual C++ 6.0
Visual C++ is not what a decent programmer call a standard compliant compiler, Sir !
[VisualCalc][Binary Guide][CommDialogs] | [Forums Guidelines]
-
No luck (there isn't such insruction). On the other hand, the output of this program [^] confirms my assumption. See also Sandip's post [^]. I should admit I was very surprised by such a behaviour. :)
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke
[My articles]and what about {0} instead of {7}, and in Release Mode, not in Debug Mode ?
[VisualCalc][Binary Guide][CommDialogs] | [Forums Guidelines]
-
and what about {0} instead of {7}, and in Release Mode, not in Debug Mode ?
[VisualCalc][Binary Guide][CommDialogs] | [Forums Guidelines]
See my added remark here [^]. BTW my tests were of course performed both in
Debug
and theRelease
mode. ;P :)If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke
[My articles] -
and what about {0} instead of {7}, and in Release Mode, not in Debug Mode ?
[VisualCalc][Binary Guide][CommDialogs] | [Forums Guidelines]
toxcct wrote:
...and what about {0} instead of {7}...
0
works fine.toxcct wrote:
...and in Release Mode, not in Debug Mode ?
Same results for both
0
and7
. This is why I only do it when setting things to0
. I usememset()
otherwise."Love people and use things, not love things and use people." - Unknown
"The brick walls are there for a reason...to stop the people who don't want it badly enough." - Randy Pausch
-
SandipG :) wrote:
Same output with Visual C++ 6.0
Visual C++ is not what a decent programmer call a standard compliant compiler, Sir !
[VisualCalc][Binary Guide][CommDialogs] | [Forums Guidelines]
IMHO such a discrepancy would be too gross, even for
VC6
. :)If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke
[My articles] -
IMHO such a discrepancy would be too gross, even for
VC6
. :)If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke
[My articles]yes, probably, but it's not *THE* compiler to test the standard ! ;) ;P
[VisualCalc][Binary Guide][CommDialogs] | [Forums Guidelines]
-
toxcct wrote:
...and what about {0} instead of {7}...
0
works fine.toxcct wrote:
...and in Release Mode, not in Debug Mode ?
Same results for both
0
and7
. This is why I only do it when setting things to0
. I usememset()
otherwise."Love people and use things, not love things and use people." - Unknown
"The brick walls are there for a reason...to stop the people who don't want it badly enough." - Randy Pausch
DavidCrow wrote:
0 works fine.
It is just a side-effect of default (int) initialization: you're actually initializing only the first array item. Try the following code:
#include <iostream>
using namespace std;struct MyStruct
{
MyStruct():_i(-1), _j(0),_k(-1){ }
MyStruct(int a):_i(a), _j(a), _k(a){ }
int _i,_j,_k;
};void main()
{
int i;
MyStruct a[5] = {0};
for (i=0; i<5; i++)
{
cout << i << ") {" << a[i]._i << ", " << a[i]._j <<", " << a[i]._k << "}" << endl;
}
}DavidCrow wrote:
This is why I only do it when setting things to 0. I use memset() otherwise.
The above is a wise approach. :)
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke
[My articles] -
DavidCrow wrote:
0 works fine.
It is just a side-effect of default (int) initialization: you're actually initializing only the first array item. Try the following code:
#include <iostream>
using namespace std;struct MyStruct
{
MyStruct():_i(-1), _j(0),_k(-1){ }
MyStruct(int a):_i(a), _j(a), _k(a){ }
int _i,_j,_k;
};void main()
{
int i;
MyStruct a[5] = {0};
for (i=0; i<5; i++)
{
cout << i << ") {" << a[i]._i << ", " << a[i]._j <<", " << a[i]._k << "}" << endl;
}
}DavidCrow wrote:
This is why I only do it when setting things to 0. I use memset() otherwise.
The above is a wise approach. :)
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke
[My articles]For structs, I'd use
memset()
. I only use0
forPOD
types."Love people and use things, not love things and use people." - Unknown
"The brick walls are there for a reason...to stop the people who don't want it badly enough." - Randy Pausch
-
For structs, I'd use
memset()
. I only use0
forPOD
types."Love people and use things, not love things and use people." - Unknown
"The brick walls are there for a reason...to stop the people who don't want it badly enough." - Randy Pausch
DavidCrow wrote:
For structs, I'd use memset(). I only use 0 for POD types.
That's good. :)
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler. -- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong. -- Iain Clarke
[My articles]