|
Hi!
I've initialized an Array element in the Constructor. But it shows syntax error.
TModels[1](0);
The error is:
error C2059: syntax error : '['
How to initialize an array element in the Constructor?
|
|
|
|
|
can you show your constructor please ?
T.RATHA KRISHNAN wrote: TModels[1](0);
this line makes absolutely no sense, and i don't even know what you're trying to achieve with this.
BTW, can't you just use the STL ans its containers ?
|
|
|
|
|
Thanks. I've corrected this error myself.
|
|
|
|
|
and for the benefit of everyone, will you share this with us ?
|
|
|
|
|
Oh! With Pleasure!
First I initialized the array elements like this:
TestAI::TestAI()
TModels[1](0)
, TModels[2](0)
, TModels[3](0)
{
}
and now I change it to the following:
TestAI::TestAI()
{
TModels[1] = 0;
TModels[2] = 0;
TModels[3] = 0;
}
and the errors vanished.
|
|
|
|
|
why don't you just do this :
TModel = {0};
|
|
|
|
|
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...
|
|
|
|
|
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
0
The system:
Visual C++ 2008 Express Edition running on Win XP .
Eventually YOU may be wrong! (actually I'm quite confident you're right, but don't use it unless you really want surprises!)
[added]
Actually I think VS2008 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 (to 0 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
|
|
|
|
|
Same output with Visual C++ 6.0, WinXP SP2
Surprising..
Regards,
Sandip.
|
|
|
|
|
SandipG wrote: Same output with Visual C++ 6.0
Visual C++ is not what a decent programmer call a standard compliant compiler, Sir !
|
|
|
|
|
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 !
|
|
|
|
|
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 to 0 . Otherwise, I'd use memset() .
"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]
|
|
|
|
|
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]
|
|
|
|
|
and what about {0} instead of {7}, and in Release Mode, not in Debug Mode ?
|
|
|
|
|
See my added remark here [^].
BTW my tests were of course performed both in Debug and the Release mode.
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: ...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 and 7 . This is why I only do it when setting things to 0 . I use memset() 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]
|
|
|
|
|
For structs, I'd use memset() . I only use 0 for POD 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]
|
|
|
|
|
I think you are trying to do something like this..
class A{
int TModels[3];
public:
A():TModels[1](0){}
};
int main(){
A a;
}
which is giving you above error:
As per my knowledge there is no (standard) C++ way of doing this. Array initializers do not exist for classes. So prob you can do it somewhat like this:
class A{
int TModels[3];
public:
A(){
for(int i=0; i<3; i++)
TModels[i] = 0;
}
};
int main(){
A a;
}
Hope it helps you
|
|
|
|
|
Thanks. I've already corrected that.
|
|
|
|