Ошибка при использовании структуры или непредвиденное поведение (неверное значение переменной) - 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 - значения координат точек, которые вычисляются вне данного фрагмента кода.