Retrieving a class instance item from a vector

Discussion in 'C++' started by codewarr2000@yahoo.com, Jul 28, 2005.

  1. Guest

    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;
    }
     
    , Jul 28, 2005
    #1
    1. Advertising

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


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

    >
    > iteratorBankedDataMemoryLayout++;


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

    >
    > 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
     
    Victor Bazarov, Jul 28, 2005
    #2
    1. Advertising

  3. Guest

    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, 2005
    #3
  4. 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
     
    Victor Bazarov, Jul 29, 2005
    #4
  5. Guest

    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, 2005
    #5
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. pmatos
    Replies:
    6
    Views:
    23,821
  2. Sridhar R
    Replies:
    14
    Views:
    1,408
    =?iso-8859-1?Q?Fran=E7ois?= Pinard
    Feb 10, 2004
  3. Replies:
    8
    Views:
    1,930
    Csaba
    Feb 18, 2006
  4. Javier
    Replies:
    2
    Views:
    567
    James Kanze
    Sep 4, 2007
  5. Martin P. Hellwig
    Replies:
    1
    Views:
    377
    Martin P. Hellwig
    Mar 26, 2010
Loading...

Share This Page