2013-09-06 3 views
7

Я пытаюсь написать функцию, которая дает индекс строк и столбцов whoses элемента 0. Я попытался с помощью функцииПереходя матрицу в качестве параметра в функции

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

    } 
} 

Но во время компиляции дает ошибку "ошибка: тип массива имеет неполный тип элемента". Я также попытался объявить матрицу глобально и дать ей указатель. Но это не работает для меня. Помогите мне в этом, как мы можем передать матрицу функции в C.

+0

Пожалуйста, разместите код, который объявляет/заполняет матрицу. –

+0

Вам действительно нужно напечатать 'i' и' j', а не 'matrix [i] [j]'; вы уже знаете, что значение равно 0. –

ответ

5

Попробуйте

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

@ Джонатан Леффлер; Что делать, если я использую 'void make_zero (int col, int matrix [] [col])'? – haccks

+0

Это работает до тех пор, пока функция волшебным образом знает, сколько строк обрабатывать. Я исправил его, чтобы вы не использовали неинициализированную переменную ... Вы должны заметить, что это использует C99, VLAs, и вы можете рассмотреть 'for (int i = 0; i

+0

@JonathanLeffler; Я читал это: * Мы должны указать количество столбцов в многомерном массиве, нам не нужно указывать количество строк *. – haccks

6

Ваша проблема в том, что многомерные массивы в C должны иметь свою длину, за исключением самого внешнего значения.

Что вы можете сделать, это передать указатель на память держит матрицу, а затем привести его к правильному типу:

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

Предполагая, что если объявить int matrix[10][10];, как это

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

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

EDIT:

выше решение работает до тех пор, как фактический массив всегда передается имеет второе измерение 10 Вы можете использовать так, как предложено Леффлера @ Джонатан

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

Это работает до тех пор, пока фактический массив передается всегда имеет второе измерение 10. Это было то, что было необходимо на C89; C99 с поддержкой VLA (массив переменной длины) обеспечивает лучшую поддержку массивов. См. [Ответ] (http://stackoverflow.com/a/18661858/15168) с помощью [haccks] (http: // stackoverflow.com/users/2455888/haccks) для версии C99, но обратите внимание на измененный порядок аргументов (потому что вы не можете использовать то, что еще не объявлено). –

+0

@JonathanLeffler Спасибо за полезную информацию. Модифицированный Мой ответ. – Gangadhar

Смежные вопросы