开发者

Why my prog can't run correctly?

开发者 https://www.devze.com 2023-01-20 01:25 出处:网络
// Calculat开发者_StackOverflowe the quarters of a set of integers #include <iostream> #include <vector>

Why my prog can't run correctly?

// Calculat开发者_StackOverflowe the quarters of a set of integers

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

using std::cin;
using std::cout;
using std::endl;
using std::vector;
using std::sort;

int main()
{
 // Ask for a set of integers
 cout << "Please input a set of integers: "
   << endl;

 // Read the set of integers
  // x is the variable to write
 int x;
  // int_set is the set of integers to write
 vector<int> int_set;
 while (cin >> x)
  {
   int_set.push_back(x);
  }

 // Check if the integer set is vacant 
 typedef std::vector<int>::size_type vec_sz;
 vec_sz size = int_set.size();
 if (size == 0)
  cout << "There are no data. "
    << "Please try again. ";

 // Sort
 sort (int_set.begin(), int_set.end());

 // The set of integers multiply 1/4
 vector<double> int_set_quarter;
 cout << "The quarters of the set of integers are: ";
 for (int i = 0; i != size; ++i)
  {
   int_set_quarter[i] = 1/4 * int_set[i];
   cout << int_set_quarter[i]; 
   cout << endl;
  }

    getch();
 return 0;
}

If you run, then it will collapse...


int_set_quarter's size is 0 and you index on it. Change

vector<double> int_set_quarter;

to

vector<double> int_set_quarter(size);


The problem is this:

vector<double> int_set_quarter;
int_set_quarter[0] = 0.25;

This code will crash, because the int_set_quarter vector does not have a 0th element. You already know how to fix this (you used the same thing in your int_set vector). You add elements to the end of a vector with the push_back method. You can also use Armen's method of setting up the size of the vector initially via it's constructor.

But in this specific example, you don't need that. You never actually use the int_set_quarter vector, so you can just do this:

// The set of integers multiply 1/4
cout << "The quarters of the set of integers are: ";
for (int i = 0; i != size; ++i)
{
    double quarter = 1/4 * int_set[i];
    cout << quarter; 
    cout << endl;
}


You can't add elements to a vector the way you're trying to do with int_set_quarter, so you end up writing to somewhere that hasn't been allocated yet. This causes an access violation, and your program crashes.

You can either reserve the necessary space in the vector by providing the number of required elements when creating the vector, by calling reserve or resize, or by using push_back to add the element to the end of the vector...

...or, since you don't do anything with int_set_quarter after the loop, you can just calculate what you need to output for that iteration into a local variable, sa shown by Dean.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号