Raicha
Raicha

Reputation: 138

Some weird exception throws

The strange problem appears in my program. It is working, but in debugging it shows the "Exception thrown" in random places at the outputting

cout<<"Average value:"<<u3.apr();
    _getch();

Sometimes, it even throws this error after the main function (Behind the {}) It is quite annoying because the program just closes after 3 seconds because of these errors. (Maybe that's because of class, but I'm trying to learn it ;) )

Have tried already changing lines order, rewriting class name and array name.

#include <iostream>
#include <conio.h>

using namespace std;

class vid
{
private:
    int i, j;
    double rez, sum=0;
public:
    int size;
    double *arr = new double[size];

    double apr()
    {
        for (i = 0; i < size; i++)
        {
            sum += (*(arr + i));
        }

        return sum / size;

    }
};
int main()
{
    vid u3;
    cout << "Enter array length:";
    cin >> u3.size;
    for (int i = 0; i < u3.size; i++)
    {
        cout << "Enter array's " << i << " element:" << endl;
        cin >> *(u3.arr+i);
    }
    cout << "Your array:" << endl;
    for (int i = 0; i < u3.size; i++)
    {
        cout << *(u3.arr + i) << "\t";
    }
    cout << endl;
    cout<<"Average value:"<<u3.apr();
    _getch();
}

Thanks for any help ;)

Upvotes: 1

Views: 79

Answers (2)

Gardener
Gardener

Reputation: 2660

u3.size is not set until after u3 is constructed. By setting u3.size you can avoid this compiler-time error.

It seems that as an alternative solution, you might want to consider how to get rid of the new call and the need to write a destructor that will delete arr.

By creating a constructor that takes a size parameter AND by switching arr to a std::vector, you can allow the class to hold the vector and handle memory allocation and deallocation:

#include <iostream>
#include <vector>

using namespace std;

class vid
{
private:
    int i, j;
    double rez, sum=0;

public:
    int size;
    std::vector<double> arr;

    // constructor requires size to be passed in;
    // constructor initializes the arr array with the passed in size to zeroes.
    vid(int argSize) : size(argSize), arr(argSize, 0.0){ }

    double apr()
    {
      for (i = 0; i < size; i++)
      {
        sum += arr[i];
      }
      return sum / size;
    }
};
int main()
{
  uint size;
  cout << "Enter array length:";
  cin >> size;

  vid u3(size);

  for (int i = 0; i < u3.size; i++)
  {
    cout << "Enter array's #" << i << " element:" << endl;
    cin >> u3.arr[i];
  }
  cout << "Your array:" << endl;
  for (int i = 0; i < u3.size; i++)
  {
    cout << u3.arr[i] << "\t";
  }
  cout << endl;
  cout<<"Average value:"<<u3.apr();
  char ch;
  cin >> ch;
}

Upvotes: 1

Lightness Races in Orbit
Lightness Races in Orbit

Reputation: 385385

arr is initialised when u3 is constructed.

But you didn't populate u3.size until later.

So, your array has indeterminate length (which is already UB), and your accesses later may be invalid.

You're going to have to manage your class's member a bit more cleverly!

Such classes generally have a "resize" function that performs the allocation per the requested size. Don't forget to safely kill any prior allocation, transplanting data if necessary. You can find online plenty of examples of a vector implementation.

Certainly renaming classes and randomly re-ordering the lines of your program's source code is not going to solve anything.

Upvotes: 5

Related Questions