12 Stimmen

Übergabe eines Arrays mit unbekannter Größe an eine Funktion

Angenommen, ich habe eine Funktion namens MyFunction(int myArray[][]), die Array-Manipulationen durchführt.

Wenn ich die Parameterliste so schreibe, wird der Compiler beschweren, dass er die Größe des Arrays zur Kompilierzeit kennen muss. Gibt es eine Möglichkeit, die Parameterliste umzuschreiben, sodass ich ein Array beliebiger Größe an die Funktion übergeben kann?

Die Größe meines Arrays wird durch zwei static const ints in einer Klasse definiert, aber der Compiler akzeptiert etwas wie MyFunction(int myArray[Board::ROWS][Board::COLS]) nicht.

Was ist, wenn ich das Array in einen Vektor konvertieren könnte und dann den Vektor an MyFunction übergebe? Gibt es eine Einzeilige Konvertierung, die ich verwenden kann, oder muss ich die Konvertierung manuell durchführen?

0voto

MSN Punkte 51308

Im C++0x kannst du std::initializer_list<...> verwenden, um dies zu erreichen:

MyFunction(std::initializer_list> myArray);

und verwende es (nehme ich an) so (mit der range-basierten for-Syntax):

for (const std::initializer_list &subArray: myArray)
{
    for (int value: subArray)
    {
        // Spaß mit Wert!
    }
}

0voto

Stephen P Punkte 13778

Geben Sie kein Array weiter, das ein Implementierungsdetail ist. Geben Sie das Board weiter

MeineFunktion(Board dasBoard)
{
    ...
}

0voto

ajduff574 Punkte 2091

Ich kenne mich nicht mit C++ aus, aber der C99-Standard hat variable Längenarrays eingeführt.

Dies würde also in einem Compiler funktionieren, der C99 unterstützt:

void func(int rows, int cols, double[rows][cols] matrix) {
    for (int r = 0; r < rows; r++) {
        for (int c = 0; c < cols; c++) {
            printf("%f", matrix[r][c]);
        }
    }
}

Beachten Sie, dass die Größenargumente vor dem Array stehen. Eigentlich muss nur die Anzahl der Spalten zur Kompilierzeit bekannt sein, also wäre dies auch gültig:

void func(int rows, int cols, double[][cols] matrix)

Für drei oder mehr Dimensionen müssen alle Dimensionen außer der ersten bekannt sein. Die von ArunSaha verlinkte Antwort erläutert, warum.

Ehrlich gesagt weiß ich nicht, ob C++ variable Längenarrays unterstützt, also könnte dies funktionieren oder auch nicht. In jedem Fall können Sie auch erwägen, Ihr Array in eine Art Matrixklasse zu kapseln.

BEARBEITEN: Nach Ihrer Bearbeitung sieht es so aus, als ob C++ diese Funktion nicht unterstützt. Eine Matrixklasse ist wahrscheinlich der richtige Weg. (Oder std::vector, wenn es Ihnen nichts ausmacht, dass der Speicher möglicherweise nicht zusammenhängend allokiert ist.)

0voto

Dror Helper Punkte 29647

Ja - einfach als Zeiger übergeben:

MyFunction(int** someArray)

Der Nachteil ist, dass Sie wahrscheinlich auch die Längen des Arrays übergeben müssen

0voto

Adam Trhon Punkte 2835

Verwenden Sie MyFunction(int *myArray[])
Wenn Sie MyFunction(int **myArray) verwenden und int someArray[X][Y] übergeben, wird das Programm abstürzen.
EDIT: Verwenden Sie nicht die erste Zeile, sie wird in den Kommentaren erklärt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X