0

我应该如何从函数返回数组?我的代码是

float ClassArray::arr_sub(float a[100][100], float b[100][100]) {
    int i,j;
    for(i = 1; i < 10; i++) {
        for(j = 1; j < 10; j++){
            f[i][j]=b[i][j]-a[i][j];
        }
    }
    return f;
}

并且从此函数返回的 f 应分配给在其他类中声明的另一个数组 g 。

float g[100][100];
g= cm.arr_sub(T,W);

但是在构建课程时,它说incompatible type assignment of float to float[100][100]

4

4 回答 4

11

我对另一个关于数组的问题的回答解释了为什么你不想使用数组。

正如我在那个答案中所说,你不能像你尝试的那样分配一个数组:

float g[100];
g = foo(); // illegal, assigning to arrays is not allowed

数组的另一个奇怪的限制是你不能从函数中返回它们:

float foo()[100]; // illegal, returning an array from a function is not allowed

另请注意,当您声明一个函数时,float arr_sub(float a[100][100])您可能会认为您正在按值传递一个数组,但实际上这会调用另一个为数组生成的奇怪异常。在 C 和 C++ 中,每当您将函数的形式参数声明为数组时,类型就会从“数组”调整为“指向数组元素类型的指针”。


由于数组的行为不像应有的那样,因此您应该改用 std::array 或 std::vector:

std::array<float,100> foo(); // works

std::array<float,100> g;
g = foo(); // works

要执行多维数组,您可以使用:

std::array<std::array<float,100>,100> g;

虽然这有点麻烦,所以你可以 typedef 它:

typedef std::array<std::array<float,100>,100> Matrix;

Matrix ClassArray::arr_sub(Matrix a, Matrix b) {
    ...
}

Matrix g;
g = cm.arr_sub(T,W);

如果你有一个支持 C++11 的编译器,你甚至可以做一个模板类型别名:

template<typename T,int Rows,int Columns>
using Matrix2d = std::array<std::array<T,Columns>,Rows>;

Matrix2d<float,100,100> g;

性能说明

您可能不想按值返回 std::array 的原因之一。如果数组很大,那么将数据从返回值复制到您分配给它的变量中可能会产生显着的性能成本。如果这对您来说是个问题,那么 std::array 的解决方案与其他大型类型的解决方案相同;使用“out”参数而不是按值返回。

void arr_sub(Matrix a, Matrix b, Matrix &result);

Matrix g;
arr_sub(T,W,g);

这不适用于 std::vector 因为 std::vector 可以利用移动语义来避免复制其所有元素。

于 2012-04-22T01:01:57.493 回答
2

如果您坚持使用“普通 C”2D 数组,最好的办法是将指向结果的指针与两个输入参数一起传递,而不是像您那样按值传递数组。

但是,在 C++ 中最好的做法是使用vector<vector<float> >它,并通过引用传递它。

void ClassArray::arr_sub(
    const vector<vector<float> > &a
,   const vector<vector<float> > &b
,   vector<vector<float> > &res)
{
    for(int i=0 ; i != a.size() ; i++)
        for(int j=0 ; j != b.size() ; j++)
            res[i][j] = b[i][j] - a[i][j];
}

void main() {
    vector<vector<float> > a(100, vector<float>(100, 12.345));
    vector<vector<float> > b(100, vector<float>(100, 98.765));
    vector<vector<float> > res(100, vector<float>(100, 0));
    arr_sub(a, b, res);
}
于 2012-04-22T01:02:59.233 回答
0

如果您真的希望返回一个数组以及如何在 main() 中使用它,最有效的方法是将返回的数组声明为动态的。这样您将避免丢失指向这个新数组的指针,因为它将在堆中而不是在堆栈中分配。

于 2012-04-22T02:33:47.117 回答
0

最好的方法是将所有内容包装到一个类中。从事物的外观来看,它是一个矩阵。

可能已经有一百个 Matrix 类了,所以再写一个真的没有意义。

但是,如果这是一个学习练习,它可能是值得的。

要回答您提出的问题,请为您的函数添加第三个参数:float result[100][100]. 在您的函数内部,将结果写入结果数组。

这是因为在 C 和 C++ 中,数组总是通过引用而不是值传递。这是因为 C++ 只传递指向数组开头的指针。

于 2012-04-22T01:05:05.547 回答