Форум программистов, компьютерный форум, киберфорум
C (Си)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
4 / 4 / 0
Регистрация: 13.07.2021
Сообщений: 59

Массив структур или массив указателей?

23.08.2026, 01:55. Показов 2194. Ответов 24

Студворк — интернет-сервис помощи студентам
Доброй ночи (у меня, по крайней мере). Вопрос к более опытным программистам скорее по правильности оформления или по архитектуре, не знаю, как будет точнее сформулировать. Небольшой контекст.

Прохожу я курс по программированию компьютерной графики от Gustavo Pezzi, честно спираченный на просторах необъятного. Чувства двоякие: вроде мужик грамотный, круто объясняет, ведёт также курс по компиляторам и ассемблеру для игр на PS1 и Nintendo, даёт математические основы, на курсе только SDL, чистый Си и компилятор. Но код его - это песец! Создание локальных переменных в функции в цикле и во вложенном цикле, каждая из которых используется только один раз, а потом висит на стеке, а нужна для того, чтобы потом это в глобальный массив запушить, написание макроса функции для добавления элемента в динамический массив с маленькой, мать её, буквы (учитывая, что макропроцессор начинает свою работу, когда текст уже разбит на лексеммы, но области видимости ещё не определены)... Даже я это высекаю сразу и понимаю, что так делать не надо. И вот такой фигни - целая куча, всё описывать не буду.

Я на ходу переписывал так, как надо, но всё же не уследил, т.к. тема для меня новая, настолько далеко вперёд я не смотрел. Вот теперь пытаюсь разобраться, как это всё грамотно оформить.

По задумке автора код выглядит примерно так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/* Переменная для хранения адреса массива треугольников */
triangle_t *triangles_to_render = NULL;
 
/* Update -- функция, вызываемая в игровом цикле */
void update(void)
{
    /* Тут мы берём точки 3D модели, трансформируем их, проецируем на экран из 3D в 2D */
    ...
    /* В самом конце мы пушим треугольник для рендеринга в triangles_to_render */
}
 
/* Структура triangle_t выглядит вот так */
typedef struct {
    vector2_t vertices[3];
    uint32_t color;
} triangle_t
Дальше массив этих точек используется для отрисовки, точки передаются в буфер SDL_Texture и рендерятся на экран.

Всё бы было хорошо, но я дошёл до понятия Z-Buffer. Мне надо отсортировать треугольники по оси Z от дальних к ближним. Выводиться точки будут в этом порядке, поэтому ближние объекты будут перекрывать дальние. Вот и встал вопрос, как это сделать правильно. Я не смотрел его реализацию, но что-то мне подсказывает, что будет полный шлак. Это я понял по его подсказкам, когда он давал ДЗ по написанию алгоритма пузырьком. Я написал быструю сортировку с 3-м разбиением по Дейкстре, получил массу эмоций, удовольствие в том числе . Был весёлый случай с обычной быстрой сортировкой, я случайно сгенерил такой массив, который на одном из последних рекурсивных вызовов взял опорный элемент равный последнему, и оба они были максимумами. В итоге валилось всё в segmentation fault. Но это уже другая история.

Возвращаюсь к дилемме: с одной стороны в массиве все структуры расположены рядом, но вот свап местами элементов может затянуть прилично ресурсов, ведь никто не гарантирует, что структура не обрастёт дополнительными полями с течением времени. А если сортироать надо будет другой массив, с более тяжёлыми структурами? С другой стороны я знаю, что структуры по значению даже в функции практически никогда не передают, да и один хрен по каждому треугольнику надо будет проходиться в цикле, не всё ли равно, расположены ли структуры в памяти подряд, или в разных местах на куче? Можно создавать динамически структуры, а пушить в массив их адреса, их ведь сильно проще менять местами. Но это надо каждый раз дёргать malloc. Вроде malloc устроен так, что не создаёт оверхед из системных вызовов, он сразу выделяет сколько-то килобайт, а потом раздаёт память по запросу, чтобы не дёргать ОС лишний раз, но вот это "вроде"...

Вот я и не могу понять, как тут правильно поступить будет? Подскажите, пожалуйста, более опытные коллеги, какая у вас практика работы в таких ситуациях принята? Хочу научиться так, как надо, ведь хреново -- оно само получится =).
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.08.2026, 01:55
Ответы с готовыми решениями:

Создать рекурсивный список динамических структур(или структур указателей)
Значит идея какая есть код который получает список структур на 1 2 3 4 байт. #include "stdafx.h"...

Динамические массивы структур;Классы. Класс массивы структур;Классы. Класс динамического массива структур.
Здраствуйте.Помогите с практичкой мое задание 4.3. Строка таблицы данных содержит следующую...

Массив из указателей на масив из указателей на массив из int)
Доброго времени суток! Возникла проблема - как на C++ создать массив из указателей на массив из...

24
 Аватар для Наталья8
625 / 383 / 67
Регистрация: 09.03.2016
Сообщений: 4,302
29.08.2026, 00:23
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Uko1ove Посмотреть сообщение
Решил попробовать создавать сайты, меня затянуло, захотелось большего. Попробовал много всего, понял, что C, C++ и ассемблер -- это моё.
Что то дохрена всего сразу... Сильно затянуло по ходу...
Вот я и почитал.....

Добавлено через 14 минут
Вот вчера писал. Верхнюю функцию мне подсказал ИИ.
Задача - Открыть фолдер и выделить в нём последний по числу и времени подфолдер...
На вычитание времяни....

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void time_decrem(SYSTEMTIME &st) {
    FILETIME ft;// Этот блок отсчитает на сутки назад ---------- если сегодняшней папки нет
    SystemTimeToFileTime(&st, &ft);
    // 3. Объединяем low и high части FILETIME в 64-битное число для математических операций
    ULARGE_INTEGER uli;
    uli.LowPart = ft.dwLowDateTime;
    uli.HighPart = ft.dwHighDateTime;
    // В одних сутках: 24 часа * 60 минут * 60 секунд * 10 000 000 (интервалов по 100 нс)
    // Это значение равно 864 000 000 000 интервалам
    const ULONGLONG ONE_DAY_IN_100NS = 864000000000ULL;
    // Вычитаем один день
    uli.QuadPart -= ONE_DAY_IN_100NS;
    // 4. Возвращаем измененное значение обратно в структуру FILETIME
    ft.dwLowDateTime = uli.LowPart;
    ft.dwHighDateTime = uli.HighPart;
    // 5. Конвертируем FILETIME обратно в SYSTEMTIME (уже вчерашний день)
    FileTimeToSystemTime(&ft, &st); // Здесь Windows сама пересчитает месяц/год, если нужно
}

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CoInitializeEx(0, COINIT_MULTITHREADED);
            ITEMIDLIST* dir = ILCreateFromPathA(Module_fld);
            LPITEMIDLIST* items = new LPITEMIDLIST[1];
            SYSTEMTIME st;  // ---- Взять систамное время и создать имя сегодняшней папки.
            GetSystemTime(&st);
            int n = 6;
                while (--n) {// Считать на шесть дней назад и вылет если таких папок нет
                    std::string folder_name = "\\Convert_out(" +
                        std::to_string(st.wDay) + "." + std::to_string(st.wMonth) + "." + std::to_string(st.wYear) + ")"; // Имя папки
                    strcat(Module_fld, folder_name.c_str());// <--- Имя фолдера сегодняшнего приклеить
                //MessageBoxA(NULL, Module_fld, "Error", MB_OK | MB_ICONSTOP | MB_SETFOREGROUND | MB_SYSTEMMODAL);
                    items[0] = ILCreateFromPathA(Module_fld);
                    if (items[0] != NULL) {// Нашёл папку и вылет...
                SHOpenFolderAndSelectItems(dir, (unsigned int)1, (LPCITEMIDLIST*)items, 0);
                        break; }
                    *strrchr(Module_fld, L'\\') = '\0'; // ====== ноль вместо последнего слеша;
                    time_decrem(st);
                            }
            ILFree(items[0]); ILFree(dir);
            delete[] items;
            CoUninitialize();
0
 Аватар для Наталья8
625 / 383 / 67
Регистрация: 09.03.2016
Сообщений: 4,302
29.08.2026, 00:24

Как то так....
Вот это у меня в голове и было... И ещё много разных проблем.
0
 Аватар для Наталья8
625 / 383 / 67
Регистрация: 09.03.2016
Сообщений: 4,302
29.08.2026, 00:32
Uko1ove,
Можешь научиться сам себя озадачивать?
Какая операционка?
Искусственный интеллект может помогать, но нужны твои идеи...
Идеи есть?
0
4 / 4 / 0
Регистрация: 13.07.2021
Сообщений: 59
29.08.2026, 20:15  [ТС]
Цитата Сообщение от Наталья8 Посмотреть сообщение
Можешь научиться сам себя озадачивать?
Какая операционка?
Основной ПК на Linux Slackware. Давно хотел освоить создание игр, чтобы либо попробовать портировать Heroes of Might and Magic 3 HotA на линукс, либо создать клон Diablo 2 тоже под линукс, как вот тут ребята делают (в идеале). Просто интересно и хочется. Задачи себе ставить могу, не всегда хватает навыков их реализовать.

Меня подкупило то, что в курсе даётся крепкий фундамент + необходимая для этого математика. Хочу понимать, что и зачем я делаю. Пробовал до этого изучать OpenGL и DirectX -- больше похоже на чёрный ящик, когда дёргаешь зафункции API, а внутри происходит какая-то магия. Поэтому, когда наткнулся на курс, я скачал его и начал изучать.

Конкретно в этой теме у меня был вопрос, как лучше отсортировать массив треугольников по определённому признаку: использовать массив указателей на структуры треугольников или же массив структур? Появились сомнения по поводу компетентности препода именно в написании кода. Оказалось, что неправ был я. Здесь написали, что конкретного ответа нет, надо тестить и замерять.

Цитата Сообщение от Наталья8 Посмотреть сообщение
Искусственный интеллект может помогать, но нужны твои идеи...
По поводу ИИ -- я очень осторожен с ним, обращаюсь к нему за подсказками и поиском информации, но полноценно код не доверяю ему писать. Тем более, что ИИ, пишущий код, не оставляет пространства для исследования и собственного творчества. Да и чтобы научиться чему-то, надо сперва самому ручками поделать и пару раз накосячить.

Цитата Сообщение от Наталья8 Посмотреть сообщение
Идеи есть?
Идеи есть, полно, моя проблема в том, что некому передать практические знания, а информационное поле переполнено питоном, до-диез, джавой и джаваскриптом. Программирование, всё же -- ремесло, а оно передаётся от мастера к подмастерью. Приходится выкручиваться, что-то придумывать, пробовать, ошибаться и снова пробовать и просить помощи, когда упёрся в тупик. Благо время позволяет. Причём правильное оформление кода для меня ничуть не менее важно, чем знание языка и сопутствующих тем. Я уже разок переписал код заново, больше не хочу так.
0
 Аватар для Наталья8
625 / 383 / 67
Регистрация: 09.03.2016
Сообщений: 4,302
29.08.2026, 23:37
Uko1ove,
Вообще ты на бота похож из искуственного интелекта...
Многобукоф пишешь....

Не по теме:

Всё в дерьмо превращаеться.... Может я старею...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.08.2026, 23:37

Массив указателей на массив строк и сортировка массива указателей
Добрый день. Поступил вопрос. Есть задача. У нас встроенный массив char mass;.Мы вводим строки до...

Массив указателей на массив указателей
Здравствуйте, мне нужна помощь в написание кода на С++ Ввести массив строк. Создать массив А...

Надо вывести массив указателей, почти всё готово, но я не знаю как именно вывести массив указателей
Вот как звучит задание: Создать динамическую вещественную матрицу NxM (N и M ввести с...

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

Создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей
Задача: создать специфицированный шаблон функции, принимающей массив указателей на char и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Новые блоги и статьи
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru