Не записывается указатель на структуру

150
01 ноября 2019, 21:00

Столкнулся с проблемой, но в интернете подходящего мне решения не нашел. Пишу программу на C нахождения точек пересечения отрезка и треугольника. Функция должна возвращать одну точку, две или NULL, который говорит о том, что пересечений нет. Первое, что мне пришло в голову, это возвращать указатель на указатель как если бы вместо структурного типа переменной был простой.

Point ** getIntersectionOfTrnLine(const Triangle tr, const Line line)
{
    Point ** ptr = (Point **)malloc(2 * sizeof(Point *));
    if (!ptr) return NULL;
    //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    ptr[0] = getIntersectionOfTwoIntercepts(&(Line) { tr.dot1, tr.dot2 }, &line); // возвращает указатель на точку пересечения двух отрезков или NULL
    ptr[1] = getIntersectionOfTwoIntercepts(&(Line) { tr.dot2, tr.dot3 }, &line);
    //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    if (!ptr[0] && !ptr[1]) {
        ptr[0] = getIntersectionOfTwoIntercepts(&(Line) { tr.dot1, tr.dot3 }, &line);
        if (!ptr[0]) {
            free(ptr[0]);
            free(ptr[1]);
            free(ptr);
            return NULL;
        }
        else {
            ptr = (Point **)realloc(sizeof(Point *));
            return ptr;
        }
    }
    if (!ptr[1]) {
        ptr[1] = getIntersectionOfTwoIntercepts(&(Line) { tr.dot1, tr.dot3 }, &line);
        if (!ptr[1]) {
            ptr = (Point **)realloc(sizeof(Point *));
            return ptr;
        }
        if (ptr[0]->x == ptr[1]->x && ptr[0]->y == ptr[1]->y) {
            ptr = (Point **)realloc(sizeof(Point *));
            return ptr;
        }
        return ptr;
    }
    if (!ptr[0]) {
        ptr[0] = getIntersectionOfTwoIntercepts(&(Line) { tr.dot1, tr.dot3 }, &line);
        if (!ptr[0]) {
            ptr[0]->x = ptr[1]->x;
            ptr[0]->y = ptr[1]->y;
            ptr = (Point **)realloc(sizeof(Point *));
            return ptr;
        }
        if (ptr[0]->x == ptr[1]->x && ptr[0]->y == ptr[1]->y) {
            ptr[0]->x = ptr[1]->x;
            ptr[0]->y = ptr[1]->y;
            ptr = (Point **)realloc(sizeof(Point *));
            return ptr;
        }
        return ptr;
    }
    return ptr;
}

Функция, которая между восклицательными знаками, возвращает указатель на точку пересечения и первый записывается в ptr[0], а вот второй указатель никуда не записывается. В отладчике можно увидеть, что функция вернула указатель, однако он не записался.

Answer 1

Ваш указатель ptr это просто указатель и "официально" он не хранит своего размера. Поэтому отладчик не знает сколько элементов отображать и отображает только один (и он прав). Хотите видеть второе значение? спросите об этом у отладчика явно - в списке контрольных значений добавьте ptr[1].

В любом случае, я даже не знаю, как этот код собрался - realloc с одним параметром официально не существует, перегрузки в си нет (есть, через макросы, но вряд ли Вы это используете), значит просто неправильно используете функцию.

Во вторых, сравнивать вещественные числа на равенство нужно очень аккуратно, обычно сравнивают через модуль разности меньше некого маленького значения.

Также похоже, что в коде есть утечки памяти. Но на все эти вопросы сложно ответить - не видно всего кода, а некоторые конструкции у меня вызывают большие вопросы.

READ ALSO
Не могу добавить QActionGroup в QMenu

Не могу добавить QActionGroup в QMenu

У меня возникла проблема с добавлением QActionGroup в QMenuЭкшны меню выглядят так, словно я добавил обычные QAction, а не QActionGroup

189
org.hibernate.cfg.NotYetImplementedException: Still need to wire in composite in-memory value generation

org.hibernate.cfg.NotYetImplementedException: Still need to wire in composite in-memory value generation

Следуя туториалу пытаюсь сделать in-memory генератор полного имени (имя + фамилия + отчество)Вот что я написал:

198
Парсинг GSON, если имя класса не совпадает с именем в JSON

Парсинг GSON, если имя класса не совпадает с именем в JSON

Как правильно реализовать это через gsonЕсть класс Shop, а есть json который выглядит так

167
connection - pool заполнен при попытке чтения истории?

connection - pool заполнен при попытке чтения истории?

Приложение на spring4+jaxb+jpa+hibernate-envers работающие с websphere и oracle11g

171