Ошибка при использовании структуры или непредвиденное поведение (неверное значение переменной) - C (СИ)
Формулировка задачи:
Добрый вечер. Столкнулся с проблемой при написании программы. Требуется нарисовать линию из символов (в приведённом ниже коде отсутствует фрагмент кода, отвечающего за вывод символов на экран), но возникшая проблема заключается не в этом. В программе используется коэффициент k наклона линии. Для отладки функция drawline() пока только выводит этот коэффициент, равный (x2 - x1) / (y2 - y1) (x1, x2, y1 и y2 равны соответствующим координатам соответствующих точек, значения которых хранятся в структуре ln). Но программа выдаёт не такой результат, какой можно было бы ожидать. Прошу помочь разобраться с проблемой.
Координаты точек:
x1 = 1, y1 = 2, x2 = 3, x3 = 4.
Результат: На выводеk = 1; x1 = 1, y1 = 2, x2 = 3, y2 = 0.
При смене типаk
сvoid
наdouble
переменные принимают следующие значения:k = 0, point1[1072693248, 1], point2[2, 3].
Вывод: Исходный код:#include <stdio.h> #define MIN_MACRO(a, b) (a < b) ? a : b; #define MAX_MACRO(a, b) (a > b) ? a : b; struct point { int x; int y; }; struct line { struct point pt1; struct point pt2; }; struct point makepoint(int x, int y) { struct point temp; temp.x = x; temp.y = y; return temp; } struct line makeline(struct point pt1, struct point pt2) { struct line temp; temp.pt1 = pt1; temp.pt2 = pt2; return temp; } struct line canonline(struct line ln) { struct line temp; if (ln.pt1.x < ln.pt2.x) { temp.pt1.x = ln.pt1.x; temp.pt1.y = ln.pt1.y; temp.pt2.x = ln.pt2.x; temp.pt2.y = ln.pt2.y; } else { temp.pt1.x = ln.pt2.x; temp.pt1.y = ln.pt2.y; temp.pt2.x = ln.pt1.x; temp.pt2.y = ln.pt1.y; } return temp; } void drawline(struct line ln); int main() { struct line ln; ln = makeline(makepoint(1, 2), makepoint(3, 4)); drawline(ln); return 0; } void drawline(struct line ln) { int i, j; int x1, x2; int y1, y2; void k; if (ln.pt1.x > ln.pt2.x) drawline(canonline(ln)); else { x1 = ln.pt1.x; y1 = ln.pt1.y; x2 = ln.pt2.x; y2 = ln.pt2.y; k = (x2 - x1) * 1.0 / (y2 - y1); printf("%d point1[%i, %i], point2[%i, %i]\n", k, x1, y1, x2, y2); } }
Решение задачи: «Ошибка при использовании структуры или непредвиденное поведение (неверное значение переменной)»
textual
Листинг программы
float k; k = 1.0 * (x2 - x1) / (y2 - y1); printf("%f point1[%i, %i], point2[%i, %i]\n", k, x1, y1, x2, y2);
Объяснение кода листинга программы
- Объявляется переменная типа float с именем
k
. - В формуле происходит вычисление значения переменной
k
путем деления разности координат точек (x2 - x1) и (y2 - y1) на 1.0. - Затем происходит вывод значения переменной
k
с помощью функции printf. В качестве аргументов функции передаются:- %f - спецификатор формата, указывающий на тип выводимого значения (в данном случае - float);
k
- строка, содержащая имя переменной, значение которой необходимо вывести;- x1, y1, x2, y2 - значения координат точек, которые вычисляются вне данного фрагмента кода.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д