Die übergabe eines mehrdimensionalen variable Länge array an eine Funktion

Es gibt Unmengen von ähnlichen Fragen, aber noch konnte ich nicht finden, jede Antwort, die relevant für die Funktion von variabler Länge arrays in C99/C11.

Wie pass mehrdimensionale variable Länge array, um eine Funktion in C99/C11?

Beispiel:

void foo(int n, int arr[][]) //<-- error here, how to fix?
{
}

void bar(int n)
{
    int arr[n][n];
    foo(n, arr);
}

Compiler (g++-4.7 -std=gnu++11) sagt:
error: declaration of ‘arr’ as multidimensional array must have bounds for all dimensions except the first

Wenn ich es ändern zu int *arr[], der compiler beschwert sich trotzdem:
error: cannot convert ‘int (*)[(((sizetype)(((ssizetype)n) + -1)) + 1)]’ to ‘int**’ for argument ‘2’ to ‘void foo(int, int**)’

Nächste Frage, wie er als Wert übergeben werden und wie es passieren Referenz? Anscheinend, in der Regel wollen Sie nicht das gesamte array kopiert werden, wenn Sie übergeben es an eine Funktion.

Mit konstanter Länge von arrays es ist ganz einfach, da, wie die "konstant" bedeutet, Sie sollten wissen, die Länge, wenn Sie die Funktion deklarieren:

void foo2(int n, int arr[][10]) //<-- ok
{
}

void bar2()
{
    int arr[10][10];
    foo2(10, arr);
}

Ich weiß, arrays an Funktionen übergeben wie dies ist nicht best-practice, und ich don ' T wie es überhaupt. Es ist wohl besser, mit flat-Zeiger oder Objekte (wie std:vector) oder irgendwie sonst. Aber dennoch, ich bin ein bisschen gespannt, was ist die Antwort hier von einem theoretischen Standpunkt aus.

Konnte Sie nicht verwenden std::vector<std::vector<int>> und vermeiden Sie alle diese Probleme?
VLAs sind nicht in C++11.
Die Antwort aus theoretischer Sicht ist: "Du kannst das nicht". Bei der übergabe eines Arrays als parameter, bekommt man nur ein "free" - dimension. Die anderen müssen angegeben werden als Konstante Ausdrücke (d.h., die Werte bekannt zu entsc Zeit).
ein Vektor von Vektoren gibt Ihnen viel zu viel Freiheit zu definieren, Ihre dimension (arr[0] hätte Größe 3, arr[1] Größe 5, und so weiter). Ich denke, zu Steigern.MultiArray ist die richtige Wahl.
Ich bin damit einverstanden. Ich würde es einpacken in eine Art von matrix-Klasse.

InformationsquelleAutor alveko | 2013-01-27

Schreibe einen Kommentar