Почему я получаю «несовместимый тип указателя» при попытке передать значения массива? - PullRequest
0 голосов
/ 06 февраля 2020

Я получаю сообщение об ошибке / предупреждение при попытке получить минимальные / максимальные значения из точек в основной функции. Как я могу рассчитать максимальные / минимальные баллы? Есть ли более простой способ? Я должен использовать структуру?

test.c:73:14: warning: incompatible pointer types passing 'int [100][100]' to
      parameter of type 'int *' [-Wincompatible-pointer-types]
      convexHull(points, n);

        test.c:33:21: note: passing argument to parameter 'point' here
        void convexHull(int point[], int n)
                    ^
        1 warning generated.**
void convexHull(int point[], int n)
{
  int i;
  //n is the size
  int min_x=0;
  int max_x=0;

  if (n <3)
  {
    printf("Convex hull can't have less than 3 points\n.");
  }

  //Finding point with min/max x-coordinate.
  for (i=1;i<n;i++)
  {
    if (point[i] < point[min_x])
    {
      min_x=i;
    }
    if (point[i] > point[max_x])
    {
      max_x = i;
    }
  }
  printf("%d\n",max_x);
  printf("%d\n",min_x);
}

int main()
{
  int n;
  int points[100][100] = {{0, 3}, {2, 2}, {1, 1}, {2, 1},
                  {3, 0}, {0, 0}, {3, 3}};

  n = sizeof(points)/sizeof(points[0]);
  convexHull(points, n);


  return 0;
}

1 Ответ

0 голосов
/ 06 февраля 2020

Массив points объявлен как двумерный массив

  int points[100][100] = {{0, 3}, {2, 2}, {1, 1}, {2, 1},
                  {3, 0}, {0, 0}, {3, 3}};

Таким образом, используемый в выражении в качестве аргумента функции, он неявно преобразуется в указатель на свой первый элемент типа int ( * )[100] .

Однако соответствующий параметр функции имеет тип int *

void convexHull(int point[], int n)

, поскольку параметр, объявленный как int point[], корректируется компилятором для объявления int * point.

И не существует неявного преобразования типа int ( * )[100] в тип int *.

Более того, кажется, что это объявление

  int points[100][100] = {{0, 3}, {2, 2}, {1, 1}, {2, 1},
                  {3, 0}, {0, 0}, {3, 3}};

не имеет смысла, потому что каждая точка "имеет только элементы twp, как, например, {0, 3}, но не 100 элементов.

Вам нужно объявить структуру, например,

struct Point
{
    int x;
    int y;
};

и использовать ее в своей программе.

В этом случае массив точек может быть определен следующим образом

  struct Point points[] = { {0, 3}, {2, 2}, {1, 1}, {2, 1},
                  {3, 0}, {0, 0}, {3, 3} };

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

...