What is wrong with the "for" loop?

P

Peter Olcott

Everything in this program produces the correct results except the part
dealing with the RealList. The "for" loop does not output the values that
were input to the ALL[3].RealList. What is the correct syntax to for this?
Thanks

#include <stdio.h>
#include <string>
#include <vector>

union AllType {
int Int;
double Real;
std::string* Text;
std::vector<double>* RealList;
};

void main()
{
std::vector<AllType> ALL;
ALL.reserve(10);
printf("sizeof(ALL)--->%d\n", sizeof(ALL));
printf("sizeof(AllType)--->%d\n", sizeof(AllType));
ALL[0].Int = 31415926;
ALL[1].Real = 3.1415926;
ALL[2].Text = new std::string("Hell Oh Whirled");
ALL[3].RealList = new std::vector<double>;
ALL[3].RealList->reserve(3);
ALL[3].RealList->push_back(123.0);
ALL[3].RealList->push_back(456.0);
ALL[3].RealList->push_back(789.0);
printf("%d\n", ALL[0].Int);
printf("%f\n", ALL[1].Real);
printf("%s\n", ALL[2].Text->c_str());
for (unsigned int N = 0; N < ALL[3].RealList->size(); N++)
printf("%d) %f\n", N, ALL[3].RealList[N]);
}
 
P

Peter van Merkerk

Peter Olcott said:
Everything in this program produces the correct results except the part
dealing with the RealList. The "for" loop does not output the values that
were input to the ALL[3].RealList. What is the correct syntax to for this?
Thanks

#include <stdio.h>
#include <string>
#include <vector>

union AllType {
int Int;
double Real;
std::string* Text;
std::vector<double>* RealList;
};

void main()
{
std::vector<AllType> ALL;
ALL.reserve(10);
printf("sizeof(ALL)--->%d\n", sizeof(ALL));
printf("sizeof(AllType)--->%d\n", sizeof(AllType));
ALL[0].Int = 31415926;
ALL[1].Real = 3.1415926;
ALL[2].Text = new std::string("Hell Oh Whirled");
ALL[3].RealList = new std::vector<double>;
ALL[3].RealList->reserve(3);
ALL[3].RealList->push_back(123.0);
ALL[3].RealList->push_back(456.0);
ALL[3].RealList->push_back(789.0);
printf("%d\n", ALL[0].Int);
printf("%f\n", ALL[1].Real);
printf("%s\n", ALL[2].Text->c_str());
for (unsigned int N = 0; N < ALL[3].RealList->size(); N++)
printf("%d) %f\n", N, ALL[3].RealList[N]);
}

The problem is that ALL[3].RealList is a pointer to a vector, rather
than the vector itself. Consequently the [] operator is performed on the
pointer rather than the vector. If you replace the for loop with this it
should work:

const std::vector<double>& v = *(ALL[3].RealList);
for (unsigned int N = 0; N < v.size(); N++)
{
printf("%d) %f\n", N, v[N]);
}
 
?

=?iso-8859-1?Q?Andr=E9_P=F6nitz?=

Peter Olcott said:
void main()

int main()
{
std::vector<AllType> ALL;
ALL.reserve(10);

You want 'resize' here, not 'reserve' if you want room for 10 items
printf("sizeof(ALL)--->%d\n", sizeof(ALL));

[This is the size of the vector's private data, completely unrelated to
the number of items stored there]
ALL[1].Real = 3.1415926;
ALL[2].Text = new std::string("Hell Oh Whirled");
ALL[3].RealList = new std::vector<double>;
ALL[3].RealList->reserve(3);

Same here.

Andre'
 
A

Andrew Koenig

Peter> void main()
Peter> {
Peter> std::vector<AllType> ALL;
Peter> ALL.reserve(10);
Peter> printf("sizeof(ALL)--->%d\n", sizeof(ALL));
Peter> printf("sizeof(AllType)--->%d\n", sizeof(AllType));
Peter> ALL[0].Int = 31415926;
Peter> ALL[1].Real = 3.1415926;
Peter> ALL[2].Text = new std::string("Hell Oh Whirled");
Peter> ALL[3].RealList = new std::vector<double>;

These last four statements yield undefined behavior because ALL does
not have any elements, as you would see if you had executed

printf("ALL.size()--->%d\n", ALL.size()");

If you want to cause ALL to have 10 elements, you should execute

ALL.resize(10);

instead of calling reserve.
 

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

Forum statistics

Threads
473,731
Messages
2,569,432
Members
44,832
Latest member
GlennSmall

Latest Threads

Top