2013-05-23 12 views
26

Uczę się C i mam problem z przekazaniem wskaźnika tablicy 2D do innej funkcji, która następnie wypisuje tablicę 2D. Każda pomoc będzie doceniona.Jak przekazać tablicę 2D za pomocą wskaźnika w C?

int main(void){ 
    char array[50][50]; 
    int SIZE; 

    ...call function to fill array... this part works. 

    printarray(array, SIZE); 
} 

void printarray(char **array, int SIZE){ 
    int i; 
    int j; 

    for(j = 0; j < SIZE; j++){ 
     for(i = 0; i < SIZE; i ++){ 
      printf("%c ", array[j][i]); 
     } 
     printf("\n"); 
    } 
} 
+1

void printarray (tablica char [] [50], int SIZE) – Lucas

+1

Choć możliwe jest, aby to zrobić, jesteś lepiej przekształcenie go do tablicy 1D i korzystania 'j * SIZE + i', aby go zaindeksować. – Dave

+0

@Dlaczego? ............................... (just filler) – kotlomoy

Odpowiedz

22

char ** nie reprezentuje tablicę 2D - byłoby tablicę wskaźniki do wskaźników. Trzeba zmienić definicję printarray jeśli chcesz przekazać mu 2D tablicy:

void printarray(char (*array)[50], int SIZE) 

lub równoważnie:

void printarray(char array[][50], int SIZE) 
+0

czy możesz wyjaśnić, co składnia "char * array [50]" oznacza po angielsku? – user1362058

+3

@ user1362058: tablica 50 wskaźników do char. www.cdecl.org –

+2

Uruchamianie 'cdecl explain 'char (* arr) [50]'' daje 'zadeklaruj arr jako wskaźnik do tablicy 50 znaku'. –

4

W main(), zmienna "array" została zadeklarowana jako

char array[50][50]; 

To jest 2500 bajt danych. Kiedy przekazywana jest tablica główna(), jest to wskaźnik do początku tych danych. Jest to wskaźnik do char oczekiwanego być zorganizowane w rzędach 50.

Jeszcze w funkcji printarray(), to oświadczam

char **array 

„tablicę” tu jest wskaźnik do char * „wskaźnik” .

@Lucus sugestia "void (tablica char [] [50], int rozmiar) printarray" działa, chyba że nie jest nazwą, że parametr SIZE musi być 50.

Idea: obejścia (yeech) rodzaj tablicy parametrów w printarray()

void printarray(void *array, int SIZE){ 
    int i; 
    int j; 
    char *charArray = (char *) array; 

    for(j = 0; j < SIZE; j++){ 
     for(i = 0; i < SIZE; i ++){ 
      printf("%c ", charArray[j*SIZE + i]); 
     } 
     printf("\n"); 
    } 
} 

bardziej eleganckie rozwiązanie, aby „wachlarz” w głównej() tablicy wskaźników.

// Your original printarray() 
void printarray(char **array, int SIZE){ 
    int i; 
    int j; 
    for(j = 0; j < SIZE; j++){ 
     for(i = 0; i < SIZE; i ++){ 
      printf("%c ", array[j][i]); 
     } 
     printf("\n"); 
    } 
} 

// main() 
char **array; 
int SIZE; 
// Initialization of SIZE is not shown, but let's assume SIZE = 50; 
// Allocate table 
array = (char **) malloc(SIZE * sizeof(char*)); 
    // Note: alternative syntax 
    // array = (char **) malloc(SIZE * sizeof(*array)); 
// Allocate rows 
for (int row = 0; row<SIZE; row++) { 
    // Note: sizeof(char) is 1. (@Carl Norum) 
    // Shown here to help show difference between this malloc() and the above one. 
    array[row] = (char *) malloc(SIZE * sizeof(char)); 
    // Note: alternative syntax 
    // array[row] = (char *) malloc(SIZE * sizeof(**array)); 
    } 
// Initialize each element. 
for (int row = 0; row<SIZE; row++) { 
    for (int col = 0; col<SIZE; col++) { 
    array[row][col] = 'a'; // or whatever value you want 
    } 
} 
// Print it 
printarray(array, SIZE); 
... 
+0

'sizeof (char)' to '1'. –

+3

@CarlNorum Tylko dlatego, że to nie oznacza, że ​​musisz bezwzględnie zastąpić go 1 (lub całkowicie go usunąć). Wyrażenia 'sizeof' mogą znacznie przyczynić się do samodokumentowania kodu. – Thomas

+0

@Thomas - merci. – chux

0

Od C99 obsługuje dynamiczne wielkości tablic dodaje styl jest po prostu wygodniej zdać 2-dim tablicy:

void printarray(void *array0, int SIZE){ 
    char (*array)[SIZE] = array0; 
    int i; 
    int j; 
    for(j = 0; j < SIZE; j++){ 
     for(i = 0; i < SIZE; i ++){ 
      printf("%c ", array[j][i]); 
     } 
     printf("\n"); 
    } 
} 
0

Można łatwo zdać 2d tablicy przy użyciu podwójnego wskaźnika.

void printarray(char **array, int n) 
    { 
    int i, j; 
    for(i=0; i<n; i++) 
    { 
     for(j=0; j<n; j++) 
     { 
      printf("%c ", array[i][j]); 
     } 
     printf("\n"); 
    } 
    } 

    int main() 
    { 
     int n = 2; 
     int i, j; 

     char **array = (char **) malloc(n * sizeof(char*)); 

     for (i=0; i<n; i++) 
     { 
     array[i] = (char *) malloc(n* sizeof(char)); 
     } 

    for (i=0; i<n; i++) 
    { 
     for (j=0; j<n; j++) 
     { 
      scanf("%c ", &array[i][j]); 
     } 
    } 

    printarray(array, n); 

    return 0; 
    } 

Pełny Kod: Ideone

Powiązane problemy