2014-09-01 3 views
1

Я пытаюсь добавить две матрицы, используя следующий код:Returing массив

#include <stdio.h> 
    int matrix (void) 
    { 
     int a[2][2]; 
     int b[2][2]; 
     int c[2][2]; 
     int i, j; 
     for (i = 0; i < 2; ++i) { 
      for (j = 0; j < 2; ++j) { 
        scanf("%d", &a[i][j]); 
      } 
     } 
     for (i = 0; i < 2; ++i) { 
      for (j = 0; j < 2; ++j) { 
        scanf("%d", &b[i][j]); 
      } 
     } 
     for (i = 0; i < 2; ++i) { 
      for (j = 0; j < 2; ++j) { 
        c[i][j] = a[i][j] + b[i][j]; 
      } 
     } 
     return c; 
    } 
    int main() 
    { 
     int i, j; 
     int c[2][2]; 
     c = matrix(); 
     for (i = 0; i < 2; ++i) { 
      for (j = 0; j < 2; ++j) { 
        printf("%d", c[i][j]); 
      } 
      printf("\n"); 
     } 
     return 0; 
    } 

Приведенный выше код бросает много ошибок. Объясните, почему так много ошибок отображается моим компилятором.

EDIT- Я использовал GCC 4.4.3 при компиляции выше кода.

EDIT2 - У меня были следующие ошибки и предупреждения при компиляции кода выше.

test.c: In function ‘matrix’: 
test.c:23: warning: return makes integer from pointer without a cast 
test.c:23: warning: function returns address of local variable 
test.c: In function ‘main’: 
test.c:29: error: incompatible types when assigning to type ‘int[2][2]’ from type ‘int’ 
+2

И что бы эти ошибки? –

+0

Какой это компилятор? – XORcist

+1

Вы получаете много предупреждений заранее: http://ideone.com/FkqAER - в основном при обработке указателей как целых чисел. – birryree

ответ

2

Исправить, как вы хотите.

#include <stdio.h> 

int (*matrix(void))[2]{//return pointer as int (*)[2] 
    static int c[2][2];//Can not be used to return the automatic local variables. 
    int a[2][2]; 
    int b[2][2]; 
    int i, j; 
    for (i = 0; i < 2; ++i) { 
     for (j = 0; j < 2; ++j) { 
       scanf("%d", &a[i][j]); 
     } 
    } 
    for (i = 0; i < 2; ++i) { 
     for (j = 0; j < 2; ++j) { 
       scanf("%d", &b[i][j]); 
     } 
    } 
    for (i = 0; i < 2; ++i) { 
     for (j = 0; j < 2; ++j) { 
       c[i][j] = a[i][j] + b[i][j]; 
     } 
    } 
    return c; 
} 
int main(){ 
    int i, j; 
    int (*c)[2]; 
    c = matrix(); 
    for (i = 0; i < 2; ++i) { 
     for (j = 0; j < 2; ++j) { 
      printf("%d ", c[i][j]);//remove & 
     } 
     printf("\n"); 
    } 
    return 0; 
} 
+0

@RudyVelthuis У меня есть уважение к оригиналу. Такие предпочитают говорить OP. – BLUEPIXY

+0

Они, кажется, самодовольны. – BLUEPIXY

+0

Вздох. Повторяющееся самоуверенное утверждение повторяется. Пожалуйста, поймите, что нужно, когда и когда все по-другому. – BLUEPIXY

2

С одной стороны, у вас есть matrix возвращение локального массива int с, но заявили, что возвращение одного int значения.

0

Следующая не будет выводить значение:

printf("%d", &c[i][j]); 

Но некоторые указатель (если он компиляции). Вы должны:

printf("%d", c[i][j]); 
2

Попробуйте этот фиксированный код:

#include <stdio.h> 
void matrix (int c[][2]) //Fix 1 
{ 
    int a[2][2]; 
    int b[2][2]; 
    int i, j; 
    for (i = 0; i < 2; ++i) { 
     for (j = 0; j < 2; ++j) { 
       scanf("%d", &a[i][j]); 
     } 
    } 
    for (i = 0; i < 2; ++i) { 
     for (j = 0; j < 2; ++j) { 
       scanf("%d", &b[i][j]); 
     } 
    } 
    for (i = 0; i < 2; ++i) { 
     for (j = 0; j < 2; ++j) { 
       c[i][j] = a[i][j] + b[i][j]; 
     } 
    } 
} 
int main() 
{ 
    int i, j; 
    int c[2][2]; 
    matrix(c); //Fix 2 
    for (i = 0; i < 2; ++i) { 
     for (j = 0; j < 2; ++j) { 
       printf("%d\t", c[i][j]); //Fix 3 
     } 
     printf("\n"); 
    } 
    return 0; 
} 
+1

Это ИМО лучшее решение. Вызывающий отвечает за время жизни массива, а функция matrix() заполняет его только. Это правильное разделение проблем. +1 –

-1

вы как раз возвращение 2D-массив с помощью возврата C, который может быть использован только для возвращения, имеющего тип данных переменной, кроме 1D или 2D-массив. Чтобы это исправить, необходимо вернуть 2D-массив

т.е.
return [i][j] 

Кроме того, вы объявили с, как 2D-массив, но при возвращении вы используете его в качестве переменной.

int c[2][2]; 
c = matrix(); 

Чтобы исправить это, либо использовать

c[i][j]= matrix(); 

или объявить с как

int c; 
Смежные вопросы