Semikolon auf Funktionsparametern

Lesezeit: 3 Minuten

Benutzer-Avatar
Gerhard

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;
}

Beispiel meiner Testmatrix

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

Ich bin ein bisschen verloren, ich kann nicht herausfinden, was int n; in meiner Argumentdeklaration ist, funktioniert es über C, aber C++ erlaubt diese Implementierung nicht. Ich möchte verstehen, wie das funktioniert, weil ich diesen Code nach C++ migrieren werde.

  • Korrigieren Sie mich, wenn ich falsch liege, aber das ist kein gültiges C.

    Benutzer529758

    28. Februar 2013 um 21:04 Uhr

  • @DietrichEpp Wirklich? (Lesen Sie bitte: Standardzitat, oder es ist nicht passiert.)

    Benutzer529758

    28. Februar 2013 um 21:05 Uhr


  • Schön, noch nie gesehen. Wenn ich jemals die Gelegenheit bekomme, dies zu tun, werde ich wie ein Mastermind aussehen.

    Benutzer2088639

    28. Februar 2013 um 21:10 Uhr

  • @H2CO3: Sieht so aus, als hätte ich mich geirrt. Es ist eine GNU-Erweiterung. Ich hätte schwören können, dass ich es in der Spezifikation gesehen habe.

    – Dietrich Ep

    28. Februar 2013 um 21:12 Uhr


  • @DietrichEpp Kein Problem, du hast es behoben – +1 für deine Antwort.

    Benutzer529758

    28. Februar 2013 um 21:13 Uhr

Benutzer-Avatar
Dietrich Ep

Es ist ein selten verwendetes Funktion von C99 GNU-Erweiterung (GCC-Dokumentation), die zum Vorwärtsdeklarieren von Parametern verwendet wird, die in VLA-Deklaratoren verwendet werden.

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

Siehst du wie int n taucht zweimal auf? Der Erste int n; ist nur eine Vorwärtsdeklaration des Tatsächlichen int n, was am Ende steht. Es muss vorher erscheinen double a[][n] Weil n wird in der Deklaration von verwendet a. Wenn Sie mit der Neuanordnung von Parametern einverstanden wären, könnten Sie einfach setzen n Vor a und dann würdest du diese Funktion nicht brauchen

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

Hinweis zur C++-Kompatibilität

Um es klar zu sagen, die GNU-Erweiterung ist nur die Vorwärtserklärung von Funktionsparametern. Der folgende Prototyp ist Standard C:

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

Sie können diese Funktion nicht von C++ aus aufrufen, da dieser Code verwendet Arrays variabler Länge, die in C++ nicht unterstützt werden. Sie müssten die Funktion umschreiben, um sie von C++ aus aufrufen zu können.

  • Aber soweit ich das beurteilen kann double a[][n] funktioniert nicht in C++ oder zumindest kann ich es nicht auf LiveWorkSpace zum Laufen bringen, obwohl Clang sich beschwert, dass es sich um eine C99-Funktion handelt.

    – Shafik Yaghmour

    28. Februar 2013 um 21:10 Uhr

  • @ShafikYaghmour: Das liegt daran, dass es nicht Teil von C++ ist. C++ unterstützt keine VLAs. C tut.

    – Dietrich Ep

    28. Februar 2013 um 21:11 Uhr


  • @ShafikYaghmour: Theoretisch unterstützt C++ VLA überhaupt nicht.

    Benutzer405725

    28. Februar 2013 um 21:11 Uhr

  • Wirklich? Denn kompilieren void foo(int n; double a[][n], int m, int n) {} mit gcc4.2 (Optionen: -std=c99 -pedantic -Wall) Ich bekomme: warning: ISO C forbids forward parameter declarations (und mit Clang bekomme ich jede Menge Fehler). Warum sagt gcc, dass es von ISO C verboten ist?

    – Maisstängel

    28. Februar 2013 um 21:15 Uhr

  • @Cornstalks: VLAs sind Standard-C. Die Vorwärtsdeklaration von Parametern ist eine GNU-Erweiterung. Wenn Sie verwenden -pedantic oder -std=c99 (beide Optionen) deaktivieren Sie die meisten GNU-Erweiterungen.

    – Dietrich Ep

    28. Februar 2013 um 21:16 Uhr


Wenn Sie es immer so von C aufrufen (dh mit n und m zur Kompilierzeit festgelegt), können Sie in C ++ Folgendes tun:

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);
};

die N und M als Vorlagenparameter hat und diese zur Kompilierzeit automatisch aus der an die Funktion übergebenen Eingabe abgeleitet werden.

  • Es funktioniert nicht, wenn die Parameter zur Laufzeit angegeben werden, was normalerweise der Fall ist, wenn Sie zunächst ein VLA verwenden würden.

    – Dietrich Ep

    28. Februar 2013 um 21:21 Uhr

1382450cookie-checkSemikolon auf Funktionsparametern

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy