Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.02.2019, 11:48   #1
elvy
 
Регистрация: 24.02.2019
Сообщений: 3
По умолчанию Вернуть массив указателей на структуры из функции

Си
Здравствуйте. Столкнулся с проблемой, но в интернете подходящего мне решения не нашел.
Пишу программу нахождения точек пересечения отрезка и треугольника. Функция должна возвращать одну точку, две или 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;
}
Подскажите пожалуйста что делать в таком случае. Передавать указатель на указатель в саму функцию для меня не выглядит хорошей идеей. Хотел также создать просто структуру и возвращать ее. Но все же хотелось бы узнать, есть ли еще какие-нибудь способы?
elvy вне форума Ответить с цитированием
Старый 24.02.2019, 11:55   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от elvy Посмотреть сообщение
Передавать указатель на указатель в саму функцию для меня не выглядит хорошей идеей.
А чего не так с ней?
Обычно так и делают для упрощения управления памятью (кто выделил, тот и освобождает).
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 24.02.2019, 12:38   #3
elvy
 
Регистрация: 24.02.2019
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
А чего не так с ней?
Просто вместо этого как по мне лучше вернуть структуру.
elvy вне форума Ответить с цитированием
Старый 28.02.2019, 21:35   #4
elvy
 
Регистрация: 24.02.2019
Сообщений: 3
По умолчанию

Вот скрин с отладчика. По какой причине не записывается указатель, хотя из функции он возвращается.
Изображения
Тип файла: jpg yPITVQaFog0.jpg (122.2 Кб, 130 просмотров)
elvy вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Я правильно понимаю, что это указатель на массив указателей на структуры? Кащей Общие вопросы C/C++ 3 14.08.2013 22:32
Массив указателей на структуры... Кудаив Помощь студентам 15 26.04.2012 19:29
массив указателей на структуры. С++. Перегрузка <<.Всю проблему не описать XD. Познающий Помощь студентам 8 06.02.2010 00:55
Вернуть из функции массив М@лышка Помощь студентам 0 07.01.2010 02:13
Массив указателей на структуры SNAKE89 Общие вопросы C/C++ 4 27.12.2007 10:14