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