проблемы с языковым массивом - PullRequest
0 голосов
/ 02 мая 2011

Привет, я новичок в языке c. У меня возникла проблема: я хочу отправить 2-й массив в функцию через указатель.Функция должна возвращать указатель на 2-й массив.Для этого я написал следующий код:

#include<stdio.h>
int* put(int *b);
int main()
{
  int a[2][3],i,j;
  system("clear");  
  put(a);

  for(i=0;i<2;i++)
    { 
      for(j=0;j<3;j++)
        {    
          printf("\na[%d][%d]= %d",i,j,a[i][j]);
        }
    }

  return 0;
}

int* put(int *b)
{
  for(i=0;i<2;i++)
  {
    for(j=0;j<3;j++)
      {
        b[i][j]=i;
      }
  }
  return b;
}

, когда я компилирую его с помощью gcc2de.c, он показывает следующие ошибки:

2de.c: In function ‘main’:
2de.c:9: warning: passing argument 1 of ‘put’ from incompatible pointer type
2de.c:3: note: expected ‘int *’ but argument is of type ‘int (*)[3]’
2de.c: In function ‘put’:
2de.c:28: error: subscripted value is neither array nor pointer
2de.c: In function ‘main’:
2de.c:32: error: expected declaration or statement at end of input

Чем я просто изменяю код функции:

#include<stdio.h>

int* put(int **b);

int main()
{
  int a[2][3],i,j;
  system("clear");  
  put(a);

  for(i=0;i<2;i++)
    { 
      for(j=0;j<3;j++)
        {    
          printf("\na[%d][%d]= %d",i,j,a[i][j]);
        }
    }

  return 0;
}

int* put(int **b)
{
  for(i=0;i<2;i++)
    {
      for(j=0;j<3;j++)
        {
          b[i][j]=i;
        }
    }
  return b;
}

Когда я завершаю его, я получаю следующие ошибки:

2de.c: In function ‘main’:
2de.c:9: warning: passing argument 1 of ‘put’ from incompatible pointer type
2de.c:3: note: expected ‘int **’ but argument is of type ‘int (*)[3]’
2de.c: In function ‘put’:
2de.c:31: warning: return from incompatible pointer type
2de.c: In function ‘main’:
2de.c:32: error: expected declaration or statement at end of input
2de.c: In function ‘main’:
2de.c:9: warning: passing argument 1 of ‘put’ from incompatible pointer type
2de.c:3: note: expected ‘int **’ but argument is of type ‘int (*)[3]’
2de.c: In function ‘put’:
2de.c:31: warning: return from incompatible pointer type
2de.c: In function ‘main’:
2de.c:32: error: expected declaration or statement at end of input

что я делаю неправильно?Кто-нибудь может сказать мне, как способ передать 2d-массив через указатели на функцию?Может кто-нибудь сказать мне, как вернуть два D массив через указатель в функции

Ответы [ 5 ]

0 голосов
/ 02 мая 2011

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

2. Вам не нужно возвращать указатель в поставленной функции, данные в массиве были изменены

3.Вы должны были заметить тип, тип массива int [] [] - int **

0 голосов
/ 02 мая 2011

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

#include<stdio.h>

void put(int *b);

int main()
{
  int a[2][3],i,j;

    put(&a[0][0]);

  for(i=0;i<2;i++)
  { 
    for(j=0;j<3;j++)
    {    
      printf("\na[%d][%d]= %d", i, j, a[i][j]);
    }
  }

  printf("\n\n");

  system("PAUSE");  // Not recommended, but works for now
return 0;
}

void put(int *b)
{
  int count = 1;
  int i, j;

  for(i=0;i<2;i++)
  {
    for(j=0;j<3;j++)
    {
      //b[i][j]=i;
      *(b + ((i*3) + j)) = count++;
    }
  }

}

Два основных исправления:

  1. Вы проходите в началеадрес вашего двумерного массива в явном виде, указав его как & a [0] [0].
  2. Также обратите внимание на арифметику указателей, которую вам придется использовать, когда вы используете также int * b.

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

Надеюсь, это поможет.Ура!

0 голосов
/ 02 мая 2011

Первая ошибка, с которой вы столкнулись, это то, что вы пытаетесь определить функцию внутри другой функции.Самое простое, что можно сделать, это просто определить put, где вы его объявляете:

int put()
{
    /* definition of put */
}

int main()
{
    /* body calls put */
}

Вторая проблема заключается в том, что ни в одном фрагменте кода вы не передаете совместимый параметр put.

Если вы хотите передать a в функцию, то вы должны заметить, что массивы в качестве аргументов всегда распадаются на указатель на их первый элемент.

a имеет тип int [2][3], то есть массив2 массива по 3 int с.Это приведет к указателю на массив 3 int с или int (*)[3].Это должно объяснить ошибку компиляции, которую вы получаете.Вы должны объявить put как:

void put(int (*b)[3]);

или как полностью эквивалентный:

void put(int b[][3]);

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

Я изменил тип возвращаемого значения на void, поскольку вы не используете или не нуждаетесь в возвращаемом значении при передаче параметра по указателю.Вы должны удалить return b; из определения put.

Подсказка: Не думайте о int[2][3] как о двумерном массиве, но как о массиве массивов.

0 голосов
/ 02 мая 2011

Вы не можете вернуть 2d-массив из функции в C, вы можете только вернуть 1d-массив указателей на первые элементы 2d-массива.

Может быть, вы найдете это полезным:

Передать 2d массив в функцию в C?

или это:

C ++ Возвращение многомерного массива из функции

0 голосов
/ 02 мая 2011

где вы храните возвращаемое значение из put?

объявление должно быть int** put( int **) в соответствии с вашим кодом.

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