11

Ich versuche zu verstehen, was "Best Practice" (oder wirklich jede Praxis) für die Übergabe eines mehrdimensionalen Arrays an eine Funktion in c ist. Natürlich hängt das von der Anwendung ab, also überlegen wir uns, eine Funktion zu schreiben, um ein 2D-Array variabler Größe zu drucken. Insbesondere interessiert mich, wie man im folgenden Code die Funktion printArry(__, int a, int b) schreiben würde. Ich habe den ersten Parameter weggelassen, da ich nicht genau weiß, was das sein soll.Ein multidimensionales Array variabler Größe übergeben

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

ich ein Follow-up gepostet haben: http://stackoverflow.com/questions/34560001/passing -a-multidimensional-array-of-variable-size-ohne-vla – ABD

Antwort

14

Der einfachste Weg ist (für C99 und letztere)

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

Aber es gibt auch andere Möglichkeiten, um

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

oder

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

und ein wenig confusing welche w ill Arbeit nur als Funktion protype

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

Ich wusste nie 'int arr [a] [b]' war eine Option als Parameter; Wann ist das im Standard erschienen? – abligh

+0

@abligh; Seit C99. – haccks

+2

Sie leben und lernen. Vielen Dank. – abligh

1

Das ist nicht wirklich eine Antwort, aber erweiterten Kommentar an den Kommentar Frage des OP „gut Sie das Array ohne zu wissen, die Anzahl der Zeilen mit diesem passieren kann, dann aber wie werden Sie weißt du, wann du aufhören sollst, Zeilen zu drucken? "

Antwort: Im Allgemeinen können Sie nicht, ohne auch die Array-Größe zu übergeben. Sehen Sie sich dieses 1-D-Beispiel an, das die Array-Größe unterbricht.

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

Programmausgabe (obwohl alle Elemente zu 0 initialisiert):

768 

Das undefinierten Verhalten Warnung und es gab keinen Compiler war. C bietet keinen Array-Überlaufschutz, außer für Initialisierer von Arraydefinitionen (obwohl solche Initialisierer die Arraylänge definieren können). Sie haben die Größe des Arrays zu übergeben, wie 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; 
} 

Programmausgabe:

-1