несовместимые типы при возвращении типа - PullRequest
1 голос
/ 20 мая 2019

У меня проблема с функциями convertToPoint.

int convertToPoint(int argc, char *argv[]) {
  struct point p;
  int x, y;

  p.x = atoi(argv[1]);
  p.y = atoi(argv[2]);

  return p;
}

Ожидается возвращение структуры типа точка, но появляется следующая ошибка:

ошибка: несовместимые типы при возврате типа 'structточка 'но' int 'ожидаемый возврат p;

В чем проблема?

Ответы [ 2 ]

2 голосов
/ 20 мая 2019

Это довольно простая проблема. Вы говорите, что хотите вернуть struct point, но ваш код говорит, что функция должна вернуть int.

int convertToPoint(
^^^
ups, shall return int

Так что просто измените его на struct point - как:

#include <stdio.h>

struct point 
{
    int x;
    int y;
};

struct point convertToPoint(int argc, char *argv[]) {
    struct point p;
    p.x = atoi(argv[1]);
    p.y = atoi(argv[2]);
    return p;
}


int main(int argc, char *argv[]) {
    struct point p = convertToPoint(argc, argv);
    printf("%d %d\n", p.x, p.y);
}

Тем не менее - немного странно передавать argc, когда он не используется. Либо удалите этот аргумент функции, либо используйте его, чтобы проверить, было ли дано достаточное количество аргументов. Как:

    p.x = (argc > 1) ? atoi(argv[1]) : 0;
    p.y = (argc > 2) ? atoi(argv[2]) : 0;

Также обратите внимание, что я удалил int x, y;, поскольку эти переменные не используются.

0 голосов
/ 20 мая 2019

Проблема в том, что вы сообщаете компилятору, что вы возвращаете int с int convertToPoint(...).Вы хотите сказать struct point convertToPoint(...)

Сообщение об ошибке, которое вы видите, говорит вам об этом, если вы знаете, как его проанализировать

error: incompatible types when returning type ‘struct point’ but ‘int’ was expected return p;

  1. return p; -> насколько это может сказать компилятор, это неприятное утверждение.

  2. incompatible types when returning -> вы возвращаете не то, проверьте, что вывозвращение и какая подпись

  3. type ‘struct point’ -> это то, что вы возвращаете в теле

  4. but ‘int’ was expected -> это значение из вашей сигнатуры функции.

Вот полный пример

// convert.c
#include <stdio.h>
#include <stdlib.h>

struct point {
  int x;
  int y;
};


struct point convertToPoint(int argc, char *argv[]) {
  struct point p;
  int x, y;

  p.x = atoi(argv[1]);
  p.y = atoi(argv[2]);

  return p;
}

int main(int argc, char** argv) {
    struct point p = convertToPoint(argc, argv);
    printf("%d, %d", p.x, p.y);
}

Доказательство того, что оно работает

~/src ❯❯❯ gcc -ansi convert.c -o convert                                                                                                                                               ✘ 139 
~/src ❯❯❯ ./convert 1 2
1, 2%   

Наконец,Вы можете сделать небольшой рефакторинг, чтобы очистить это

// convert.c
#include <stdio.h>
#include <stdlib.h>

struct point {
  int x;
  int y;
};


struct point convertToPoint(char x[], char y[]) {
  struct point p;

  p.x = atoi(x);
  p.y = atoi(y);

  return p;
}

int main(int argc, char** argv) {
    //TODO: check for 2 args and print a helpful error message
    struct point p = convertToPoint(argv[0], argv[1]);
    printf("%d, %d", p.x, p.y);
}
...