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

Объяснение кода листинга программы

  1. Объявляется переменная типа float с именем k.
  2. В формуле происходит вычисление значения переменной k путем деления разности координат точек (x2 - x1) и (y2 - y1) на 1.0.
  3. Затем происходит вывод значения переменной k с помощью функции printf. В качестве аргументов функции передаются:
    • %f - спецификатор формата, указывающий на тип выводимого значения (в данном случае - float);
    • k - строка, содержащая имя переменной, значение которой необходимо вывести;
    • x1, y1, x2, y2 - значения координат точек, которые вычисляются вне данного фрагмента кода.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.778 из 5
Похожие ответы