Frage von WarumGeld, 25

Wie übergibt man 2d-Arrays in c++ an eine Funktion?

Ich lerne gerade c++ und bin noch bei den simpelsten Grundlagen. Im Moment versuchen ich ein zweidimensionale Array an eine Funktion zu übergeben. Bei einem Eindimensionalen Array habe ich einen Weg gefunden, nämlich bei der Wertübergabe einfach den Namen des Arrays anzugeben (übergeben wird ja dann ein Zeiger mit dem die Funktion auf das Array zugreifen kann), und bei der Deklaration des Prototypen und der "richtigen" Initialisierung der Funktion einfach einen Array Namen mit einer leeren klammer anzugeben (soetwas wie "value []"). Zuerst dachte ich das man für den Fall dass das zu übergebene Array zweidimensional ist einfach nur eine zweite "Größe unbekannt"-Klammer hinzufügen müsste, statt nur eine zu verwenden, aber das geht nicht.

Problem-Quellcode: Übergabe: changevalue (value) Deklaration/Initialisierung der Funktion: (in value [][]). Wie löst man dieses Problem ?

Antwort
von ralphdieter, 14

Die Dimension darf nur in der letzten Klammer fehlen. Gib die inneren Dimensionen also explizit in der Deklaration an: int f(value[10][]).

In C99 kamen trickreichere Wege für variable Arrays hinzu, aber ich weiß nicht, wie weit Dein Compiler das unterstützt. Standardmäßig behilft man sich in diesem Fall mit:

A) Arrays von Zeigern verwenden. Hier muss man aber zuerst den Speicher für jede Zeile anfordern:

int *value[17]; 
for (int i=0; i<17; ++i) {
 value[i] = new int[20];
for (int j=0; j<20; ++j)
value[i][j] = i*j;

f(value, 20);

int f(int *value[], int const w) {
x_ij = value[i][j];
 ...
}

B) Nur die Adresse des ersten Elements übergeben und die 2D-Indizes selbst berechnen:

int value[20][17] = { ... };

f(&value[0][0], 20);

int f(int *value, int const w) {
 ...
int x_ij = value[i*w+j];
 ...
}

Die eingefleischten C++-Freaks stehen aber auf std::vector<>. Damit soll es angeblich keine Probleme mehr geben :-)

Kommentar von WarumGeld ,

Super Antwort ! An std::vector <> hab ich auch schon gedacht, aber ich glaube das ich erst mal die Grundlagen durchkaue bis ich anfange den ganzen schönen Kram aus der STL zu nutzen...

Keine passende Antwort gefunden?

Fragen Sie die Community