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

これは、 VLA 宣言子で使用されるパラメーターを前方宣言するために使用される、C99 GNU 拡張機能 ( GCC ドキュメント)のめったに使用されない機能です。

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

int n2回現れるのがわかりますか?1 つ目は、最後にあるint n;actual の単なる前方宣言です。の宣言で が使用されているため、int n前に指定する必要があります。パラメータを再配置しても問題ない場合は、前に置くだけで、この機能は必要ありませんdouble a[][n]nana

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 に答える