#include <cmath>
#include <fstream>
#include <iomanip>
#include <iostream>
int main() {
int count = 0;
float sum = 0;
float maximum = -1000000;
std::ifstream points;
int size = 100;
float x[size][2]; // <<< error
while (count < size) {
points >> x[count][0];
points >> x[count][1];
count++;
}
}
This program is giving me expected constant expression error on the line where I declare float x[size][2]
. Why?
float x[size][2];
That doesn't work because declared arrays can't have runtime sizes. Try a vector:
std::vector< std::array<float, 2> > x(size);
Or use new
// identity<float[2]>::type *px = new float[size][2];
float (*px)[2] = new float[size][2];
// ... use and then delete
delete[] px;
If you don't have C++11 available, you can use boost::array
instead of std::array
.
If you don't have boost available, make your own array type you can stick into vector
template<typename T, size_t N>
struct array {
T data[N];
T &operator[](ptrdiff_t i) { return data[i]; }
T const &operator[](ptrdiff_t i) const { return data[i]; }
};
For easing the syntax of new
, you can use an identity
template which effectively is an in-place typedef (also available in boost
)
template<typename T>
struct identity {
typedef T type;
};
If you want, you can also use a vector of std::pair<float, float>
std::vector< std::pair<float, float> > x(size);
// syntax: x[i].first, x[i].second