2010-10-12 17 views

Odpowiedz

59

C tak naprawdę nie ma tablic wielowymiarowych, ale istnieje kilka sposobów, aby je symulują. Sposób przekazywania takich tablic do funkcji zależy od sposobu symulowania wielu wymiarów:

1) Użyj tablicy tablic. To może być stosowany tylko wtedy, gdy granice tablicy są w pełni ustalona w czasie kompilacji, czy kompilator obsługuje VLA's:

#define ROWS 4 
#define COLS 5 

void func(int array[ROWS][COLS]) 
{ 
    int i, j; 

    for (i=0; i<ROWS; i++) 
    { 
    for (j=0; j<COLS; j++) 
    { 
     array[i][j] = i*j; 
    } 
    } 
} 

void func_vla(int rows, int cols, int array[rows][cols]) 
{ 
    int i, j; 

    for (i=0; i<rows; i++) 
    { 
    for (j=0; j<cols; j++) 
    { 
     array[i][j] = i*j; 
    } 
    } 
} 

int main() 
{ 
    int x[ROWS][COLS]; 

    func(x); 
    func_vla(x, rows, cols); 
} 

2) Użyj (dynamicznie przydzieloną) tablicę wskaźników do (dynamicznie alokowanych) tablic. Jest używany głównie wtedy, gdy granice tablicy są nieznane do czasu wykonania.

void func(int** array, int rows, int cols) 
{ 
    int i, j; 

    for (i=0; i<rows; i++) 
    { 
    for (j=0; j<cols; j++) 
    { 
     array[i][j] = i*j; 
    } 
    } 
} 

int main() 
{ 
    int rows, cols, i; 
    int **x; 

    /* obtain values for rows & cols */ 

    /* allocate the array */ 
    x = malloc(rows * sizeof *x); 
    for (i=0; i<rows; i++) 
    { 
    x[i] = malloc(cols * sizeof *x[i]); 
    } 

    /* use the array */ 
    func(x, rows, cols); 

    /* deallocate the array */ 
    for (i=0; i<rows; i++) 
    { 
    free(x[i]); 
    } 
    free(x); 
} 

3) Użyj jednowymiarowej tablicy i popraw indeksy. Może być stosowany zarówno statycznie przydzielonego (o stałym rozmiarze) i dynamicznie przydzielane tablice:

void func(int* array, int rows, int cols) 
{ 
    int i, j; 

    for (i=0; i<rows; i++) 
    { 
    for (j=0; j<cols; j++) 
    { 
     array[i*cols+j]=i*j; 
    } 
    } 
} 

int main() 
{ 
    int rows, cols; 
    int *x; 

    /* obtain values for rows & cols */ 

    /* allocate the array */ 
    x = malloc(rows * cols * sizeof *x); 

    /* use the array */ 
    func(x, rows, cols); 

    /* deallocate the array */ 
    free(x); 
} 
+0

W powyższy sposób kod nie zostanie skompilowany. "rzędy" i "cols" w wierszach 17 i 35 muszą zmienić się odpowiednio na "ROWS" i "COLS". – KZcoding

+4

'void func_vla (int array [rows] [cols], int rows, int cols)' powinno być 'void func_vla (int rows, int cols, int array [rows] [cols])' –

5

Nie wiem co masz na myśli przez "dane dont get lost". Oto w jaki sposób można przejść normalny 2D tablicę do funkcji:

void myfunc(int arr[M][N]) { // M is optional, but N is required 
    .. 
} 

int main() { 
    int somearr[M][N]; 
    ... 
    myfunc(somearr); 
    ... 
} 
+10

Losowe factoid: Powodem N jest wymagane jest, ponieważ komputer musi wiedzieć, jak daleko, aby zwiększyć wskaźnik dla każdego „rzędu”. Naprawdę, wszystkie wymiary oprócz pierwszego są konieczne. C przechowuje tablice jako fragmenty pamięci, bez ograniczników. –

+0

Dane nie gubią się bez użycia malloc. Dzięki za pomoc. – Shweta

+0

@ Christian Mann: To dobry faktor. Zdarzyło mi się napisać na ten temat skomplikowane wyjaśnienie :-) http://stackoverflow.com/questions/3906777/error-defining-and-initializing-multidimensional-array/3910533#3910533 – Arun

-2

Jeśli kompilator nie obsługuje Włas, można to zrobić w prosty sposób poprzez przepuszczenie 2d tablicę int * z rzędu i col. W funkcji odbiorczej zregeneruj indeks tablicy 1d z indeksów tablic 2d.

int 
getid(int row, int x, int y) { 
      return (row*x+y); 
} 
void 
printMatrix(int*arr, int row, int col) { 
    for(int x = 0; x < row ; x++) { 
      printf("\n"); 
      for (int y = 0; y <col ; y++) { 
       printf("%d ",arr[getid(row, x,y)]); 
      } 
    }      
} 

main() 
{ 

    int arr[2][2] = {11,12,21,22}; 
    int row = 2, col = 2; 

    printMatrix((int*)arr, row, col); 

} 
-2
 #include <iostream> 
    using namespace std; 

    void printarray(int *a, int c,int r) 
    { 
     for (int i = 0; i < r; i++) 
     { 
      for (int j = 0; j < c; j++) 
      { 
       cout << "\t" << *(a + i*c + j) << "\t"; // a is a pointer refer to a 2D array 
      } 
     cout << endl << "\n\n"; 
     } 
    } 

    int main() 
    { 
     int array[4][4] = 
     {{1 ,2 ,3 ,4 }, 
      {12,13,14,5 }, 
      {11,16,15,6 }, 
      {10,9 ,8 ,7 }}; 

      printarray((int*)array,4,4); 
      // here I use print function but u can use any other useful function like 
      //setArray((int *) array,4,4); 

     return 0; 
    } 
+2

To jest oznaczony C, nie C++. – Lundin

Powiązane problemy