33
matrix_* matrix_insert_values(int n; double a[][n], int m, int n)
{
    matrix_* x = matrix_new(m, n);
    for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++)
            x->v[i][j] = a[i][j];
    return x;
}

我的测试矩阵示例

double in[][3] = {
    { 12, -51,   4},
    {  6, 167, -68},
    { -4,  24, -41},
    { -1, 1, 0},
    { 2, 0, 3},
};

我有点迷茫,我不知道int n;我的参数声明里面是什么,它适用于 C 但 C++ 不允许这种实现。我想了解这是如何工作的,因为我要将此代码迁移到 C++。

4

2 回答 2

40

这是C99 GNU 扩展(GCC 文档)中很少使用的功能,用于前向声明 VLA 声明器中使用的参数。

matrix_* matrix_insert_values(int n; double a[][n], int m, int n);

你看怎么int n出现两次?第一个int n;只是实际的前向声明int n,它在最后。它必须出现在前面,double a[][n]因为n在 的声明中使用a。如果你对重新排列参数没问题,你可以把它放在n前面a,然后你就不需要这个功能了

matrix_* matrix_insert_values_rearranged(int m, int n, double a[][n]);

关于 C++ 兼容性的注意事项

需要明确的是,GNU 扩展只是函数参数的前向声明。以下原型是标准 C:

// standard C, but invalid C++
matrix_* matrix_insert_values_2(int m, int n, double a[][n]);

您不能从 C++ 调用此函数,因为此代码使用C++ 不支持的可变长度数组。您必须重写该函数才能从 C++ 调用它。

于 2013-02-28T21:04:15.173 回答
2

如果这就是你总是从 C 调用它的方式(即在编译时固定 n 和 m),那么在 C++ 中你可以这样做:

template <int N, int M>
void matrix_insert_values(const double (&a)[M][N]);

int main() {
  double in[5][3] = {
    { 12, -51,   4},
    {  6, 167, -68},
    { -4,  24, -41},
    { -1, 1, 0},
    { 2, 0, 3},
  };

  matrix_insert_values(in);
};

它有 N 和 M 作为模板参数,这些是在编译时从传递给函数的输入自动推导出来的。

于 2013-02-28T21:19:07.493 回答