0

So I have this code I wrote. I understand it is very basic and probably should never ever be done like this. I was just trying to get it to work. The problem is when my push_back function is called all the variables are suddenly jumbled and it fails to work. Such as the vectorsize becomes 1, and the cap becomes some random large number. I was wondering what was happening and how to fix it.

This is the code for the vector class

#include "MyVector.h"

void MyVector::grow()
{
    if (cap == 0)
        cap = MINCAP;
    else
        cap = cap*MINCAP;
    int* temp = new int[cap];
    for (int i = 0; i < vectorSize; i++)
    {
        temp [i] = theVector[i];
    }
    delete[] theVector;
    theVector = temp;
}

MyVector::MyVector()
{
    clear();
}

MyVector::~MyVector()
{
}

MyVector::MyVector(int _cap)
{
    cap = _cap;
}

int MyVector::size()
{
    return vectorSize;
}

int MyVector::capacity()
{
    return cap;
}

void MyVector::clear()
{
    vectorSize = 0;
    cap = MINCAP;
    delete(theVector);
    theVector = new int[MINCAP];
}

void MyVector::push_back(int n)
{
    if (vectorSize+1 >= cap) 
    {
        grow();
        theVector[vectorSize] = n;
    }
    else 
    {
        theVector[vectorSize] = n;
    }
}

int MyVector::at(int _location)
{
    return theVector[_location];
}

This is the code for the driver program to test it.

// Project #12 Implementation file for the driver
// CS 1400  (your section)
// Your name
// the date
// ------------------------
#include "driver.h"

int main()
{
    // Create a default vector 
    MyVector sam;

    // push some data into sam
    cout << "\nPushing three values into sam";
    //It seems to be happening right here when the function is called
    sam.push_back(TEST_VALUE1);
    sam.push_back(TEST_VALUE2);
    sam.push_back(TEST_VALUE3);

    cout << "\nThe values in sam are: ";

    // test for out of bounds condition here
    // and test exception 
    for (int i = 0; i < sam.size() + 1; i++)
    {
        try
        {
            cout << sam.at(i) << " ";
        }
        catch (int badIndex)
        {
            cout << "\nOut of bounds at index " << badIndex << endl;
        }
    }
    cout << "\n--------------\n";

    // clear sam and display its size and capacity
    sam.clear();
    cout << "\nsam has been cleared.";
    cout << "\nSam's size is now " << sam.size();
    cout << "\nSam's capacity is now " << sam.capacity() << endl;
    cout << "---------------\n";

    // Push 12 values into the vector - it should grow
    cout << "\nPush 12 values into sam.";
    for (int i = 0; i < MAX; i++)
        sam.push_back(i);

    cout << "\nSam's size is now " << sam.size();
    cout << "\nSam's capcacity is now " << sam.capacity() << endl;
    cout << "---------------\n";

    cout << "\nTest to see if contents are correct...";
    // display the values in the vector
    for (int i = 0; i < sam.size(); i++)
    {

        cout << sam.at(i) << " ";
    }
    cout << "\n--------------\n";

    cout << "\n\nTest Complete...";

    cout << endl;
    system("PAUSE");
    return 0;
}
Mindstormer
  • 299
  • 3
  • 16
  • If you want to down vote this please do but also tell me why you are down voting it so I can clarify for others. – Mindstormer Jul 23 '16 at 13:41
  • read implementations of what you want to implement before trying to implement anything like it. Also learn about RAII! [stl_vector.h](https://gcc.gnu.org/onlinedocs/gcc-6.1.0/libstdc++/api/a01638_source.html), [stl_vector.tcc](https://gcc.gnu.org/onlinedocs/gcc-6.1.0/libstdc++/api/a01719_source.html) , [vector ref](https://gcc.gnu.org/onlinedocs/gcc-6.1.0/libstdc++/api/a01032.html). – mash Jul 23 '16 at 14:00
  • It's not clear what kind of error you get so your question is not clear. Post at [codereview](https://codereview.stackexchange.com) if you're interested in why exactly you shouldn't write certain things certain ways. – mash Jul 23 '16 at 14:04
  • *I was just trying to get it to work* -- The problem is there is no such thing as "just trying" when it comes to creating a dynamic array class. You either know how to do this already, and/or you learn how to do this from reading and understanding existing implementations. This is more of trying to run a marathon before learning how to walk. In addition, why are you not using a debugger -- you have one obvious error in `push_back` dealing with the `vectorSize` variable. – PaulMcKenzie Jul 23 '16 at 14:20
  • 1
    theVector is not set to NULL in class constructor. – Vyacheslav Napadovsky Jul 23 '16 at 14:33
  • @slavanap It's worse, calling clear() in the constructor he deletes an uninitialized pointer and allocates `MINCAP` ints for an empty vector... – Bob__ Jul 23 '16 at 14:48
  • Also give [What is The Rule of Three?](http://stackoverflow.com/questions/4172722/what-is-the-rule-of-three) a good read over and you can head off what are likely to be the next set of bugs. – user4581301 Jul 23 '16 at 17:09

1 Answers1

0

You are not showing the private members of your class, but assuming that cap is the size of the allocated memory, while vectorSize is the actual size the push_back function could be:

void MyVector::push_back(int n)
{
    if ( vectorSize == cap )
    // if it's full ^^ needs more space
    {
        grow();
    }
    theVector[vectorSize] = n;
    // update the size after insertion
    ++vectorSize;
}

Please, note that there are many other issues, like the constructor which set the capacity without allocating any memory or the lack of a destructor. Remember also that new could throw.

Bob__
  • 12,361
  • 3
  • 28
  • 42