Это здесь инициализация ...
struct rect new_screen = {
scanf("%f,%f",&new_screen.pt1.x,&new_screen.pt1.y),
scanf("%f,%f",&new_screen.pt2.x,&new_screen.pt2.y),
scanf("%f,%f",&new_screen.pt3.x,&new_screen.pt3.y),
scanf("%f,%f",&new_screen.pt4.x,&new_screen.pt4.y),
};
... не делает то, что вы думаете, что делает. scanf
возвращает одно целое число (обратитесь к его странице справочника, чтобы узнать значение возвращаемого значения), но ваша структура содержит поля struct point
. Что в сумме дает 8 удвоений и 4 звонка на scanf
. Из-за того, как инициализация работает в C, вы можете опустить фигурные скобки и инициализаторы для некоторых полей. Так что это печально допустимый код. Но он инициализирует только new_screen.pt1
и new_screen.pt2
(четыре вызова scanf
инициализируют четыре двойных). То, что вы отсканировали в них, сразу же перезаписывается. Последние две точки не инициализируются скобками, поэтому их следует инициализировать нулями, снова перезаписывая все, что вы, возможно, отсканировали в них.
Короче говоря, если предположить, что все вызовы scanf
не дают ошибок (и мы игнорируем проблему со спецификаторами формата), вы, по сути, написали это:
struct rect new_screen = {
{ 2, 2 },
{ 2, 2 },
{ 0, 0 },
{ 0, 0 }
};
Менее неправильная инициализация будет:
struct rect new_screen;
scanf("%lf,%lf",&new_screen.pt1.x,&new_screen.pt1.y);
scanf("%lf,%lf",&new_screen.pt2.x,&new_screen.pt2.y);
scanf("%lf,%lf",&new_screen.pt3.x,&new_screen.pt3.y);
scanf("%lf,%lf",&new_screen.pt4.x,&new_screen.pt4.y);
Он не проверяет, что scanf
успешно (именно поэтому он всего лишь меньше неправильных ), но он не растопчет содержимое new_screen
с возвращаемым значением scanf
. Я также исправил спецификатор формата (вы использовали %f
, но double
переменные требуют %lf
).
Вышеуказанные ошибки также свидетельствуют о том, насколько важно компилировать с включенными предупреждениями и устранять их. Например, когда я скомпилировал ваш код с gcc -pedantic-errors -Wall -Wextra
, я получил следующие предупреждения:
warning: format '%f' expects argument of type 'float *', but argument 2 has type 'double *' [-Wformat=]
scanf("%f,%f",&new_screen.pt1.x,&new_screen.pt1.y),
warning: missing braces around initializer [-Wmissing-braces]
struct rect new_screen={
warning: missing initializer for field 'pt3' of 'struct rect' [-Wmissing-field-initializers]
};
Привыкнуть к компиляции с включенными предупреждениями и обрабатывать их до тех пор, пока сборка не будет свободна от диагностики компилятора.