有人可以解释一下,为什么我的代码不起作用?

时间:2018-05-26 12:36:26

标签: c++

我是C ++的新手,我必须解决大学的任务,我必须制作一个结构矩阵并用随机整数填充它。我用“!”标记了这一行。出现错误的地方。 它是错误C2131(Visual C ++编译器)。它说“表达没有评估为常数”。

struct Matrix{
   int rows;
   int columns;
   Matrix(int r, int c){
      rows = r, columns = c;
   }
   int produceMatrix(){
       int matrix[rows][columns];  "!"
       for(int i = 0; i != rows; i++){
           for(int j = 0; j != columns; j++){
               matrix[i][j] = rand() %10 +1;
           }
       }
       return 0;
   }
   int showMatrix(){
       for(int i = 0; i != rows; i++){
           for(int j = 0; j != columns; j++){
               cout << matrix[i][j]<< endl;
           }
       }
   }
};


int main()
{
    srand(time(0));
    Matrix a(3, 4);

}    

3 个答案:

答案 0 :(得分:2)

如果您计划创建仅在运行时已知的rowscolumns值的矩阵,最好使用std::vector<std::vector<int>>来保存数据,就像您使用的静态数组一样需要在编译时知道它的大小。但是,如果在编译时知道所有大小,并且您只是想要创建不同矩阵大小的灵活性,则可以使用模板,例如:

#include <iostream>
#include <ctime>

template <int ROWS, int COLUMNS>
struct Matrix
{
    int rows = ROWS;
    int columns = COLUMNS;
    int matrix[ROWS][COLUMNS] = {};

    void produceMatrix()
    {
        for (int i = 0; i < rows; i++)
        {
            for (int j = 0; j < columns; j++)
            {
                matrix[i][j] = rand() % 10 + 1;
            }
        }
    }

    void showMatrix()
    {
        for (int i = 0; i < rows; i++)
        {
            for (int j = 0; j < columns; j++)
            {
                std::cout << matrix[i][j] << "\t";
            }
            std::cout << std::endl;
        }
    }
};


int main()
{
    srand(time(0));
    Matrix<3,4> a;
    a.produceMatrix();
    a.showMatrix();
}

https://ideone.com/rCLxSn

4   10  5   5   
3   8   3   6   
2   4   9   10

答案 1 :(得分:1)

有一点是你不能用这种方式制作变长数组。 另一件事是,如果你在一个函数中创建一个变量(就像你在int matrix中使用produceMatrix()一样),那么它在另一个函数中是不可见的。

因此,包含矩阵元素的数组应该在你的结构中声明,你已声明rowscolumns

要存储矩阵的元素,您可以使用长度等于rows*columns的一维数组。

现在,您需要某种动态数组才能使其具有编译时未知的长度。 一种解决方案是使用指针并在构造函数中使用new运算符定义数组。但是,如果使用new,则必须在某个时刻使用delete来释放内存,这意味着需要析构函数。另一个问题是复制你的矩阵。 另一个更简单的解决方案是使用std::vector,一个由c ++标准库提供的容器。以下是std::vector的处理方法(您需要在文件中添加#include<vector>):

struct Matrix{
int rows;
int columns;
vector<int> matrix;

Matrix(int r, int c){
rows = r, columns = c;
matrix = vector<int>(c*r);
}
int produceMatrix(){

    for(int i = 0; i < matrix.size(); i++){
        matrix[i] = rand() %10 +1;
    }
    return 0;
}
int showMatrix(){
    for(int i = 1; i <= matrix.size(); i++){
        cout << matrix[i-1];
        if(i%columns == 0) cout << endl;
        else cout << " ";
    }
    return 0;
}
};

答案 2 :(得分:0)

正如很多人评论的那样,请通过一本好的C ++书来了解数组,类,结构等。至于你的代码,以下内容可能会产生我想你想要的东西:

#include <iostream>
#include <vector>

struct Matrix
{
    int rows;
    int columns;
    std::vector<std::vector<int>> matrix;

    Matrix(int r, int c): rows(r), columns(c)
    {
        matrix.resize(r);
        for(int i = 0; i < r; i++)
            matrix[i].resize(c);
    }
    int produceMatrix()
    {
        for(int i = 0; i != rows; i++)
            for(int j = 0; j != columns; j++)
               matrix[i][j] = rand() %10 +1;
        return 0;
    }

    int showMatrix()
    {
        for(int i = 0; i != rows; i++)
        {
            for(int j = 0; j != columns; j++)
                std::cout << matrix[i][j]<<" ";
        }
        std::cout<<'\n';
    }
};

int main()
{
    srand(time(0));
    Matrix a(3, 4);
    a.produceMatrix();
    a.showMatrix();
}