错误:无法将参数'3'的'float(*)[(((sizetype)(((ssizetype)n)+ -1))+ 1)]'转换为'float(*)[100]'

时间:2014-03-01 23:46:13

标签: c++ matrix symmetric

我正在尝试做一个布尔函数来验证矩阵是否对称,但是我收到了这个错误:

  

| 54 |错误:无法转换'float()[(((sizetype)(((ssizetype)n)+ -1))+ 1)]''浮动()[ 100]'for argument'3'to'void Transpose(int,float()[100],float()[100])'|

#include <iostream>
using namespace std;

void Transpose(int n, float a[][MAX], float T[][MAX]) {
    int i,j;

    for(i = 0; i < n; i++){
        for(j = 0; j < n; j++){
            T[i][j] = a[j][i];
        }
    }
}

bool Symmetric(int n, float a[][MAX]) {
    float t[n][n];
    int i,j;

    for(i = 0; i < n; i++){
        for(j = 0; j < n; j++){
            t[i][j] = 0;
        }
    }

    Transpose(n,a,t); // <--- Error here.

    for(i = 0; i < n; i++){
        for(j = 0; j < n; j++){
            if(t[i][j] != a[i][j]){
                return false;
            }
        }
    }

    return true;
}

错误发生在Transpose(n,a,t);

2 个答案:

答案 0 :(得分:2)

编译器说的是float t[n][n]数组n,其中float T[][MAX]是编译时变量[即不是常数]与MAX不匹配,{{1是一个编译时常量。

float t[n][MAX]用于临时矩阵可能会正常工作。但是,请记住,C和C ++不处理“可变大小数组”(特别是在将它们从一个函数传递到另一个函数时),并且在C ++中,使用不同的方式可能更好。描述你的矩阵。例如:

std::vector<vector<float>> t; 

然后,您需要做更多工作来定义矢量的大小,例如:

t.resize(n);
for(i = 0; i < n; i++){
   t[i].resize(n);

答案 1 :(得分:0)

你可以做的是用std :: vector&lt;替换那些数组。矢量&lt;浮动&gt;&gt;,正如其他答案所述。我会使用typedef来使事情变得更简单。此外,一旦开始使用向量,可以通过其他方式利用它,例如更容易初始化。

#include <vector>
typedef std::vector<float> Float1D;
typedef std::vector<Float1D> Float2D;

void Transpose(int n, const Float2D& a, Float2D& T) 
{
    int i,j;
    for(i = 0; i < n; i++){
        for(j = 0; j < n; j++){
            T[i][j] = a[j][i];
    }
}

bool Symmetric(int n, Float2D& a) 
{
    Float2D t(n, Float1D(n,0));
    Transpose(n,a,t);
    // assuming that a and t are the same size matrix
    return t == a;
}

注意对称函数中t向量的初始化。不需要循环,因为所有操作都是使用行大小n来声明它,并使用1维浮点向量初始化每一行,并将1-d数组中的每个条目初始化为0。

还要注意最后的测试。我所做的就是使用operator ==比较向量是否具有相等的组件。

使用上面的代码,我假设你的矩阵大小相同。如果没有,你需要进行检查以确保这一点(我没有这样做)。