2014-09-19 4 views
6

Ich versuche, eine Funktion zu schreiben, die Array beliebiger Dimension aufnehmen und Werte im Array erfolgreich drucken kann. Aber ich bin nicht in der Lage, vorwärts zu gehen, weil wir alle Dimensionen deklarieren müssen, mit Ausnahme der linken, wenn wir die Funktion deklarieren. Gibt es eine Möglichkeit, dass wir eine verallgemeinerte Funktion schreiben können, die Array als Eingabe für beliebige Dimensionen verwenden kann?Ist es möglich, eine Funktion zu schreiben, die ein Array von n Dimensionen annehmen kann?

Zum Beispiel sollte die Funktion in der Lage sein, 2-dimensionales Array oder 3-dimensionales Array oder n-dimensionales Array zu nehmen, wobei n eine beliebige Zahl ist.

+0

Es könnte mit [Variadic Vorlagen] (http://en.cppreference.com/w/cpp/language/parameter_pack) möglich sein. –

+0

Sie können möglicherweise eine Vorlage in irgendeiner Weise verwenden, aber das würde das Programm zu Fehler öffnen, vor allem weil es so klingt, als ob Sie mit einem Team arbeiten. – Cartier

+0

@JoachimPileborg Es hängt davon ab, ob die Generierung zufällig oder vordefiniert ist. Eine variadische Vorlage würde für vordefinierte nicht zufällig funktionieren. – Cartier

Antwort

11

Verwendung Rekursion für jede Dimension und Vorlage (so in C++), folgende zu vereinfachen:

template <typename T> 
void print(const T&e) 
{ 
    std::cout << e << " "; 
} 

template <typename T, std::size_t N> 
void print(const T (&a)[N]) 
{ 
    std::cout << "{"; 
    for (const auto& e : a) { 
     print(e); 
    } 
    std::cout << "}" << std::endl; 
} 

Verwendungsbeispiel:

int a[2][3][4]; 
print(a); 

Live example

+0

Dies gilt für Compiler, die C++ 11 unterstützen. –

+0

@RaydelMiranda: Der * für den Bereich * kann so geschrieben werden, dass er bei Bedarf C++ 03-kompatibel ist (ein einfacher 'print (a [i]);' erledigt den Job). – Jarod42

+0

Können Sie mir sagen, wie bitte? Ich wusste nichts davon. –

3

Wenn Sie Array als eindimensional codieren und dann den einzelnen Index selbst berechnen, können Sie sicher sein, dass ein Programm so funktioniert, als wäre das Array für eine variable Anzahl von Dimensionen erstellt worden.

Meine erste, aber wie das zu tun wäre, würde mit einem Vektor beginnen, der den Umfang jeder Dimension enthält, die Sie verwenden möchten.

Die Anzahl der Elemente in diesem Vektor wäre die Anzahl der Dimensionen, die Sie haben.

3

Array übergeben wird eine Funktion als Zeiger auf den Typ der Array-Elemente, unabhängig von der Dimensionalität des Arrays. Sie könnten weitere Argumente haben, um die Anzahl der Dimensionen, n, und ein Array (ein anderes) der Länge n anzugeben, das die Anzahl der Elemente in jeder Dimension angibt. Beachten Sie, dass die [] -Notation einfach eine saubere Methode zur Zeigeraddition darstellt.

0

Ich bin sicher, dass dies mindestens eine Regel des C-Standards verletzt, aber es sollte in der Praxis funktionieren. Beachten Sie, dass 0 als Sentinel-Wert für das Abschlusselement einer beliebigen Ebene des Arrays verwendet wird.

void print(void* p, int dim) 
{ 
    if (dim == 1) 
    { 
     int* a = (int*) p; 
     while (*a) 
     { 
      printf("%d ", *a++); 
     } 
     printf("\n"); 
    } 
    else 
    { 
     void** a = (void**)p; 
     while (*a) 
     { 
      print(*a++, dim - 1); 
     } 
    } 
} 

void test() 
{ 
    int x0 [] = { 11, 12, 13, 14, 15, 0 }; 
    int x1 [] = { 21, 22, 23, 0 }; 
    int x2 [] = { 0 }; 
    int x3 [] = { 41, 42, 0 }; 
    int x4 [] = { 51, 52, 53, 0 }; 
    int* y0 [] = { x0, x3, 0 }; 
    int* y1 [] = { 0 }; 
    int* y2 [] = { x1, x2, x4, 0 }; 
    int** z [] = { y0, y1, y2, 0 }; 

    print(z, 3); 
} 

Drucke:

11 12 13 14 15 
41 42 
21 22 23 

51 52 53 
+1

Bitte kommentieren Sie, wenn Sie nach unten gehen. – MooseBoys

+0

Sie können einige "const" hinzufügen. – Jarod42

3

Wenn Sie bestimmtes Element oder arbeiten auf dem Array zugreifen möchten, aber wenn Sie die Matrix dynamisch erstellen möchten, können Sie verwenden Zeiger für den Zugriff auf jedes Element durch die Verwendung vorbei Abmessungen in der Druckfunktion.

Da, wenn Sie ein mehrdimensionales Array als int [][] definiert haben, dann x = y[a][b] entspricht x = *((int *)y + a * NUMBER_OF_COLUMNS + b);

prüfen Diesen Beitrag für weitere Informationen: How to use pointer expressions to access elements of a two-dimensional array in C?

Also, wenn Sie ganze Matrix drucken möchten oder einen Zugriff insbesondere Element können Sie wie tun:

#include <iostream> 
using namespace std; 

//the function print_2D_matrix receives 4 arguments: pointer to first element 
//             dimension of array arr, i.e. n x m 
//             index of the element to be printed, i.e. a and b 
void print_2D_matrix(int *arr, int n, int m, int a, int b){ 
    for(int i = 0; i < n; i++){ 
     for(int j = 0; j < m; j++) 
      printf("%d ", *(arr + (i * m) + j)); 
     printf("\n"); 
    } 
    //go to the address just before a row, i.e. (a - 1) * NO_OF_COLUMNS 
    //then go to the address on b column, i.e. (a - 1) * NO_OF_COLUMNS + b 
    //since we started from the base address, i.e. first element(arr[0][0]), subtract 1 
    printf("arr[3][3] = %d\n", *(arr + ((a - 1) * m) + b - 1)); //print arr[a][b] 
} 

int main() { 
    int n, m; 
    cin>>n>>m; 
    int arr[n][m]; 

    for(int i = 0; i < n; i++) //initialize the matrix 
     for(int j = 0; j < m; j++) 
      arr[i][j] = i * j; 

    print_2D_matrix((int *) arr, n, m, 3, 3); 

    return 0; 
} 

Ausgang für obiges Programm (für nxm = 4 x 5):

0 0 0 0 0 
0 1 2 3 4 
0 2 4 6 8 
0 3 6 9 12 
arr[3][3] = 4 
Verwandte Themen