C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Retrieving a class instance item from a vector

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ language (comp.lang.c++)
View previous topic :: View next topic  
Author Message
codewarr2000@yahoo.com
Guest





PostPosted: Thu Jul 28, 2005 9:02 pm    Post subject: Retrieving a class instance item from a vector Reply with quote



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(iteratorBankedDataMemoryLayout,tempObject);

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

bankedDataMemoryLayout.insert(iteratorBankedDataMemoryLayout,tempObject);

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

bankedDataMemoryLayout.insert(iteratorBankedDataMemoryLayout,tempObject);

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

bankedDataMemoryLayout.insert(iteratorBankedDataMemoryLayout,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)*iteratorBankedDataMemoryLayout);

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;
}

Back to top
Victor Bazarov
Guest





PostPosted: Thu Jul 28, 2005 10:09 pm    Post subject: Re: Retrieving a class instance item from a vector Reply with quote



[email]codewarr2000 (AT) yahoo (DOT) com[/email] wrote:
Quote:
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...

Quote:
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(iteratorBankedDataMemoryLayout,tempObject);

.... which is invalidated by this 'insert'...

Quote:

iteratorBankedDataMemoryLayout++;

.... incrementing it here causes _undefined behaviour_ ...

Quote:

bankedDataMemoryLayout.insert(iteratorBankedDataMemoryLayout,tempObject);

.... and trying to use it here again causes _undefined behaviour_ as well.

Quote:
[...]

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

V



Back to top
codewarr2000@yahoo.com
Guest





PostPosted: Fri Jul 29, 2005 3:39 pm    Post subject: Re: Retrieving a class instance item from a vector Reply with quote



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;
}

Back to top
Victor Bazarov
Guest





PostPosted: Fri Jul 29, 2005 3:59 pm    Post subject: Re: Retrieving a class instance item from a vector Reply with quote

[email]codewarr2000 (AT) yahoo (DOT) com[/email] wrote:

Quote:
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?

Quote:

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


V

Back to top
codewarr2000@yahoo.com
Guest





PostPosted: Fri Jul 29, 2005 4:10 pm    Post subject: Re: Retrieving a class instance item from a vector Reply with quote

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.

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ language (comp.lang.c++) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.