Il passaggio di array multidimensionali come argomenti della funzione in C

StackOverflow https://stackoverflow.com/questions/4051

  •  08-06-2019
  •  | 
  •  

Domanda

In C è possibile passare un array multidimensionale per una funzione in un unico argomento quando non so cosa le dimensioni della matrice sono andando essere ?

Inoltre il mio array multidimensionale può contenere gli altri tipi di corde.

È stato utile?

Soluzione

Si può fare questo con qualsiasi tipo di dati.Semplicemente fanno un puntatore a puntatore:

typedef struct {
  int myint;
  char* mystring;
} data;

data** array;

Ma non dimenticate che avete ancora a malloc variabile, e lo fa arrivare un po ' complessa:

//initialize
int x,y,w,h;
w = 10; //width of array
h = 20; //height of array

//malloc the 'y' dimension
array = malloc(sizeof(data*) * h);

//iterate over 'y' dimension
for(y=0;y<h;y++){
  //malloc the 'x' dimension
  array[y] = malloc(sizeof(data) * w);

  //iterate over the 'x' dimension
  for(x=0;x<w;x++){
    //malloc the string in the data structure
    array[y][x].mystring = malloc(50); //50 chars

    //initialize
    array[y][x].myint = 6;
    strcpy(array[y][x].mystring, "w00t");
  }
}

Il codice per deallocare la struttura è simile, non dimenticare di chiamare gratis() su tutto ciò che si malloced!(Anche in applicazioni affidabili, si dovrebbe controllare il ritorno di malloc().)

Ora diciamo che si desidera passare questo per una funzione.È comunque possibile utilizzare il puntatore doppio, perché probabilmente vuole fare delle manipolazioni dei dati di struttura, non il puntatore a puntatori di strutture di dati:

int whatsMyInt(data** arrayPtr, int x, int y){
  return arrayPtr[y][x].myint;
}

La chiamata a questa funzione con:

printf("My int is %d.\n", whatsMyInt(array, 2, 4));

Output:

My int is 6.

Altri suggerimenti

Passare un esplicito puntatore al primo elemento con le dimensioni di una matrice come parametri distinti.Per esempio, per gestire le dimensioni arbitrarie e 2-d array di int:

void func_2d(int *p, size_t M, size_t N)
{
  size_t i, j;
  ...
  p[i*N+j] = ...;
}

che sarebbe chiamato come

...
int arr1[10][20];
int arr2[5][80];
...
func_2d(&arr1[0][0], 10, 20);
func_2d(&arr2[0][0], 5, 80);

Stesso principio vale per la maggiore-matrici di dimensione:

func_3d(int *p, size_t X, size_t Y, size_t Z)
{
  size_t i, j, k;
  ...
  p[i*Y*Z+j*Z+k] = ...;
  ...
}
...
arr2[10][20][30];
...
func_3d(&arr[0][0][0], 10, 20, 30);

È possibile dichiarare una funzione come:

f(int size, int data[][size]) {...}

Il compilatore quindi fare tutti aritmetica dei puntatori per voi.

Si noti che le dimensioni di dimensioni devono apparire prima la matrice stessa.

GNU C permette argomento dichiarazione di spedizione (nel caso in cui si ha realmente bisogno di passare dimensioni dopo l'array):

f(int size; int data[][size], int size) {...}

La prima dimensione, anche se è possibile passare come argomento è troppo, è inutile per il compilatore C (anche per l'operatore sizeof, quando applicata su array passato come argomento tratterà sempre è come un puntatore al primo elemento).

int matmax(int **p, int dim) // p- matrix , dim- dimension of the matrix 
{
    return p[0][0];  
}

int main()
{
   int *u[5]; // will be a 5x5 matrix

   for(int i = 0; i < 5; i++)
       u[i] = new int[5];

   u[0][0] = 1; // initialize u[0][0] - not mandatory

   // put data in u[][]

   printf("%d", matmax(u, 0)); //call to function
   getche(); // just to see the result
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top