Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
123
36 / 0 / 1
Регистрация: 18.03.2015
Сообщений: 221

Не работает клик мыши

06.03.2026, 06:52. Показов 6278. Ответов 66
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Отрисовываю треугольник на openGL.

Переменная qf должна при клике увеличиваться на 3 таким образом меняется координата нижней правой точки треугольника.
Но даже не рендерится...

C++
1
2
3
4
5
6
 case WM_LBUTTONDOWN:
        {
            //int xPos = GET_X_LPARAM(lParam);
          //  int yPos = GET_Y_LPARAM(lParam);
 
           // qf = qf*3;

||=== Build: Debug in quad+ (compiler: GNU GCC Compiler) ===|
++\quad+\main.c||In function 'WindowProc':|
++\quad+\main.c|125|error: implicit declaration of function 'GET_X_LPARAM'; did you mean 'GET_SC_WPARAM'? [-Wimplicit-function-declaration]|
++\quad+\main.c|126|error: implicit declaration of function 'GET_Y_LPARAM'; did you mean 'GET_SC_WPARAM'? [-Wimplicit-function-declaration]|
++\quad+\main.c|128|error: 'q' undeclared (first use in this function)|
++\quad+\main.c|128|note: each undeclared identifier is reported only once for each function it appears in|
++\quad+\main.c|126|warning: unused variable 'yPos' [-Wunused-variable]|
++\quad+\main.c|125|warning: unused variable 'xPos' [-Wunused-variable]|
||=== Build failed: 3 error(s), 2 warning(s) (0 minute(s), 3 second(s)) ===|
Могу уточнить детали если нужно.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.03.2026, 06:52
Ответы с готовыми решениями:

Клик мыши, как сделать?
Нужна просто команда или функция которая бы кликалы мыш в часть экрана где она установлена. Можно...

Клик мыши на пиксел
хочу написать код, который будет в заданных координатах кликать левой кнопкой мыши на пиксели...

Перемещение курсора мыши на заданные координаты и клик
Добрый день. Подскажите, пожалуйста, как можно реализовать сабж. Гугление выдает некоторые...

66
9949 / 2950 / 497
Регистрация: 05.10.2013
Сообщений: 8,031
Записей в блоге: 242
14.03.2026, 16:32
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Royal_X Посмотреть сообщение
никто не говорит выучить на 100% С++ (это даже невозможно), но знать самые основы он должен.
Да, я тоже имел ввиду "основы" и писал почти везде, но там забыл. Я открыл несколько его тем по C++ и там везде работа с консолью. ТС на протяжении 10 лет был в зоне комфорта в консольных программах. Спустя 10 лет решил попробовать GUI и вышел из зоны комфорта. Может это даже к лучшему, что ошибки показывают серьёзные пробелы в основах. Он может уйти в основы ещё на 10 лет. Пусть попробует WinAPI дальше изучать и изучать основы Си или C++ в рамках WinAPI. Я уверен, что лучше всего ему взять сейчас книгу "Язык программирования C" Кернигана и Ритчи. Она тонкая и в ней даны те самый основы C, которые подходят и для C++. Просто добавить в его рабочую программу, что он запустил - поля ввода и кнопки. Делать упражнения из книги, как из консоли, так и в GUI. То есть сначала, конечно, запускать в консоли, а потом делать ввод данных в полях ввода на WinAPI. Пример, как делать поля ввода на WinAPI и кнопки он же сможет нагуглить. А потом просто сосредоточиться на основах Си по K&R и не будет соблазна опять уходить в ОПП. Я давно прочитал маленькую книгу, которая позиционировалась, как для школьников: Крупник "Изучам C++". Она тонкая и легко читается. Книг вообще полно по C++ и в начале, как правило, будет чистый Си, поэтому любую книгу для начинающих можно брать. Книги лучше структурированы и поглубже, чем короткие туториалы. Моё мнение, что K&R + решение задач из это книги в консоли и переносе решений на GUI в том же файле main.c, что работает у автора темы (плюс добавить поля ввода и кнопку) - будет нормально.
0
14.03.2026, 16:37

Не по теме:

Цитата Сообщение от 8Observer8 Посмотреть сообщение
ТС на протяжении 10 лет был в зоне комфорта в консольных программах. Спустя 10 лет решил попробовать GUI и вышел из зоны комфорта.
чёт мне не верится, что можно писать консольные приложения не зная об объявлении переменных и области видимости :jokingly:

может быть он передал аккаунт другому чуваку

0
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,092
Записей в блоге: 2
14.03.2026, 17:23
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Почему модели character'ов обычно создаются в T-pose или A-pose?
Это гуглится за две секунды. Вы писали, что у вас нет VPN, поэтому вы не пробовали ни разу никакие ИИ, но если вы в гугл скопируете свой пропрос, то перед списком ссылок будет результат Gemini, потому что Google использует свой ИИ для поиска. Ищите на вкладке..
За 2 секунды или за сколько, но ответа-то у Вас как не было так и нет. Почему же Вы не привели то что нашли? Почему увиливаете типа "посмотрите сами", чего боитесь? Только что Вы утверждали что Gemini - очень полезная штука, хорошо, давайте проверим, вопрос-то легкий, правда. Покажите богатырскую силу ИИ
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6296 / 3018 / 1053
Регистрация: 01.06.2021
Сообщений: 11,444
14.03.2026, 20:47
Цитата Сообщение от Igor3D Посмотреть сообщение
Почему модели character'ов обычно создаются в T-pose или A-pose?
а для пса какую позу обычно используют?

0
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,092
Записей в блоге: 2
15.03.2026, 09:00
Цитата Сообщение от Royal_X Посмотреть сообщение
а для пса какую позу обычно используют?
Скриншот больше похож на кадр анимации собачки (а не на исходную позу/модель). Но по сути вопрос тот же, лучше сформулировать так
Ну вот модель песика без всякой T/A позы, что мне за это будет? Разве это чем-то плохо? Разве в такой модели что-то не работает? Может T/A - просто "дань традиции"?
Вот пусть Ваня нам это и объяснит (с ИИ или как)
0
9949 / 2950 / 497
Регистрация: 05.10.2013
Сообщений: 8,031
Записей в блоге: 242
15.03.2026, 11:16
Цитата Сообщение от Royal_X Посмотреть сообщение
может быть он передал аккаунт другому чуваку
ТС точно не передавал свой аккаунт никому, потому что в одном стиле все темы. Он фокусируется почти исключительно на ООП. Области видимости - только локальные переменные методов, либо поля класса. Наверное, это одна из первых тем, где ТС использует глобальную переменную. Конечно, это не отменяет того, что он обязан знать, чем отличаются глобальная и локальная области видимости.

Я поймал себя на мысли, что на форуме считается как-будто бы зашкварным лезть в список тем пользователя. Наверное, один процент так делает, потому что там видно кто-заходил в профиль и заходили только я и Igor3D. Может потому что мы чувствуем, что это может быть неприятно ТС, так как это близко к переходу на личности - анализировать сколько человек изучал C++ и какой у него прогресс по темам. Моё мнение, что по темам видно проблемы: отсутствия профильных предметов по программированию (работы с преподавателями), отсутствие изучения книг, большой фокус на коротких видео уроках, фокус в основном только на изучении ООП. ТС в одной теме собирал Unreal Engine 4 из исходников и есть темы по Unity. Много тем по Паскаль и DirectX. Есть темы по OpenGL, WinAPI, Delphi, JavaScript и т.д. Нет фокуса на одном языке и на одной технологии, что, впрочем, и моя проблема - расфокусировка на разные языки, движки, технологии и т.д. Мало регулярного набора кода руками у ТС, что и моя проблема тоже. Я считаю, что разные языки, библиотеки, технологии и т.д. тоже дают свою пользу при сравнении, но лучше выбрать, одно приоритетное направление (один набор), а остальное по остаточному принципу.

Цитата Сообщение от Igor3D Посмотреть сообщение
Вот пусть Ваня нам это и объяснит (с ИИ или как)
Если вы хотите реально обсуждать скелетную анимацию в этой теме, то во-первых, я не хочу флудить, а во-вторых, я сейчас временно отложил тему скелетной анимации до момента пока я не начну разбираться со смешиванием анимаций. Я потерял счёт, какой раз вы в разных темах задаёте мне этот вопрос. Это неправильно так брать и не по теме начинать спрашивать в разных темах - это создаёт кучу флуда, который потом не найдёшь, если что-то там было полезное. Либо, скорее всего, вы хотите доказать, что в каких-то вопросах ИИ не может дать точный технический ответ на общие вопросы? Я и так это прекрасно знаю. Я не адепт ИИ. Да, слишком навязчиво я стал предлагать его использовать в нескольких темах. Да, признаю это мой косяк - перегнул, но не надо меня дальше носом в это тыкать. Я знаю, что на такие общие вопросы ИИ не может дать полноценное техническое объяснение и бывает ошибается - это пишут под каждым промптом или ответом, как Google пишет: "ИИ может ошибаться. Рекомендуем проверять ответы."

Цитата Сообщение от Igor3D Посмотреть сообщение
Почему модели character'ов обычно создаются в T-pose или A-pose?
Большинство начинающих в 3D моделировании персонажей (риггинге и анимировании) знают на него примитивный ответ и без поиска в Google. На такой общий вопрос Google просто сформулирует, с помощью своего Gemini, краткое описание со ссылками на цитаты из разных популярных туториалов для начинающих и даст краткие переформулированные выдержки типа: "Удобство риггинга (Rigging): В T-позе (руки прямые) или A-позе (руки опущены под углом) проще симметрично разместить суставы скелета внутри 3D-модели.", "А-pose меньше деформирует плечи и лучше подходит для действий с опущенными руками", "T-Pose лучше подходит для действий с поднятыми руками" и т.д. С точки зрения реализации анимации в коде на OpenGL нет разницы между T-pose или A-pose и любой другой позой. Качество может отличаться в плечах при скиннинге, так как в T-pose больше будут деформироваться плечи, когда персонаж выполняет действия с опущенными руками.
0
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,092
Записей в блоге: 2
15.03.2026, 13:15
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Это неправильно так брать и не по теме начинать спрашивать в разных темах
Ну так в каждой из них Вы щедро раздаете рекомендации что человеку делать, как осваивать высоты и.т.п., разве не так? Я считаю это непродуктивным и предлагаю простую (посильную) задачу, но на которой человек может многому научиться
Цитата Сообщение от 8Observer8 Посмотреть сообщение
слишком навязчиво я стал предлагать его использовать в нескольких темах. Да, признаю это мой косяк - перегнул,
Да, выходит люди своего мнения иметь не должны, а тупенько глотать все что скажет ИИ. Реакцию Вы видите.
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Либо, скорее всего, вы хотите доказать, что в каких-то вопросах ИИ не может дать точный технический ответ на общие вопросы? Я и так это прекрасно знаю.
А почему Вы решили что это "общий" вопрос? Потому что так выглядят ответы ИИ? Это совсем не так. Более того, проблема Вам хорошо известна, Вы даже пытались ее решать. Вроде Вам "и карты в руки", но тут подгадил ИИ. Эффект применения явно в минус. Хотя я совсем не против ИИ, просто надо относиться критически, думать, анализировать, а не так, тупо жрать все что дают.
Цитата Сообщение от 8Observer8 Посмотреть сообщение
но не надо меня дальше носом в это тыкать
Ну мы можем переключиться на анимацию колокола, там масса интересного! А с этими злополучными T/A позами - ладно уж, скажу ответ, но сначала дадим возможность другим ответить
Цитата Сообщение от Royal_X Посмотреть сообщение
а для пса
Так какие проблемы будут с Вашим песиком?
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6296 / 3018 / 1053
Регистрация: 01.06.2021
Сообщений: 11,444
15.03.2026, 14:07
Цитата Сообщение от Igor3D Посмотреть сообщение
Так какие проблемы будут с Вашим песиком?
песик только был намеком, что A/T позы не всегда годятся и не нужно следовать каким-то традициям, а использовать то, что оптимально для конкретного случая.
Например, все тут упоминают риггинг, но ведь бывают и другие задачи, с которыми я сам лично сталкивался. Возьмем к примеру симуляцию ткани в Marvelous Designer. Я создавал несколько одежек в этом приложении. И по опыту скажу, что для снятия мерок нужна одна поза, а для просмотра результата после сшивания, когда переходишь в режим симуляции, то нужна другая поза (даже позы, поскольку нужно проверять модельку в разных позах, чтобы одежка прилегла к персонажу комильфо).
0
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,092
Записей в блоге: 2
16.03.2026, 00:54
Коротенько как работает CA (Character Animation)

- создается полигонная модель
- создается скелетон (цепочка/иерархия "бонов" (костей) что могут быть отрезками или просто точками)
- скелетон совмещается/засовывается внутрь модели, стремимся сделать это максимально точно/удачно

Теперь мы хотим анимировать скелетон, т.е. вращать боны и двигать их цепочку, так чтобы меш/модель следовала этим изменениям. Для этого нужно создать "skin weights", для каждого вертекса надо записать индексы/номера и веса всех бонов которые этим вертексом управляют. Напр вертекс "на руке" должен быть привязан к боне руки, на ноге - к боне ноги и.т.п. Теперь если рука/нога анимируются - привязанные вертексы также движутся. Вертексы на локтях и коленях привязываются к 2 бонам, результат интерполируется согласно весам. Какие-то вертексы могут ссылаться на 3-4 боны, не запрещено и больше, но обычно смысла нет.

Как же сделать такую привязку, т.е. рассчитать skin weights? Обычно эта инфа сохранена в файле (напр .dae или .fbx), и мы получаем ее "на шару", но все равно кто-то (или где-то) ее создает. Да, для этого есть редактор(ы), но разрисовать каждую бону по вертексам руками нереально (скромный char имеет более 60 бонов). Поэтому базовый skin weight создается автоматом, примерно так

- для каждого вертекса находятся 4 ближайшие боны, и вычисляются их начальные веса обратно пропорционально расстоянию
- веса задираются в степень (4 и больше), если вес оказывается меньше заданного порога, то эта бона отбрасывается

Алгоритм простой и работает хорошо, но 100% гарантии он не дает. Напр если вертекс равноудален от 2 бон - обе им рулят. Типовая ситуация когда автомат не сработал = аттач. Вертексы левой ноги схватили бону правой и/или наоборот. Придется корректировать это вручную.

- открыть редактор и выбрать бону правой ноги
- найти вертексы левой на которые влияет правая (редактор должен их подсветить)
- "перекрасить" эти вертексы нужной кистью, избавиться от влияния правой боны

Удовольствие сомнительное, особенно учитывая что добраться до нужных вертексов часто непросто, они заслонены др частями модели

Теперь понятны ответы на заданные вопросы. Почему T/A pose? Потому что руки лучше держать подальше от штанов, иначе штаны могут "поймать" боны руки и потянутся за рукой в анимации. Конечно это не значит что char не должен опускать руки вообще/всегда, как только skin weights созданы и записаны - пожалуйста, руки можно хоть в карманы засовывать.
Что плохого может случиться с собачкой? Ее передние лапки "в опасной близости" друг к другу, возможен захват чужой боны. Хотя формально это не запрещено. Если посидеть (недельку) в редакторе - любую модель можно довести до ума.

Цитата Сообщение от Royal_X Посмотреть сообщение
песик только был намеком, что A/T позы не всегда годятся и не нужно следовать каким-то традициям, а использовать то, что оптимально для конкретного случая.
Например, все тут упоминают риггинг, но ведь бывают и другие задачи, с которыми я сам лично сталкивался. Возьмем к примеру симуляцию ткани в Marvelous Designer. Я создавал несколько одежек в этом приложении. И по опыту скажу, что для снятия мерок нужна одна поза, а для просмотра результата после сшивания, когда переходишь в режим симуляции, то нужна другая поза (даже позы, поскольку нужно проверять модельку в разных позах, чтобы одежка прилегла к персонажу комильфо).
Конечно для редактирования skin weights можно использовать любой кадр анимации. Но пока skin weights не созданы - никакой анимации еще нет. То есть можно анимировать скелетон, но с мешем ничего не произойдет, пока имеем только исходную модель
Миниатюры
Не работает клик мыши  
0
Нарушитель
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,217
16.03.2026, 17:48
Цитата Сообщение от 8Observer8 Посмотреть сообщение
"Язык программирования C" Кернигана и Ритчи.
Ладушки нашёл. Если люди читают значит хорошая.
Название: NewPicture11.png
Просмотров: 198

Размер: 7.0 Кб
Хрен_ли боны.? Почему фар край шесть не запускаеться?
https://vk.com/wall-80984752_462
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6296 / 3018 / 1053
Регистрация: 01.06.2021
Сообщений: 11,444
17.03.2026, 00:42
Цитата Сообщение от Наталья8 Посмотреть сообщение
Почему фар край шесть не запускаеться?
Название: 15702110556222332083.gif
Просмотров: 205

Размер: 1.33 Мб
1
Нарушитель
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,217
17.03.2026, 00:45
Потому что у меня компьютер гавно...
Кстати язык програмирования
не очень хорошо переведено.
0
Нарушитель
623 / 381 / 67
Регистрация: 09.03.2016
Сообщений: 4,217
17.03.2026, 00:50
До меня такое что то плохо доходит.
0
17.03.2026, 01:30

Не по теме:

Цитата Сообщение от Наталья8 Посмотреть сообщение
До меня такое что то плохо доходит
Правильно, забей на всякие lvalue, const, volatile(на него особенно сильно забей), mutable, thread_local.
Пусть этим конигаи-ричи страдают.
void* в руки и поехали)

0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
17.03.2026, 08:12
Цитата Сообщение от Наталья8 Посмотреть сообщение
До меня такое что то плохо доходит.
Вложение 1530478
Ошибка перевода. В оригинале: "There are several assignment operators; all group right-to-left." Здесь: "Существует несколько операторов присваивания; они выполняются справа налево"

Слово "group" подразумевает лишь ассоциативность, т.е. синтаксическую группировку при парсинге выражений. Такая группировка не имеет никакого отношения к порядку выполнения операторов присваивания. В языке С оператор присваивания не имеет никакого определенного порядка выполнения, т.е. ни о каком "выполняются справа налево" речи быть не может.
2
9949 / 2950 / 497
Регистрация: 05.10.2013
Сообщений: 8,031
Записей в блоге: 242
18.03.2026, 14:59
Цитата Сообщение от Наталья8 Посмотреть сообщение
До меня такое что то плохо доходит.
Если вам хочется начать изучать основы Си, то возьмите "Modern C for Absolute Beginners" под авторством Дмитровича Слободана, 2024 года. Если хочется изучать более глубоко современный Си, то вот отличная комбинация из трёх новых (2024-2025 годов) книг по текущему стандарту C23. K&R можно оставить как справочник, чтобы сравнивать с тем какой Си был в 70-80-х годах и что изменилось к настоящему времени, а также задачи после каждого параграфа в K&R, я думаю, до сих пор считаются классическими для обучения. К&R вышла в конце 80-x и это стандарт C89. Задачи из K&R можно решать с учётом новейшего стандарта C23. Правда, скорее всего, сейчас больше популярен предыдущий стандарт C11 (с исправлениями C17), но это неважно. Я думаю, лучше сразу изучать C23.

Первая из них "Modern C for Absolute Beginners" - это короткое дружелюбное введение в Си для начинающих, примерно на 350 страниц. Она поможет ещё подтянуть базовый технический английский:

Modern C for Absolute Beginners: A Friendly Introduction to the C Programming Language 2nd ed. Edition
Современный C для начинающих: дружелюбное введение в язык программирования C 2-е изд. Версия


picГод издания: 2024
Автор: Dmitrović Slobodan / Дмитрович Слободан

Издательство: Apress; 2nd ed. edition
ISBN: 979-8868802232
Язык: Английский

Формат: PDF, EPUB
Качество: Издательский макет или текст (eBook)
Интерактивное оглавление: Да
Количество страниц: 348

Описание: Изучите основы C, стандартной библиотеки C и современных стандартов C. Это новое издание, дополненное современными примерами и скриншотами, полностью обновлено и переработано с учетом новейших стандартов и функций C23.
C — язык, который сегодня так же популярен, как и десятилетия назад. Его можно использовать для программирования микроконтроллера или для разработки целой операционной системы. Автор Слободан Дмитрович приглашает вас в путешествие по языку программирования C, стандартной библиотеке и основам стандартов C. Каждая глава представляет собой правильный баланс теории и примеров кода.
Написанная в краткой и простой для понимания форме, эта книга предоставит вам все необходимое для начала программирования на современном языке C.

Чему вы научитесь

Понимать язык программирования C и основы стандартной библиотеки C.
Работа с новыми функциями стандартов C.
Изучите основы типов, операторов, операторов, массивов, функций и структур.
Ознакомьтесь с основами указателей, выделения памяти и манипулирования ею.
Воспользуйтесь лучшими практиками в C
Для кого эта книга

Начинающие или начинающие программисты, желающие изучить язык программирования C. Никакого предварительного опыта программирования не требуется.
Вторая книга "Effective C" - примерно на 300 страниц, но она более продвинутая и это введение в профессиональное безопасное программирование на Си. Её можно читать второй или иногда параллельно с первой:

Effective C, 2nd Edition: An Introduction to Professional C Programming / Эффективный C, 2-е издание: Введение в профессиональное программирование на языке Си

picГод издания: 2025
Автор: Seacord Robert / Сикорд Роберт

Издательство: No Starch Press, Inc.
ISBN: 978-1-7185-0413-4
Язык: Английский

Формат: PDF/EPUB
Качество: Издательский макет или текст (eBook)
Интерактивное оглавление: Да
Количество страниц: 314

Эффективный C, 2-е издание - это введение в основы программирования на языке Си, которое вскоре поможет вам писать программы, решать проблемы и создавать работающие системы.
Последняя версия языка программирования C, C23, повышает надежность и удобство использования языка. Это второе издание Эффективный C было полностью обновлено, чтобы охватить C23, предлагая современное введение в C, которое научит вас передовым методам написания профессиональных, эффективных и безопасных программ, решающих реальные проблемы.
Эффективный C - это настоящий продукт C-сообщества. Роберт С. Сикорд, многолетний член комитета по стандартам Си с более чем 40-летним опытом программирования, разработал эту книгу в сотрудничестве с другими экспертами по Си, такими как ведущий специалист по сопровождению Clang Аарон Баллман и редактор проекта Си Джанхейд Менейде. Благодаря усилиям этой группы экспертов вы узнаете, как:
Разрабатывать быстрый, надежный и безопасный профессиональный код на C
Эффективно использовать объекты, функции и типы
Безопасно и корректно использовать целые числа и типы с плавающей запятой
Управлять динамическим распределением памяти
Эффективно использовать строки и типы символов
Выполнять операции ввода-вывода с использованием стандартных потоков C и файловых дескрипторов POSIX
Эффективно использовать препроцессор C
Отлаживать, тестировать и анализировать программы на C
Мир работает на основе кода, написанного на C. Эффективный C покажет вам, как извлечь максимальную пользу из этого языка и создавать надежные программы, которые выдержат испытание временем.
Новое в этом издании: Это издание было значительно переработано, чтобы привести его в соответствие с современными методами программирования на C23 и использовать новейшие возможности C23.
Третья книга "Modern C: Covers the C23 standard" - она с фокусом на новых фишках С23. Она примерно на 550 страниц:

Modern C: Covers the C23 standard, 3rd Edition / Современный C: Соответствует стандарту C23, 3-е издание

picГод издания: 2025
Автор: Gustedt Jens / Густедт Йенс

Издательство: Manning Publications Co.
ISBN: 978-1-6334-3777-7
Язык: Английский

Формат: PDF/EPUB
Качество: Издательский макет или текст (eBook)
Интерактивное оглавление: Да
Количество страниц: 548

Откройте для себя всю мощь современного программирования на C, ознакомившись с новым стандартом C23 изнутри.
Для программ, которые должны быть компактными, быстрыми и надежными, C является золотым стандартом. Независимо от того, пишете ли вы встраиваемый код, низкоуровневые системные процедуры или высокопроизводительные приложения, C - это то, что вам нужно. Эта уникальная книга Йенса Густедта, члена комитета по стандартам ISO C, поможет вам быстрее освоить C23.
В третьем издании Modern C вы сможете:
Изучите основы языка Си, основные функции и продвинутые концепции
Используйте основные улучшения C23 для повышения безопасности, надежности и производительности
Пишите переносимый код, который запускается в любом месте
Создавайте многопоточные приложения с использованием атомарности и синхронизации
Создавайте надежное и гибкое программное обеспечение с обработкой ошибок
Используйте типовое программирование для повторного использования кода
В третьем издании Modern C вы научитесь использовать весь потенциал C, используя новейшие инструменты и методы. После краткого обзора основных принципов, подходящих для программистов, которые давно не использовали C, эта книга поможет вам освоить C23, новейший стандарт ISO.
От кода, выполняемого на самых маленьких встраиваемых устройствах, до низкоуровневых библиотек, используемых в популярных языках программирования, таких как Python и Ruby, мир программного обеспечения зависит от C. И даже спустя 50 лет он продолжает совершенствоваться! Новый стандарт C23 повышает безопасность, надежность и производительность. В этом тщательно переработанном новом издании автор Йенс Густедт дает вам авторитетный взгляд изнутри.
Modern C, Третье издание - это краткое введение в язык Си, в котором особое внимание уделяется его наиболее современным возможностям. Оно начинается с краткого обзора структуры, грамматики и исполнения, а затем быстро переходит к структурам управления, типам данных, операторам и другим основным функциям языка. В этом дополненном третьем издании, полностью переработанном для C23, рассматриваются составные выражения и лямбда-выражения, новые идеи о приближении сбоя программы и о том, как плавно перейти на C23.
Что внутри
Все основные функции C23
Переносимый код, который запускается где угодно
Многопоточные приложения с атомарностью и синхронизацией
Используйте универсальное программирование для повторного использования кода
0
1977 / 833 / 115
Регистрация: 01.10.2012
Сообщений: 5,092
Записей в блоге: 2
18.03.2026, 15:31
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Если вам хочется начать изучать основы Си, то возьмите
Наверняка все это хорошие книги, но эффективность их чтения невысока (мягко говоря). Неверен сам подход, книг слишком много, а вот (хороших) задач/практики явно не хватает. Вот напр отличная возможность потренироваться, решения пока никто не привел
0
9949 / 2950 / 497
Регистрация: 05.10.2013
Сообщений: 8,031
Записей в блоге: 242
24.03.2026, 02:01
Андрей1926, если перейдёте к шейдерному OpenGL 3.3 в будущем, то оставляю вам пример. В прошлом сообщении 10, в котором я добавлял ортографическую матрицу, используется OpenGL 1, а в этом пример - OpenGL 3.3. Для работы с матрицами используется библиотека "cglm". Нужные библиотеки для сборки я прикрепил тоже. Вы используете Code::Block, но эта IDE не поддерживает CMake. Лучше всего скачайте MinGW 13.1 отдельно и Qt Creator отдельно от Qt по ссылке: https://github.com/qt-creator/qt-creator/releases Поставьте по пошаговой инструкции: Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE. Дальше просто запустите Qt Creator и выберите файл CMakeLists.txt из прикреплённой папки из меню Qt Creator: "File" > "Open File or Project...". Если какая-то проблема или ошибка с запуском, то пишите в текущей теме, помогу. В примере нет увеличения треугольника по клику, как у вас, но если надо добавлю без проблем или объясню, как добавить.



main.c

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
#include <cglm/cglm.h>
#include <glad/glad.h>
#include <stdbool.h>
#include <windows.h>
 
const char *vertexShaderSource =
    "#version 330 core\n"
    "layout (location = 0) in vec3 aPosition;\n"
    "uniform mat4 mvp;\n"
    "void main()\n"
    "{\n"
    "   gl_Position = mvp * vec4(aPosition, 1.0);\n"
    "}\n";
 
const char *fragmentShaderSource =
    "#version 330 core\n"
    "out vec4 fragColor;\n"
    "void main()\n"
    "{\n"
    "   fragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n"
    "}\n";
 
HWND g_hWnd = NULL;
HDC g_hDC = NULL;
HGLRC g_hRC = NULL;
bool g_running = true;
 
typedef BOOL(WINAPI *PFNWGLSWAPINTERVALEXTPROC)(int interval);
 
LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
        case WM_CLOSE:
        case WM_DESTROY:
            g_running = false;
            PostQuitMessage(0);
            return 0;
        case WM_SIZE:
            if (g_hRC != NULL)
            {
                glViewport(0, 0, LOWORD(lParam), HIWORD(lParam));
            }
            return 0;
    }
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    WNDCLASS wc = { 0 };
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.lpszClassName = "Sample Window Class";
    wc.style = CS_OWNDC;
    RegisterClass(&wc);
 
    g_hWnd = CreateWindowEx(0, wc.lpszClassName, "OpenGL 3.3, WinAPI, C",
        WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX,
        CW_USEDEFAULT, CW_USEDEFAULT, 350, 350,
        NULL, NULL, hInstance, NULL);
 
    ShowWindow(g_hWnd, nShowCmd); 
    UpdateWindow(g_hWnd);
 
    g_hDC = GetDC(g_hWnd);
    PIXELFORMATDESCRIPTOR pfd = { sizeof(pfd), 1, PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, PFD_TYPE_RGBA, 32 };
    SetPixelFormat(g_hDC, ChoosePixelFormat(g_hDC, &pfd), &pfd);
 
    g_hRC = wglCreateContext(g_hDC);
    wglMakeCurrent(g_hDC, g_hRC);
 
    if (!gladLoadGL())
        return -1;
 
    // Compile vertex shader
    unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);
    glCompileShader(vertexShader);
 
    // Compile fragment shader
    unsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);
    glCompileShader(fragmentShader);
 
    // Link shader program
    unsigned int shaderProgram = glCreateProgram();
    glAttachShader(shaderProgram, vertexShader);
    glAttachShader(shaderProgram, fragmentShader);
    glLinkProgram(shaderProgram);
    glDeleteShader(vertexShader);
    glDeleteShader(fragmentShader);
 
    // Setup triangle data
    float vertices[] = {
        -0.5f, -0.5f, 0.0f,
        0.5f, -0.5f, 0.0f,
        0.0f, 0.5f, 0.0f
    };
 
    unsigned int VBO, VAO;
    glGenVertexArrays(1, &VAO);
    glGenBuffers(1, &VBO);
 
    glBindVertexArray(VAO);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void *)0);
    glEnableVertexAttribArray(0);
 
    int mvpLoc = glGetUniformLocation(shaderProgram, "mvp");
 
    glClearColor(50.f / 255.f, 50.f / 255.f, 50.f / 255.f, 1.f);
 
    // Get the function from the driver
    PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT =
        (PFNWGLSWAPINTERVALEXTPROC)wglGetProcAddress("wglSwapIntervalEXT");
 
    // Enable VSync (1 = On, 0 = Off)
    if (wglSwapIntervalEXT)
    {
        wglSwapIntervalEXT(1);
    }
 
    float rotation = 0.0f;
 
    // Setup a timer
    LARGE_INTEGER frequency, lastTime, currentTime;
    QueryPerformanceFrequency(&frequency);
    QueryPerformanceCounter(&lastTime);
 
    MSG msg = { 0 };
    while (g_running)
    {
        while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
 
        glClear(GL_COLOR_BUFFER_BIT);
        glUseProgram(shaderProgram);
 
        QueryPerformanceCounter(&currentTime);
        float deltaTime = (float)(currentTime.QuadPart - lastTime.QuadPart) / frequency.QuadPart;
        lastTime = currentTime;
 
        // Rotate 1 radian per second
        rotation += 1.0f * deltaTime;
 
        mat4 model;
        glm_mat4_identity(model);
        glm_translate(model, (vec3) { 0.2f, 0.0f, 0.0f });
        glm_rotate(model, rotation, (vec3) { 0.0f, 0.0f, 1.0f });
        glm_scale(model, (vec3) { 1.5f, 1.5f, 1.0f });
 
        mat4 view;
        glm_mat4_identity(view);
        glm_translate(view, (vec3) { 0.0f, 0.0f, -3.0f }); // Move camera back
 
        mat4 projection;
        // Arguments: left, right, bottom, top, near, far
        glm_ortho(-2.0f, 2.0f, -2.0f, 2.0f, 0.1f, 100.f, projection);
 
        mat4 mvp;
        glm_mat4_mul(projection, view, mvp);
        glm_mat4_mul(mvp, model, mvp); // Final MVP = P * V * M
 
        // Send the final matrix to shader
        glUniformMatrix4fv(mvpLoc, 1, GL_FALSE, (float *)mvp);
 
        glBindVertexArray(VAO);
        glDrawArrays(GL_TRIANGLES, 0, 3);
 
        SwapBuffers(g_hDC);
    }
 
    glDeleteVertexArrays(1, &VAO);
    glDeleteBuffers(1, &VBO);
    glDeleteProgram(shaderProgram);
 
    wglMakeCurrent(NULL, NULL);
    wglDeleteContext(g_hRC);
    ReleaseDC(g_hWnd, g_hDC);
 
    return 0;
}
Он не совсем точно такой. Здесь отличаются координатные сетки. В сообщении 10 я настроил, чтобы координаты мышки совпадали с координатами OpenGL:

C
1
2
3
4
5
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    // glOrtho(left, right, bottom, top, near, far)
    glOrtho(0.0, 512.0, 512.0, 0.0, -1.0, 1.0);
    //      left,right, bottom,top, near, far
То есть мышка возвращает координаты клика относительно левого верхнего угла холста, а в коде выше я перенёс с помощью ортографической матрицы начало координат в верхний левый угол. При клике вам ну нужно будет переводить координаты из координат холста в координаты мира OpenGL.

А в новом примере на OpenGL и cglm я расположил начало системы координат в центре окна. Вы можете просто поменять значения на [0, 512]:

C
1
2
3
        mat4 projection;
        // Arguments: left, right, bottom, top, near, far
        glm_ortho(-2.0f, 2.0f, -2.0f, 2.0f, 0.1f, 100.f, projection);
Тогда треугольник будет маленького размера. Вы его увеличьте в этой строке:

C
1
        glm_scale(model, (vec3) { 1.5f, 1.5f, 1.0f });
Миниатюра
Вложения
Тип файла: zip transformed-triangle-opengl33-winapi-c.zip (3.8 Кб, 4 просмотров)
Тип файла: zip glad-0.1.36.zip (69.0 Кб, 2 просмотров)
Тип файла: zip cglm-0.9.6.zip (881.7 Кб, 2 просмотров)
0
Отпрыск ChatGPT
 Аватар для Azawa
266 / 31 / 4
Регистрация: 18.06.2019
Сообщений: 155
29.03.2026, 22:00
Цитата Сообщение от 8Observer8 Посмотреть сообщение
C++
1
2
3
4
case WM_CLOSE:
        case WM_DESTROY:
            g_running = false;
            PostQuitMessage(0);
Вот это фигня на самом деле. Пропущенный далее в DefWindowProc WM_CLOSE заставит user32 уважительно прислать WM_DESTROY, а вы этим fall-through этого не даёте и PostQuitMessage(0) вызывается на WM_CLOSE, и когда ОС хочет прислать окну WM_DESTROY мы вышли уже из цикла PeekMessage и перестаём обрабатывать очередь сообщений. И окно не задестроено и сообщения всё ещё копятся в очереди...
1
9949 / 2950 / 497
Регистрация: 05.10.2013
Сообщений: 8,031
Записей в блоге: 242
30.03.2026, 00:24
Огромное спасибо за подробное объяснение! Я сам WM_CLOSE никогда не писал, а код у ТС взял, чтобы дополнить. Теперь разобрался. В данном случае, WM_CLOSE лучше удалить, тогда будет сначала вызываться DefWindowProc (default case) для WM_CLOSE. А в этом случае DefWindowProc() вызовет для WM_CLOSE функцию DestroyWindow()

WM_CLOSE message
By default, the DefWindowProc function calls the DestroyWindow function to destroy the window.
Вызов DestroyWindow() пошлёт событие WM_DESTROY. А WM_CLOSE нужен, чтобы, например, спросить пользователя: "Точно ли вы хотите закрыть окно?", если точно, то нужно вызвать DestroyWindow() при обработке WM_CLOSE:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
LRESULT CALLBACK WindowProc(
    __in HWND hWindow,
    __in UINT uMsg,
    __in WPARAM wParam,
    __in LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_CLOSE:
        // Do something here
        DestroyWindow(hWindow);
        return 0;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    default:
        return DefWindowProc(hWindow, uMsg, wParam, lParam);
    }
 
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.03.2026, 00:24

Клик мыши
Доброго времени суток. Помогите дойти до истины. Полазив по некоторым ресурсам, по раздумав сам я...

Клик мыши в координатах
Всем Привет, необходимо программно кликнуть допустим по координате (X;Y). Как это реализовать....

Реализовать движение мыши по какой-нибудь траектории, и в конце ее - клик левой кнопкой
Здравствуйте. Подскажите как реализовать движение мыши по какой-нибудь траектории и в конце вызвать...

Как сделать, чтобы клик мыши дублировался?
Как сделать так чтобы клик дублировался? То есть когда я нажал мышкой в координатах x,y , этот...

Клик мыши программно
Как заставить мышь кликнуть программно


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
сукцессия 15 неявная схема
anaschu 29.06.2026
Алиса Калибровка параметров симбиотической модели: технический обзор Содержание: Введение Постановка проблемы Технические аспекты реализации Процесс внедрения изменений
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии Введение Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np class PlantAgent: def __init__(self, name, strategy, initial_biomass): self. name = name self. strategy = strategy # "greedy" (широколиственные) или. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru