2014-09-19 6 views
6

Sto provando a scrivere una funzione che può prendere array di qualsiasi dimensione e stampare correttamente i valori nell'array. Ma non sono in grado di andare avanti perché dobbiamo dichiarare tutte le dimensioni tranne la maggior parte sinistra quando si dichiara la funzione. C'è qualche possibilità che possiamo scrivere una funzione generalizzata che può prendere array come input per qualsiasi dimensione?È possibile scrivere una funzione che può prendere array di n dimensioni?

ad esempio, la funzione dovrebbe essere in grado di acquisire array bidimensionale o array dimensionale o n array dimensionale in cui n è un numero qualsiasi.

+0

Potrebbe essere possibile con [modelli variadic] (http://en.cppreference.com/w/cpp/language/parameter_pack). –

+0

Potrebbe essere possibile utilizzare un modello in qualche modo, ma ciò aprirebbe il programma all'errore, soprattutto perché sembra che si stia lavorando con un team. – Cartier

+0

@JoachimPileborg Dipende se la generazione è casuale o predefinita; un modello variad potrebbe funzionare per predefiniti non casuali. – Cartier

risposta

11

Uso ricorsione per ogni dimensione e sagoma (così in C++), segue può aiutare: Utilizzo

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

Esempio:

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

Live example

+0

Questo vale per i compilatori che supportano C++ 11. –

+0

@RaydelMiranda: Il * per intervallo * può essere scritto per essere compatibile con C++ 03 se necessario (un semplice 'print (a [i]);' esegue il lavoro). – Jarod42

+0

Potresti dirmi come per favore? Non lo sapevo. –

3

Se si codifica l'array come unidimensionale e quindi si calcola autonomamente l'indice singolo, è possibile che un programma funzioni come se la matrice fosse stata creata per un numero variabile di dimensioni.

Il mio iniziale su come fare sarebbe iniziare con un vettore contenente l'estensione di ogni dimensione che si intende utilizzare.

Il numero di elementi in quel vettore sarebbe il numero di dimensioni che hai.

3

Un array viene passato una funzione come puntatore al tipo di elementi dell'array, indipendentemente dalla dimensionalità dell'array. Potresti avere ulteriori argomenti per specificare il numero di dimensioni, n e un array (un altro) di lunghezza n che specifica il numero di elementi in ogni dimensione. Nota che la notazione [] è semplicemente un modo ordinato per eseguire l'aggiunta del puntatore.

0

Sono sicuro che questo violi almeno una regola dello standard C ma dovrebbe funzionare nella pratica. Si noti che utilizza 0 come valore sentinella per l'elemento di terminazione di qualsiasi livello dell'array.

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

Stampe:

11 12 13 14 15 
41 42 
21 22 23 

51 52 53 
+1

Si prega di commentare quando downvoting. – MooseBoys

+0

Puoi aggiungere alcuni 'const'. – Jarod42

3

Se si desidera accedere particolare elemento o operare sulla matrice, ma se si desidera creare la matrice in modo dinamico, è possibile utilizzare l'uso puntatori per accedere a ciascun elemento passando il dimensioni nella funzione di stampa.

Dal momento che se si dispone di un array multidimensionale definito come int [][], quindi x = y[a][b] è equivalente a x = *((int *)y + a * NUMBER_OF_COLUMNS + b);

controllare questo post per maggiori dettagli: How to use pointer expressions to access elements of a two-dimensional array in C?

Quindi, se si desidera stampare tutta la matrice o accedere a qualsiasi elemento particolare, si può fare come:

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

uscita per il programma di cui sopra (per 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 
Problemi correlati