473,376 Members | 1,079 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,376 software developers and data experts.

POD initialization

I have the following structs below.

static PinDelayPtr unspecifiedPipoDelayModel(new PinDelay());

#define DELAY_VALUE_NOT_GIVEN -7654321.0

typedef boost::shared_ptr<struct PinDelayPinDelayPtr

struct DelayTime
{
double rise;
double fall;

DelayTime();
DelayTime(const double r, const double f);
};

struct PinDelay
{
DelayTime block;
DelayTime drive;
double load;
double maxload;
DelayTime usertime;

PinDelay();

PinDelay::PinDelay(const double pload, const double pmaxload,
const double brise, const double frise,
const double bfall, const double ffall,
const double urise, const double ufall);
};

struct DelayWireLoadTable
{
double slope;
unsigned int npinset;
std::vector<doublepins;
};

struct DelayCircuitImpl
{
DelayTime defarr;
DelayTime defreq;
DelayWireLoadTable wltable;
PinDelayPtr pipomodel;
};

My constructors looks like the following:

DelayTime::DelayTime()
: rise(DELAY_VALUE_NOT_GIVEN), fall(DELAY_VALUE_NOT_GIVEN) {}

PinDelay::PinDelay()
: load(DELAY_VALUE_NOT_GIVEN), maxload(DELAY_VALUE_NOT_GIVEN) {}

DelayCircuit::DelayCircuit()
: dc(new DelayCircuitImpl())
{
dc->wltable.slope = DELAY_VALUE_NOT_GIVEN;
dc->pipomodel = PinDelayPtr(new
PinDelay(*unspecifiedPipoDelayModel));
}

Since the struct contain POD (plain old data), I would think they
should be initialized to 0. However, I am not sure why the variable
'npinset' does not get a default value of 0. In my gdb output, I have
the following:
gdb) p *(*dc).dc
$4 = {
defarr = {
rise = -7654321,
fall = -7654321
},
defreq = {
rise = -7654321,
fall = -7654321
},
wltable = {
slope = -7654321,
npinset = 6311712,
pins = {
<std::_Vector_base<double,std::allocator<double= {
_M_impl = {
<std::allocator<double>= {
<__gnu_cxx::new_allocator<double>= {<No data fields>},
<No data fields>},
members of std::_Vector_base<double,std::allocator<double>
>::_Vector_impl:
_M_start = 0x0,
_M_finish = 0x0,
_M_end_of_storage = 0x0
}
}, <No data fields>}
},
pipomodel = {
px = 0x602960,
pn = {
pi_ = 0x6029b0
}
}
}

Everything looks good except, npinset has a garbage value. Is there
something I am not understanding about POD initialization? Something
in my code that is preventing npinset to be initialized to 0? Any
clarification is appreciation.

Thanks for your time.

Jun 19 '07 #1
4 2273
On 2007-06-19 22:36, pallav wrote:
I have the following structs below.

static PinDelayPtr unspecifiedPipoDelayModel(new PinDelay());

#define DELAY_VALUE_NOT_GIVEN -7654321.0

typedef boost::shared_ptr<struct PinDelayPinDelayPtr

struct DelayTime
{
double rise;
double fall;

DelayTime();
DelayTime(const double r, const double f);
};

struct PinDelay
{
DelayTime block;
DelayTime drive;
double load;
double maxload;
DelayTime usertime;

PinDelay();

PinDelay::PinDelay(const double pload, const double pmaxload,
const double brise, const double frise,
const double bfall, const double ffall,
const double urise, const double ufall);
};

struct DelayWireLoadTable
{
double slope;
unsigned int npinset;
std::vector<doublepins;
};

struct DelayCircuitImpl
{
DelayTime defarr;
DelayTime defreq;
DelayWireLoadTable wltable;
PinDelayPtr pipomodel;
};

My constructors looks like the following:

DelayTime::DelayTime()
: rise(DELAY_VALUE_NOT_GIVEN), fall(DELAY_VALUE_NOT_GIVEN) {}

PinDelay::PinDelay()
: load(DELAY_VALUE_NOT_GIVEN), maxload(DELAY_VALUE_NOT_GIVEN) {}

DelayCircuit::DelayCircuit()
: dc(new DelayCircuitImpl())
{
dc->wltable.slope = DELAY_VALUE_NOT_GIVEN;
dc->pipomodel = PinDelayPtr(new
PinDelay(*unspecifiedPipoDelayModel));
}

Since the struct contain POD (plain old data), I would think they
should be initialized to 0. However, I am not sure why the variable
'npinset' does not get a default value of 0. In my gdb output, I have
the following:
gdb) p *(*dc).dc
$4 = {
defarr = {
rise = -7654321,
fall = -7654321
},
defreq = {
rise = -7654321,
fall = -7654321
},
wltable = {
slope = -7654321,
npinset = 6311712,
pins = {
<std::_Vector_base<double,std::allocator<double= {
_M_impl = {
<std::allocator<double>= {
<__gnu_cxx::new_allocator<double>= {<No data fields>},
<No data fields>},
members of std::_Vector_base<double,std::allocator<double>
>>::_Vector_impl:
_M_start = 0x0,
_M_finish = 0x0,
_M_end_of_storage = 0x0
}
}, <No data fields>}
},
pipomodel = {
px = 0x602960,
pn = {
pi_ = 0x6029b0
}
}
}

Everything looks good except, npinset has a garbage value. Is there
something I am not understanding about POD initialization? Something
in my code that is preventing npinset to be initialized to 0? Any
clarification is appreciation.
I have not read you code so I don't know where you put your PODs but
they are only initialized to 0 if they are static or global (and
probably one more that I missed) but not on the stack or heap.

--
Erik Wikström
Jun 19 '07 #2
pallav wrote:
I have the following structs below.

static PinDelayPtr unspecifiedPipoDelayModel(new PinDelay());

#define DELAY_VALUE_NOT_GIVEN -7654321.0

typedef boost::shared_ptr<struct PinDelayPinDelayPtr

struct DelayTime
{
double rise;
double fall;

DelayTime();
DelayTime(const double r, const double f);
};

struct PinDelay
{
DelayTime block;
DelayTime drive;
double load;
double maxload;
DelayTime usertime;

PinDelay();

PinDelay::PinDelay(const double pload, const double pmaxload,
const double brise, const double frise,
const double bfall, const double ffall,
const double urise, const double ufall);
};

struct DelayWireLoadTable
{
double slope;
unsigned int npinset;
std::vector<doublepins;
};
The struct above is not a POD-struct. It contains a 'vector',
which is non-POD. When an object of this struct is default-
initialised, each member is default-initialised. For the 'pins'
vector it means to default-initialise (invoke the constructor),
for built-ins it means to NOT initialise.
>
struct DelayCircuitImpl
{
DelayTime defarr;
DelayTime defreq;
DelayWireLoadTable wltable;
PinDelayPtr pipomodel;
};

My constructors looks like the following:

DelayTime::DelayTime()
: rise(DELAY_VALUE_NOT_GIVEN), fall(DELAY_VALUE_NOT_GIVEN) {}

PinDelay::PinDelay()
: load(DELAY_VALUE_NOT_GIVEN), maxload(DELAY_VALUE_NOT_GIVEN) {}

DelayCircuit::DelayCircuit()
I don't see this class anywhere.
: dc(new DelayCircuitImpl())
{
If you look at 'dc->wltable' _right_here_, what would it be?
I would say that both 'slope' and 'npinset' would have garbage.
dc->wltable.slope = DELAY_VALUE_NOT_GIVEN;
dc->pipomodel = PinDelayPtr(new
PinDelay(*unspecifiedPipoDelayModel));
}

Since the struct contain POD (plain old data), I would think they
should be initialized to 0.
No.
However, I am not sure why the variable
'npinset' does not get a default value of 0.
It's not supposed to. Add a constructor to your 'DelayCircuitImpl'
_and_ to 'DelayWireLoadTable'.
In my gdb output, I have
the following:
gdb) p *(*dc).dc
$4 = {
defarr = {
rise = -7654321,
fall = -7654321
},
defreq = {
rise = -7654321,
fall = -7654321
},
wltable = {
slope = -7654321,
npinset = 6311712,
pins = {
<std::_Vector_base<double,std::allocator<double= {
_M_impl = {
<std::allocator<double>= {
<__gnu_cxx::new_allocator<double>= {<No data fields>},
<No data fields>},
members of std::_Vector_base<double,std::allocator<double>
>>:_Vector_impl:
_M_start = 0x0,
_M_finish = 0x0,
_M_end_of_storage = 0x0
}
}, <No data fields>}
},
pipomodel = {
px = 0x602960,
pn = {
pi_ = 0x6029b0
}
}
}

Everything looks good except, npinset has a garbage value. Is there
something I am not understanding about POD initialization? Something
in my code that is preventing npinset to be initialized to 0? Any
clarification is appreciation.
How about this:
------------------------------
#include <vector>
struct A {
int a;
std::vector<intvi;
};

#include <iostream>
struct B {
A *pa;
B() : pa(new A()) {
std::cout << pa->a << ' ' << pa->vi.size() << std::endl;
}
};

int main() {
B b;
}
-----------------------------
It should print something non-zero and then 0.

V
--
Please remove capital 'A's when replying by e-mail
I do not respond to top-posted replies, please don't ask
Jun 20 '07 #3

pallav wrote in message...
I have the following structs below.

static PinDelayPtr unspecifiedPipoDelayModel(new PinDelay());
#define DELAY_VALUE_NOT_GIVEN -7654321.0
typedef boost::shared_ptr<struct PinDelayPinDelayPtr

struct DelayTime {
double rise;
double fall;
DelayTime();
DelayTime(const double r, const double f);
};

struct PinDelay {
DelayTime block;
DelayTime drive;
double load;
double maxload;
DelayTime usertime;
PinDelay();
PinDelay::PinDelay(const double pload, const double pmaxload,
const double brise, const double frise,
const double bfall, const double ffall,
const double urise, const double ufall);
};

struct DelayWireLoadTable {
double slope;
unsigned int npinset;
std::vector<doublepins;
// 'npinset' isn't used in the code you showed. Either remove it, or init
it.
DelayWireLoadTable() : slope(0.0), npinset(0){}
// or, see below...
};

struct DelayCircuitImpl {
DelayTime defarr;
DelayTime defreq;
DelayWireLoadTable wltable;
PinDelayPtr pipomodel;
};

My constructors looks like the following:

DelayTime::DelayTime()
: rise(DELAY_VALUE_NOT_GIVEN), fall
(DELAY_VALUE_NOT_GIVEN) {}

PinDelay::PinDelay()
: load(DELAY_VALUE_NOT_GIVEN), maxload
(DELAY_VALUE_NOT_GIVEN) {}

DelayCircuit::DelayCircuit()
: dc(new DelayCircuitImpl()) {
dc->wltable.slope = DELAY_VALUE_NOT_GIVEN;
dc->pipomodel = PinDelayPtr(new
PinDelay(*unspecifiedPipoDelayModel));
// OR here, if you don't want a Ctor (for POD struct):
dc->wltable.npinset = 0;
}
[snip]

--
Bob R
POVrookie
Jun 20 '07 #4
On Jun 19, 8:26 pm, "Victor Bazarov" <v.Abaza...@comAcast.netwrote:
The struct above is not a POD-struct. It contains a 'vector',
which is non-POD. When an object of this struct is default-
initialised, each member is default-initialised. For the 'pins'
vector it means to default-initialise (invoke the constructor),
for built-ins it means to NOT initialise.
If you look at 'dc->wltable' _right_here_, what would it be?
I would say that both 'slope' and 'npinset' would have garbage.
Yes I see it now. Since it is allocating from the heap it is not
initialized and hence contains garbage.
>
dc->wltable.slope = DELAY_VALUE_NOT_GIVEN;
dc->pipomodel = PinDelayPtr(new
PinDelay(*unspecifiedPipoDelayModel));
}
Since the struct contain POD (plain old data), I would think they
should be initialized to 0.

No.

It's not supposed to. Add a constructor to your 'DelayCircuitImpl'
_and_ to 'DelayWireLoadTable'.
Right I understand now.
>

How about this:
------------------------------
#include <vector>
struct A {
int a;
std::vector<intvi;

};

#include <iostream>
struct B {
A *pa;
B() : pa(new A()) {
std::cout << pa->a << ' ' << pa->vi.size() << std::endl;
}

};

int main() {
B b;}

-----------------------------
It should print something non-zero and then 0.
Yes, it does.

Many thanks for the time/help everybody.
Jun 20 '07 #5

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

1
by: Qin Chen | last post by:
I will present very long code, hope someone will read it all, and teach me something like tom_usenet. This question comes to me when i read <<Think in C++>> 2nd, chapter 10 , name control,...
6
by: Alexander Stippler | last post by:
Hi, I wonder about the behaviour of como and icc on some very simple program. I thought initializing members of classes, which are of class type, would be 'direct initialized' (as the standard...
1
by: Jacek Dziedzic | last post by:
Hi! A) Why isn't it possible to set a member of the BASE class in an initialization list of a DERIVED class constructor (except for 'calling' the base constructor from there, of course)? I even...
10
by: JKop | last post by:
What's the difference between them? Take the following: #include <iostream> struct Blah { int k;
8
by: lovecreatesbea... | last post by:
K&R 2, sec 2.4 says: If the variable in question is not automatic, the initialization is done once only, conceptually before the program starts executing, ... . "Non-automatic variables are...
5
by: Jesper Schmidt | last post by:
When does CLR performs initialization of static variables in a class library? (1) when the class library is loaded (2) when a static variable is first referenced (3) when... It seems that...
23
by: Jess | last post by:
Hello, I understand the default-initialization happens if we don't initialize an object explicitly. I think for an object of a class type, the value is determined by the constructor, and for...
4
by: Jess | last post by:
Hello, I tried several books to find out the details of object initialization. Unfortunately, I'm still confused by two specific concepts, namely default-initialization and...
20
by: JohnQ | last post by:
The way I understand the startup of a C++ program is: A.) The stuff that happens before the entry point. B.) The stuff that happens between the entry point and the calling of main(). C.)...
11
by: subramanian100in | last post by:
Suppose we have a class named Test. Test obj; // assuming default ctor is available Test direct_init(obj); // direct initialization happens here Test copy_init = obj; // copy initialization...
1
by: CloudSolutions | last post by:
Introduction: For many beginners and individual users, requiring a credit card and email registration may pose a barrier when starting to use cloud servers. However, some cloud server providers now...
0
by: Faith0G | last post by:
I am starting a new it consulting business and it's been a while since I setup a new website. Is wordpress still the best web based software for hosting a 5 page website? The webpages will be...
0
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 3 Apr 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome former...
0
by: taylorcarr | last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
0
by: aa123db | last post by:
Variable and constants Use var or let for variables and const fror constants. Var foo ='bar'; Let foo ='bar';const baz ='bar'; Functions function $name$ ($parameters$) { } ...
0
by: ryjfgjl | last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.