| View previous topic :: View next topic |
| Author |
Message |
codewarr2000@yahoo.com Guest
|
Posted: Thu Jul 28, 2005 9:02 pm Post subject: Retrieving a class instance item from a vector |
|
|
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
|
Posted: Thu Jul 28, 2005 10:09 pm Post subject: Re: Retrieving a class instance item from a vector |
|
|
[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.
Do NOT use 'insert'. Use 'push_back()' instead.
V
|
|
| Back to top |
|
 |
codewarr2000@yahoo.com Guest
|
Posted: Fri Jul 29, 2005 3:39 pm Post subject: Re: Retrieving a class instance item from a vector |
|
|
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
|
Posted: Fri Jul 29, 2005 3:59 pm Post subject: Re: Retrieving a class instance item from a vector |
|
|
[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
|
Posted: Fri Jul 29, 2005 4:10 pm Post subject: Re: Retrieving a class instance item from a vector |
|
|
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 |
|
 |
|