2016-02-11 2 views
-2
void sort(int [],int); 

Это, как я обычно использую один одномерный массив (то есть: int []) внутри оператора объявления функции для таких программ, как сортировка и она отлично работает без каких-либо проблемКак использовать двумерный массив в заявлении объявления функции?

Но для моей матрицы программы сложения, когда я использую двухмерный массив (то есть: int [][]) внутри оператора объявления функции с аналогичным форматом void mat(int [][],int [][],int ,int); Iam получает некоторые сообщения об ошибках типа: -

1. Многомерный массив должен иметь границы для всех измерений, кроме первого.

2.неверное преобразование из 'int (*) [10]' в 'int' [-fpermissive].

Так что мой вопрос заключается в том, как написать двумерный массив внутри оператора объявления функции.

Ниже я прилагаю мою полную матрицу программу сложения, используя функции: -

#include<stdio.h> 
void mat(int [][],int [][],int ,int); 
int main() 
{ 
    int a[10][10],b[10][10],m,n,i,j; 
    printf("Enter the rows and coloumns: "); 
    scanf("%d %d",&m,&n); 
    printf("\nEnter the elements of 1st Matrix:"); 
    for(i=0;i<m;i++) 
     for(j=0;j<n;j++) 
     scanf("%d",&a[i][j]); 
    printf("\nEnter the elements of the 2nd Matrix:"); 
    for(i=0;i<m;i++) 
     for(j=0;j<n;j++) 
      scanf("%d",&b[i][j]); 
    mat(a,b,m,n); 
} 
void mat(int a[10][10],int b[10][10],int m,int n) 
{ 
    int i,j,c[10][10]; 
    for(i=0;i<m;i++) 
     for(j=0;j<n;j++) 
     c[i][j]=a[i][j]+b[i][j]; 
     printf("\nThe addition of the 2 Matrix is :"); 
     for(i=0;i<m;i++) 
     { 
      printf("\n"); 
      for(j=0;j<n;j++) 
      printf("%d",c[i][j]); 
     } 
} 
+0

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

+0

Никакие прототипы функций не будут иметь только типы данных, тогда как определение функции будет иметь и тип данных с именем переменной – Sparkzz

+0

. В C. нет двухмерных (или любых более высоких) размерных массивов. Вместо этого вы можете иметь массивы массивов, которые не то же самое. – SergeyA

ответ

1

Прототип

void mat(int [][],int [][],int ,int); 

должен быть

void mat(int [][10],int [][10],int ,int); 

Вы должны указать более высокие размеры. Другой путь вокруг, выше прототип эквивалентно

void mat(int (*)[10],int (*)[10],int ,int); 

int (*)[10] представляет собой тип (указатель на массив из 10 int) и без размера 10 это неполного типа.

+0

Вы также можете указать границы для всех измерений, поэтому void mat (int [10] [10], int [10] [10], int, int); также является правильным. – Stuart

+0

@Stuart; Да. Но вы можете пропустить размер для первого измерения. – haccks

+0

да, я знаю, поэтому я сказал: «ТАКЖЕ правильно». – Stuart

0

В C, когда вы объявляете массив, все размеры массива, за исключением, возможно, последний должен быть указан. Другими словами, вы можете написать функцию, как это:

void iTakeAnArray(int[]); 

или это:

void iTakeAnotherArray(int[][5]); 

, но вы не можете писать

void oopsNotAllowed(int[][]); 

Причина этого связана с как компилятор C обычно представляет массивы. Чтобы выполнить поиск в двумерном массиве, компилятор должен знать, сколько элементов расположено вдоль одного измерения массива, чтобы он знал предельное смещение памяти для определения местоположения при выполнении доступа к массиву.

Существует не чистый способ обойти эту проблему, кроме как

  1. есть функция взять в 2D массив, где зафиксировать размер заранее, или
  2. моделировать 2D массив с 1D.

Для этого второго варианта вы можете представить массив размеров m x n с одним 1D массивом размером m x n. Поиск элемента arr[i][j]. вы смотрите на позицию i * n + j в массиве. Это немного хаки, но это работает!

0

Уважаемый, вы не можете инициализировать двумерный массив таким образом, что [] [] в C. Как он узнает, сколько столбцов есть.

  • Вместо этого вы можете сделать [] [10].
  • Но мое личное предпочтение - использовать указатели типа (* a) [10]. Поскольку это делает вещи легкими для визуализации.
Смежные вопросы