c++arraysconstant-expression

Why am I getting an "expected constant expression" error for the array size?


#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?


Solution

  • 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