2016-04-06 2 views
1

В моей основной я называю эту функцию add так:Передача адреса массива

add(a,b,c,row,col); 

Его определение приводится ниже:

void add(int **a,int **b,int **c,int row,int col) 
{ 

    int i,j; 
    for(i=0;i<row;i++) 
    { 
     for(j=0;j<col;j++) 
     { 
      c[i][j]=a[i][j]*b[i][j]; 
     } 
    } 
} 

Основная функция: .......

int main() 
{ 
    int c[5][5],i,j; 
    int **f; 
    int a[5][5],b[5][5],row,col; 
    printf("Enter row : "); 
    scanf("%d",&row); 
    printf("Enter column : "); 
    scanf("%d",&col); 
    printf("Enter matrix A :\n"); 
    for(i=0;i<row;i++) 
    { 
     for(j=0;j<col;j++) 
     { 
      scanf("%d",&a[i][j]); 
     } 
    } 
    printf("Enter matrix B :\n"); 
    for(i=0;i<row;i++) 
    { 
     for(j=0;j<col;j++) 
     { 
      scanf("%d",&b[i][j]); 
     } 
    } 


    add(a,b,c,row,col); 

    printf("Addition :\n"); 

    for(i=0;i<row;i++) 
    { 
     for(j=0;j<col;j++) 
     { 
      printf("%d\t",c[i][j]); 
     } 
     printf("\n"); 
    } 
    getch(); 
    return 0; 
} 

ошибки, данные компиляторы:

 
||warning: command line option '-Wzero-as-null-pointer-constant' is valid for C++/ObjC++ but not for C [enabled by default]| 
C:\Users\Amir Khasru\Desktop\matrix_add.c|5|warning: no previous declaration for 'add' [-Wmissing-declarations]| 
C:\Users\Amir Khasru\Desktop\matrix_add.c||In function 'main':| 
C:\Users\Amir Khasru\Desktop\matrix_add.c|45|error: passing argument 1 of 'add' from incompatible pointer type| 
||=== Build failed: 1 error(s), 2 warning(s) (0 minute(s), 0 second(s)) ===| 
+0

нормально, так что вопрос? –

+0

В чем проблема с объявлением? –

+1

http://stackoverflow.com/questions/9446707/correct-way-of-passing-2-dimensional-array-into-a- function – Unimportant

ответ

1

Путаница заключается в том, что int x[5] не является указателем. Он может использоваться как указатель, но на самом деле это блок из 5 int с. И по этой логике int y[5][5] также не является двойной стрелкой. Это, однако, не может использоваться как двойной указатель. Просто потому, что нет фактического указателя, указывающего на каждую строку. Это всего лишь куча (25) целых чисел, из которых вы (и компилятор) знаете, насколько велики каждая строка. Чтобы вы знали, что элемент [0,4] является первой строкой [5,9] второй и т. Д. Это означает, что вы должны указать функцию, как записывать строки. Есть два способа сделать это. Одним из них является явно сделать добавь принимать блоки 5х5

void add(int a[5][5],int b[5][5],int c[5][5],int row,int col){ 
    ... 
} 

Другой, чтобы передать его в качестве одного указателя (например. int* a), и передать ширину в качестве еще одного аргумента.

1

В функции добавления, int** НЕ int[][] И очень разные типы данных, один массив массивов, а другой является указателем на указатель. Вы должны объявить его как int (*name)[size] или в качестве альтернативы (это случается, мой любимый способ), типаж его к указателю, а затем использовать простую арифметику указателей -

int add(int *a, int *b, int *c, int rows, int columns, int rowsize){ 
    for(int i = 0; i < rows; i++){ 
     for(int j = 0; j < columns; j++){ 
      *(c + rowsize*i + j) = (*(a + rowsize*i + j))*(*(b + rowsize*i + j)); 
     } 
    } 
    return 0; 
} 
+0

Это хороший способ, но лично я считаю, что обозначение 'c [rowsize * i + j]' более понятно, но оба хороши. –

+0

@Davidvanrijn Это личное предпочтение, так как мне легко представить это как стол или кубоид в моей голове, когда мы так писали. –

+0

Да, что с тобой работает :) Я просто хотел, чтобы оба способа записывались. (Я не критиковал) –

3

Когда прошло, a, b и c распадаются на int (*)[5] , а не int **.

Таким образом, вы должны переписать функцию:

void add(int a[][5], int b[][5], int c[][5], size_t row, size_t col) 
{ 
    size_t i, j; 
    for(i = 0; i < row; i++) 
    { 
     for(j = 0; j < col; j++) 
     { 
      c[i][j] = a[i][j] * b[i][j]; 
     } 
    } 
} 
Смежные вопросы