11

Sto cercando di capire quale "buona pratica" (o qualsiasi altra pratica) è per passare un array multidimensionale a una funzione in c. Certamente questo dipende dall'applicazione, quindi consideriamo la possibilità di scrivere una funzione per stampare un array 2D di dimensioni variabili. In particolare, mi interessa sapere come scrivere la funzione printArry(__, int a, int b) nel seguente codice. Ho omesso il primo parametro perché non sono esattamente sicuro di ciò che dovrebbe essere.Passaggio di un array multidimensionale di dimensioni variabili

void printArry(_____, int a, int b){ 
/* what goes here? */ 
} 


int main(int argc, char** argv){ 

int a1=5; 
int b1=6; 
int a2=7; 
int a2=8; 

int arry1[a1][b1]; 
int arry2[a2][b2]; 

/* set values in arrays */ 

printArry(arry1, a1, b1); 
printArry(arry2, a2, b2); 

} 
+0

ho postato un follow-up a: http://stackoverflow.com/questions/34560001/passing -a-multidimensionale-array-of-variable-size-without-vla – ABD

risposta

14

Il modo più semplice è (per C99 e quest'ultimo)

void printArry(int a, int b, int arr[a][b]){ 
    /* what goes here? */ 
} 

Ma, ci sono altri modi per aggirare

void printArry(int a, int b, int arr[][b]){ 
    /* what goes here? */ 
} 

o

void printArry(int a, int b, int (*arr)[b]){ 
    /* what goes here? */ 
} 

e un po ' confusing che w lavoro malato solo come funzione protype

void printArry(int a, int b, int arr[*][*]); 
+1

Non ho mai saputo che 'int arr [a] [b] 'era un'opzione come parametro; quando è apparso nello standard? – abligh

+0

@abligh; Dal momento che C99. – haccks

+2

vivi e impari. Grazie. – abligh

1

Questo non è davvero una risposta, ma commento estesa per commentare domanda del PO, "ben si può passare la matrice senza conoscere il numero di righe con questo, ma allora come si sapere quando smettere di stampare le righe? "

Risposta: in genere, non è possibile, senza passare troppo alla dimensione dell'array. Guarda questo esempio 1-D, che spezza la dimensione dell'array.

#include <stdio.h> 

int procarr(int array[16], int index) 
{ 
    return array[index]; 
} 

int main (void) 
{ 
    int arr[16] = {0}; 
    printf("%d\n", procarr(arr, 100)); 
    return 0; 
} 

output del programma (anche se tutti gli elementi inizializzati a 0):

768 

Quello era comportamento non definito e non c'era avviso del compilatore. C non fornisce alcuna protezione di sovraccarico dell'array, ad eccezione degli inizializzatori della definizione di array (sebbene tali inizializzatori possano definire la lunghezza dell'array). Devi passare la dimensione della matrice troppo, come in

#include <stdio.h> 

int procarr(int array[16], size_t index, size_t size) 
{ 
    if (index < size) 
     return array[index]; 
    return -1;     // or other action/flag 
} 

int main (void) 
{ 
    int arr[16] = {0}; 
    printf("%d\n", procarr(arr, 100, sizeof arr/sizeof arr[0])); 
    return 0; 
} 

output del programma:

-1 
Problemi correlati