By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
454,911 Members | 1,134 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 454,911 IT Pros & Developers. It's quick & easy.

Retrieving a class instance item from a vector

P: n/a
Having problem with retrieving a class instance item from a Vector.
This is the result of the code below.

Also a weird note: If I dont declare as:
TYPE_VECTOR_BANKED_MEMORY_DATA
bankedDataMemoryLayout(NUMBER_BANKS);
but an empty vector
TYPE_VECTOR_BANKED_MEMORY_DATA bankedDataMemoryLayout;

The program crashes on the 3rd insertion???

Additionally in the printout routine I am having a problem with using
an iterator. Can I not use an iterator?
PRIMING THE VECTOR:

STARTING ADDRESS: [c000] ENDING ADDRESS: [feff]
STARTING ADDRESS: [380000] ENDING ADDRESS: [3cbfff]
STARTING ADDRESS: [3d0000] ENDING ADDRESS: [3dbfff]
STARTING ADDRESS: [3e0000] ENDING ADDRESS: [3ebfff]
The size is: 8

Dumping contents of banks

STARTING ADDRESS: [0] ENDING ADDRESS: [0]
STARTING ADDRESS: [fdfdfdfd] ENDING ADDRESS: [dddddddd]
STARTING ADDRESS: [dddddddd] ENDING ADDRESS: [dddddddd]
STARTING ADDRESS: [dddddddd] ENDING ADDRESS: [dddddddd]
STARTING ADDRESS: [dddddddd] ENDING ADDRESS: [dddddddd]
STARTING ADDRESS: [dddddddd] ENDING ADDRESS: [dddddddd]
STARTING ADDRESS: [dddddddd] ENDING ADDRESS: [dddddddd]
STARTING ADDRESS: [dddddddd] ENDING ADDRESS: [dddddddd]
THE CODE PROGRAM:
---------------------------------------

class bankedMemoryDataClass
{
public:
//bankedMemoryDataClass(){}
bankedMemoryDataClass():
bankStartingMemoryAddress(0),
bankEndingMemoryAddress(0){};
~bankedMemoryDataClass(){}

unsigned long int getBankStartingMemoryAddress() const { return
bankStartingMemoryAddress;}
unsigned long int getBankEndingMemoryAddress() const {return
bankEndingMemoryAddress;}
void setBankStartingMemoryAddress(unsigned long int start){
bankStartingMemoryAddress = start;}
void setBankEndingMemoryAddress(unsigned long int end){
bankEndingMemoryAddress = end;}

private:

unsigned long int bankStartingMemoryAddress;
unsigned long int bankEndingMemoryAddress;

};

const int NUMBER_BANKS = 4;

typedef vector<bankedMemoryDataClass> TYPE_VECTOR_BANKED_MEMORY_DATA;

TYPE_VECTOR_BANKED_MEMORY_DATA bankedDataMemoryLayout(NUMBER_BANKS);
TYPE_VECTOR_BANKED_MEMORY_DATA::iterator
iteratorBankedDataMemoryLayout;
TYPE_VECTOR_BANKED_MEMORY_DATA::reference
referenceToBankData(TYPE_VECTOR_BANKED_MEMORY_DATA &);
//---------------------------------------------------------------------------

void initializeBankedMemoryLayout(void){

bankedMemoryDataClass tempObject;

iteratorBankedDataMemoryLayout = bankedDataMemoryLayout.begin();
cout.setf(std::ios::showbase);
tempObject.setBankStartingMemoryAddress(0xC000);
tempObject.setBankEndingMemoryAddress( 0xFEFF);
cout << "STARTING ADDRESS: [" << hex <<
tempObject.getBankStartingMemoryAddress() << "] ";
cout << "ENDING ADDRESS: [" << hex <<
tempObject.getBankEndingMemoryAddress() << "]" << endl;

bankedDataMemoryLayout.insert(iteratorBankedDataMe moryLayout,tempObject);

iteratorBankedDataMemoryLayout++;
tempObject.setBankStartingMemoryAddress(0x380000);
tempObject.setBankEndingMemoryAddress( 0x3CBFFF);
cout << "STARTING ADDRESS: [" <<
tempObject.getBankStartingMemoryAddress() << "] ";
cout << "ENDING ADDRESS: [" <<
tempObject.getBankEndingMemoryAddress() << "]" << endl;

bankedDataMemoryLayout.insert(iteratorBankedDataMe moryLayout,tempObject);

iteratorBankedDataMemoryLayout++;
tempObject.setBankStartingMemoryAddress(0x3D0000);
tempObject.setBankEndingMemoryAddress( 0x3DBFFF);
cout << "STARTING ADDRESS: [" <<
tempObject.getBankStartingMemoryAddress() << "] ";
cout << "ENDING ADDRESS: [" <<
tempObject.getBankEndingMemoryAddress() << "]" << endl;

bankedDataMemoryLayout.insert(iteratorBankedDataMe moryLayout,tempObject);

iteratorBankedDataMemoryLayout++;
tempObject.setBankStartingMemoryAddress(0x3E0000);
tempObject.setBankEndingMemoryAddress( 0x3EBFFF);
cout << "STARTING ADDRESS: [" <<
tempObject.getBankStartingMemoryAddress() << "] ";
cout << "ENDING ADDRESS: [" <<
tempObject.getBankEndingMemoryAddress() << "]" << endl;

bankedDataMemoryLayout.insert(iteratorBankedDataMe moryLayout,tempObject);
//cout.setf(std::ios::noshowbase);

cout << "The size is: " << bankedDataMemoryLayout.size() << endl;
}

void printOutBankedMemoryLayout(void){

bankedMemoryDataClass tempObject;

cout << endl << "Dumping contents of banks" << endl << endl;

for (int i=0; i<8; i++)
{
tempObject = bankedDataMemoryLayout[i *
sizeof(bankedMemoryDataClass)];

//cout << "bank (" << *iteratorBankedDataMemoryLayout << ") ";
cout << "STARTING ADDRESS: [" <<
tempObject.getBankStartingMemoryAddress() << "] ";
cout << "ENDING ADDRESS: [" <<
tempObject.getBankEndingMemoryAddress() << "]" << endl;
}
/*
for (iteratorBankedDataMemoryLayout = bankedDataMemoryLayout.begin();
iteratorBankedDataMemoryLayout != bankedDataMemoryLayout.end();
iteratorBankedDataMemoryLayout++){

tempObject =
bankedDataMemoryLayout.at((int)*iteratorBankedData MemoryLayout);

cout << "bank (" << *iteratorBankedDataMemoryLayout << ") ";
cout << "STARTING ADDRESS: [" <<
tempObject.getBankStartingMemoryAddress << "] ";
cout << "ENDING ADDRESS: [" <<
tempObject.getBankEndingMemoryAddress << "]" << endl;
}
*/
}

int main(int argc, char* argv[])
{
int index;

initializeBankedMemoryLayout();
printOutBankedMemoryLayout();

return 1;
}

Jul 28 '05 #1
Share this Question
Share on Google+
4 Replies


P: n/a
co**********@yahoo.com wrote:
Having problem with retrieving a class instance item from a Vector.
This is the result of the code below.
[...]
void initializeBankedMemoryLayout(void){

bankedMemoryDataClass tempObject;

iteratorBankedDataMemoryLayout = bankedDataMemoryLayout.begin();
....and you're hanging onto this iterator...
cout.setf(std::ios::showbase);
tempObject.setBankStartingMemoryAddress(0xC000);
tempObject.setBankEndingMemoryAddress( 0xFEFF);
cout << "STARTING ADDRESS: [" << hex <<
tempObject.getBankStartingMemoryAddress() << "] ";
cout << "ENDING ADDRESS: [" << hex <<
tempObject.getBankEndingMemoryAddress() << "]" << endl;

bankedDataMemoryLayout.insert(iteratorBankedDataMe moryLayout,tempObject);
.... which is invalidated by this 'insert'...

iteratorBankedDataMemoryLayout++;
.... incrementing it here causes _undefined behaviour_ ...

bankedDataMemoryLayout.insert(iteratorBankedDataMe moryLayout,tempObject);
.... and trying to use it here again causes _undefined behaviour_ as well.
[...]


Do NOT use 'insert'. Use 'push_back()' instead.

V
Jul 28 '05 #2

P: n/a
Ok, I am using the push_back now for insertion, but retrieving actually
fails / aborts on retrieving the first object (in which the data is
incorrect.).

void initializeBankedMemoryLayout(void){

bankedMemoryDataClass tempObject;

tempObject.setBankStartingMemoryAddress(0xC000);
tempObject.setBankEndingMemoryAddress( 0xFEFF);
cout << "STARTING ADDRESS: [" <<
tempObject.getBankStartingMemoryAddress() << "] ";
cout << "ENDING ADDRESS: [" <<
tempObject.getBankEndingMemoryAddress() << "]" << endl;
bankedDataMemoryLayout.push_back(tempObject);
}
void printOutBankedMemoryLayout(void){

bankedMemoryDataClass tempObject;
cout << endl << "Dumping contents of banks" << endl << endl;

for (int i=0; i<8; i++)
{
tempObject = (bankedMemoryDataClass)bankedDataMemoryLayout.at(i *
sizeof(bankedMemoryDataClass));

cout << "STARTING ADDRESS: [" <<
tempObject.getBankStartingMemoryAddress() << "] ";
cout << "ENDING ADDRESS: [" <<
tempObject.getBankEndingMemoryAddress() << "]" << endl;
}

Jul 29 '05 #3

P: n/a
co**********@yahoo.com wrote:
Ok, I am using the push_back now for insertion, but retrieving actually
fails / aborts on retrieving the first object (in which the data is
incorrect.).

[...]
for (int i=0; i<8; i++)
{
tempObject = (bankedMemoryDataClass)bankedDataMemoryLayout.at(i *
sizeof(bankedMemoryDataClass));
Why the hell do you use 'sizeof' here? RTFM about the meaning of the
argument to the 'at' member function.

And why do you need the 'at'? Why not simply use the indexing again?

cout << "STARTING ADDRESS: [" <<
tempObject.getBankStartingMemoryAddress() << "] ";
cout << "ENDING ADDRESS: [" <<
tempObject.getBankEndingMemoryAddress() << "]" << endl;
}


V
Jul 29 '05 #4

P: n/a
Resolved.

The problem is in the definition ot the vector.at(size_type n).
I thought to retrieve one needed:

for (int i=0; i<8; i++)
bankedDataMemoryLayout.at(i *sizeof(bankedMemoryDataClass));

but it is just
bankedDataMemoryLayout.at(i);

Thanks V.

Jul 29 '05 #5

This discussion thread is closed

Replies have been disabled for this discussion.