LINUX.ORG.RU

Я пишу облегчённую версию SDL3, с поддержкой старых систем.

 ,


1

3

Приветствую!

Проект решил назвать SDL3Lite. Проект пишу на C++ 98, но наружу торчит совместимый С API. Я хочу реализовать базовый функционал, поэтому вполне реально довести проект до конца. Главная идея проекта это сохранить совместимость с оригинальным C API SDL3. В идеале это конечно на уровне бинарной совместимости. Код единожды написанный должен собираться без изменений для всех поддерживаемых систем.

Сейчас работает рендер на OpenGL 1.2, добавляю версию software для старых систем без поддержки аппаратного ускорения. Также планирую добавить и поддержку vulkan. В репе есть скриншоты с выводом графики.

На данный момент поддерживается windows 95 и выше, linux начиная с Debian 3.

В будущих версиях планирую добавить поддержу windows 3.1 и ms-dos.

Рад буду советам, критике и предложениям.

Ответ на: комментарий от MOPKOBKA

нет — там описывается, что в случае общей последовательности инициализации стандарт-лейаутовых-структур мемберов юниона можно использовать её для доступа даже из неактивного члена юниона (как в случае моего исправляющего примера).
в си же прямо указано в разделе

Portability issues
This annex collects some information about portability that appears in this International Standard.
J.1 Unspecified behavior
The following are unspecified:
— The value of a union member other than the last one stored into (6.2.6.1).

safocl ★★
()
Ответ на: комментарий от safocl

нет — там описывается, что в случае общей последовательности инициализации

Какой еще инициализации? Там говорится что если начинается union с одного и того же в разных вариантах, то это первое значение (type, x.type) можно использовать всегда. Такое же правило у каста между структурами A и B, когда в начале B располагается A.

в си же прямо указано в разделе

Ну так где запрет? Просто если указывать явно, то придется сказать что будет при получении int когда был активен float.

MOPKOBKA ★★★★★
()
Ответ на: комментарий от MOPKOBKA

Какой еще инициализации? Там говорится что если начинается union с одного и того же в разных вариантах, то это первое значение (type, x.type) можно использовать всегда. Такое же правило у каста между структурами A и B, когда в начале B располагается A.

ну ты что читать не можешь?

contains several standard-layout structs that share a common initial sequence
and if a non-static data member of an object of this standard-layout union type is active and is one of the standard-layout structs, the common initial sequence of any of the standard-layout struct members can be inspected

Uint32 не является `standard-layout structs`
https://eel.is/c draft/class.prop#10
https://eel.is/c draft/class.mem.general#27
https://eel.is/c draft/class.mem#general-30

safocl ★★
()
Последнее исправление: safocl (всего исправлений: 4)
Ответ на: комментарий от MOPKOBKA

Ну так где запрет? Просто если указывать явно, то придется сказать что будет при получении int когда был активен float

запрет на что? с точки зрения синтаксиса таковое валидно, — однако таковое является ubspec-beh

safocl ★★
()
Ответ на: комментарий от MOPKOBKA

Такое же правило у каста между структурами A и B, когда в начале B располагается A.

это в рамках концепции `pointer-interconvertible`
https://eel.is/c draft/basic.compound#5
но тоже только в рамках `standard-layout structs`

safocl ★★
()
Ответ на: комментарий от safocl

ну ты что читать не можешь?

С трудом. Ну вроде действительно исключительно про struct/class речь, хотя мне казалось что в C++17 это изменили для синхронизации с С, возможно это что то другое было.

MOPKOBKA ★★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 1)
Ответ на: комментарий от MOPKOBKA

а «нужное поведение» это как? каждый компилятор поддерживает таковое поведение на всех поддерживаемых платформах? — при этом я выше предоставил тривиальнейший фикс, который позволяет использовать абсолютно везде... простое невежество разрабов и ничего более (незнание стандартов).

safocl ★★
()
Ответ на: комментарий от MOPKOBKA

так в си тоже самое указано — прям почти дословно...

WG14/N1124 Committee Draft — May 6, 2005 ISO/IEC 9899:TC2
6.5.2.3 Structure and union members
Constraints
5 One special guarantee is made in order to simplify the use of unions: if a union contains several structures that share a common initial sequence (see below), and if the union object currently contains one of these structures, it is permitted to inspect the common initial part of any of them anywhere that a declaration of the complete type of the union is visible. Two structures share a common initial sequence if corresponding members have compatible types (and, for bit-fields, the same widths) for a sequence of one or more initial members.

safocl ★★
()
Последнее исправление: safocl (всего исправлений: 2)
Ответ на: комментарий от safocl

Тогда получается все в SDL правильно, потому что компиляторы выдают true для этого кода.

#include <type_traits>
#include <iostream>

struct S
{
    int A;
};

int main()
{
    std::cout 
      << std::is_pointer_interconvertible_with_class(&S::A) 
      << "\n";
}
Либо ты где то ошибаешься, и все же можно преобразовывать между указателями структуры и первым членом который является скалярным типом как uint32.

MOPKOBKA ★★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 1)
Ответ на: комментарий от safocl

Но ты же говорил что там все как в union, только если `standard-layout structs`. А если мой пример это `standard-layout structs`, то и в union это `standard-layout structs`. Или ты ошибся, и для указателей не обязательно `standard-layout structs`?

MOPKOBKA ★★★★★
()
Ответ на: комментарий от MOPKOBKA

Либо ты где то ошибаешься, и все же можно преобразовывать между указателями структуры и первым членом который является скалярным типом как uint32.

енто какая то шутка? где там преобразования между указателями один из которых на первый член структуры, а другой на саму структуру?

safocl ★★
()
Ответ на: комментарий от safocl

В моем коде нету, а ТЫ говорил что это обязательное условие. Однако компилятор говорит что все преобразуется и когда A это не структура или класс.

MOPKOBKA ★★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 2)
Ответ на: комментарий от safocl

Я пишу облегчённую версию SDL3, с поддержкой старых систем. (комментарий)

Вот, я это интерпретирую как: «Можно преобразовывать указатели по правилу `pointer-interconvertible` но только если соблюдается `standard-layout structs`, который применим и к правилам с union».

Отсюда я вывожу:

- Указатели не конвертируются если нету `standard-layout structs`, в случае с начальной последовательностью в структуре

- Можно использовать неактивные union если выполняется `standard-layout structs` в отношении type и начальная последовательность, именно из за проблемы с `standard-layout structs` ты вводишь generic

Если все верно, то мой пример доказывает что можно преобразовывать struct* и int* если int это первый элемент struct, а значит для int выполняется `standard-layout structs`, а значит он выполняется и для первого type в SDL_Event. А так как type первый с SDL_Event, то для Note1 все условия соблюдены.

MOPKOBKA ★★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 6)
Ответ на: комментарий от MOPKOBKA

объясню на палочках:
в твоём коде имеется стандарт-лейаут-структура — ты можешь взять указатель на структуру и преобразовать его через реинтерпрет_каст в указатель на первый нестатический дата-мембер.
тоже самое можешь сделать и с юнионом — указатель на него можешь скастить к любому из его членов...

safocl ★★
()
Ответ на: комментарий от MOPKOBKA

- Указатели не конвертируются если нету `standard-layout structs`, в случае с начальной последовательностью в структуре

в изначальном обсуждении нет преобразования указателей (ссылок) — там доступ к неактивному члену юниона.

- Можно использовать неактивные union если выполняется `standard-layout structs` в отношении type и начальная последовательность, именно из за проблемы с `standard-layout structs` ты вводишь generic

да.

Если все верно, то мой пример доказывает что можно преобразовывать struct* и int* если int это первый элемент struct

да.

а значит для int выполняется `standard-layout structs`, а значит он выполняется и для первого type в SDL_Event

нет — int не является структурой даже... для каста не нужно что бы само поле было стандарт-лейаут-структурой — а такое просто применимо если структура содеражащая таковое поле является стандарт-лейаут-структурой.

для не-стандарт-лейаут-структуры такой каст по принципу поинтер-интерконвертибле нельзя делать — будет уб.

safocl ★★
()
Последнее исправление: safocl (всего исправлений: 1)
Ответ на: комментарий от safocl

Понятно, в преобразовании указателя, standard-layout-struct это не про элемент структуры, а про саму структуру. Без указания читалось как требование к первому элементу структуры.

MOPKOBKA ★★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 1)
Ответ на: комментарий от MOPKOBKA

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

safocl ★★
()