Ошибка возврата 2d массива из функции в c - PullRequest
0 голосов
/ 24 сентября 2018

Мне нужна помощь, пожалуйста;это пример кода:

#include <stdio.h>
const int n = 4;
const int m = 4;
void display(int arr[n][m]){

   for(int i=0; i<n; i++) {
      for(int j=0;j<m;j++) {
         printf("%d ", arr[i][j]);
      }
    printf("\n");
   }
}

int *constrast(int arr[n][m])
{
   int temp[n][m];
   int max =  25;
   int min =  10;
   int uBound =  255;
   int lBound =  0;
   for(int i=0; i<n; i++) {
      for(int j=0;j<m;j++) {
         temp[i][j] = ((arr[i][j] - max) *((int)(uBound-lBound)/(max-min))+uBound;
      }

   }

   return temp;
}

int main()
{
int disp[4][4] = {
    {10, 11, 12, 13},
    {14, 15, 16, 17},
    {18, 19, 20, 21},
    {22, 23, 24, 25}
};

printf("Image Before Stretching:\n");
display(disp);

printf("Image After Stretching:\n");
display(constrast(disp));
return 0;
}

Это сообщение об ошибке, которое я получаю после попытки компиляции:

contrast.c: In function ‘display’:
contrast.c:6:4: error: ‘for’ loop initial declarations are only allowed in C99 mode
    for(int i=0; i<n; i++) {
    ^
contrast.c:6:4: note: use option -std=c99 or -std=gnu99 to compile your code
contrast.c:7:7: error: ‘for’ loop initial declarations are only allowed in C99 mode
       for(int j=0;j<m;j++) {
       ^
contrast.c: In function ‘constrast’:
contrast.c:21:4: error: ‘for’ loop initial declarations are only allowed in C99 mode
    for(int i=0; i<n; i++) {
    ^
contrast.c:22:7: error: ‘for’ loop initial declarations are only allowed in C99 mode
       for(int j=0;j<m;j++) {
       ^
contrast.c:23:82: error: expected ‘)’ before ‘;’ token
          temp[i][j] = ((arr[i][j] - max) *((int)(uBound-lBound)/(max-min))+uBound;
                                                                                  ^
contrast.c:24:7: error: expected ‘;’ before ‘}’ token
       }
       ^
contrast.c:28:4: warning: return from incompatible pointer type [enabled by default]
    return temp;
    ^
contrast.c:28:4: warning: function returns address of local variable [-Wreturn-local-addr]
contrast.c: In function ‘main’:
contrast.c:44:1: warning: passing argument 1 of ‘display’ from incompatible pointer type [enabled by default]
 display(constrast(disp));
 ^
contrast.c:4:6: note: expected ‘int (*)[(sizetype)m]’ but argument is of type ‘int *’
 void display(int arr[n][m]){
      ^

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018
int *constrast(int arr[n][m])
{
   int temp[n][m];
   int max =  25;
   int min =  10;
   int uBound =  255;
   int lBound =  0;
   for(int i=0; i<n; i++) {
      for(int j=0;j<m;j++) {
         temp[i][j] = ((arr[i][j] - max) *((int)(uBound-lBound)/(max-min))+uBound;
      }

   }

   return temp;
}

Кроме типа temp, который равен int[4][4], не соответствует типу функции, равному int *, вы никогда не должны возвращать адрес локальной переменной, поскольку такие переменныеушел, когда функция заканчивается, и указатель на нее больше не будет действительным.

Вы не можете вернуть массив из функции в C. Обходным решением будет либо обернуть массив в struct, либораспределять память динамически.Еще лучше: передать выходной массив в качестве параметра.

0 голосов
/ 24 сентября 2018

Когда вы пытаетесь выполнить строку return temp;, она возвращает только указатель на массив, а затем выходит из функции.Но этот массив был размещен в системном стеке, когда ваш код перешел в функцию int *constrast(int arr[n][m]).По возвращении он удаляет эту переменную, и вы пытаетесь работать с неверным указателем.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...