Проблема в том, что вы сообщаете компилятору, что вы возвращаете int
с int convertToPoint(...)
.Вы хотите сказать struct point convertToPoint(...)
Сообщение об ошибке, которое вы видите, говорит вам об этом, если вы знаете, как его проанализировать
error: incompatible types when returning type ‘struct point’ but ‘int’ was expected return p;
return p;
-> насколько это может сказать компилятор, это неприятное утверждение.
incompatible types when returning
-> вы возвращаете не то, проверьте, что вывозвращение и какая подпись
type ‘struct point’
-> это то, что вы возвращаете в теле
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);
}