2013-09-06 4 views
7

Próbowałam napisać funkcję, która daje indeks wierszach i kolumnach whoses elementu wynosi 0. Próbowałem przy użyciu funkcjiPrzechodząc macierz jako parametr w funkcji

void make_zero(int matrix[][],int row,int col) 
{ 
    int row, col; 
    int i,j; 

    for(i=0;i<row;i++) 
    { 
     for(j=0;j<col;j++) 
     { 
      if(matrix[i][j]==0){ 
       printf("%d %d\n", i, j); 
     } 

    } 
} 

Ale w chwili sporządzania go daje błąd "error: typ tablicy ma niepełny typ elementu". Próbowałem również zadeklarować matrycę globalnie i dać jej wskaźnik. Ale to nie działa dla mnie. Pomóżcie mi z tym, jak przekazać macierz do funkcji w C.

+0

Proszę napisać kod, który deklaruje/wypełnia matrycę. –

+0

Musisz wydrukować 'i' i' j' zamiast 'matrix [i] [j]'; już wiesz, że wartość wynosi 0. –

Odpowiedz

5

Spróbuj

void make_zero(int row, int col, int matrix[row][col]) 
    { 
    int i,j; 
    for(i=0;i<row;i++) 
     for(j=0;j<col;j++) 
     { 
      if(matrix[i][j]==0) 
       printf("%d %d\n",i,j); 
     } 

    } 
+0

@ Jonathan Leffler; Co jeśli używam 'void make_zero (int col, int matrix [] [col])'? – haccks

+0

To działa tak długo, jak funkcja magicznie wie, ile wierszy do przetworzenia. Naprawiłem to, żebyś nie używał niezainicjowanej zmiennej ... Powinieneś zauważyć, że używa to C99, VLA i możesz rozważyć zapis 'for (int i = 0; i

+0

@ JonathanLeffler; Przeczytałem: * Musimy określić liczbę kolumn w tablicy wielowymiarowej, nie musimy podawać liczby rzędów *. – haccks

6

Waszym problemem jest to, że tablice wielowymiarowe w C muszą mieć znane długości, z wyjątkiem najbardziej zewnętrznej wartości.

Co można zrobić, to przekazać wskaźnik do pamięci posiadających matrycę a następnie wrzucił go do prawego typu:

void make_zero(void* _matrix,int row,int col) 
{ 
    int i,j; 
    int (*matrix)[col] = _matrix; 
    for(i=0;i<row;i++) 
     for(j=0;j<col;j++) 
     { 
      if(matrix[i][j]==0){ 
        printf("%d %d\n",i,j); 
     } 

    } 
} 
1

Zakładając, jeśli deklarują int matrix[10][10]; tak

make_zero(matrix,5,5); //function call 

void make_zero(int mat[][10],int row,int col) //definition 
{ 
//statements 
} 

EDIT:

powyższe rozwiązanie działa tak długo, jak rzeczywista tablica przeszedł zawsze ma drugi wymiar 10 można używać tak jak sugeruje @Jonathan Leffler

make_zero(5,5,matrix); //function call 
void make_zero(int row, int col, int matrix[row][col]) //definition 
    { 
    //statements 
    } 
+2

Działa tak długo, jak długo przekazywana tablica ma zawsze drugi wymiar 10. Było to konieczne w C89; C99 z obsługą VLA (array o zmiennej długości) zapewnia lepszą obsługę tablic. Zobacz [odpowiedź] (http://stackoverflow.com/a/18661858/15168) autorstwa [haccks] (http: // stackoverflow.com/users/2455888/haccks) dla wersji C99 - ale zanotuj poprawioną kolejność argumentów (ponieważ nie możesz użyć tego, czego jeszcze nie zadeklarowałeś). –

+0

@ JonathanLeffler Bardzo dziękuję za pomocne informacje. Zmodyfikowałem moją odpowiedź. – Gangadhar