LINUX.ORG.RU

Избранные сообщения LamerOk

Качество книжек по Rust

Форум — Development

Решил посмотреть что есть на русском языке по Rust для старта, и каково качество оригинала и перевода. Нашел книжку https://doc.rust-lang.ru/book/, решил посмотреть, хватит ли моих утомленных мозгов чтобы осилить введение в язык. Споткнулся в самом начале на элементарном примере:

io::stdin().read_line(&mut guess)
Вот что там написано:

Главная задача read_line — принять все, что пользователь вводит в стандартный ввод, и сложить это в строку (не переписывая её содержимое), поэтому мы передаём эту строку в качестве аргумента. Строковый аргумент должен быть изменяемым, чтобы метод мог изменить содержимое строки.

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

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

Далее:

одним из главных преимуществ Rust является безопасность и простота использования ссылок. Чтобы дописать эту программу, вам не понадобится знать много таких подробностей. Пока вам достаточно знать, что ссылки, как и переменные, по умолчанию неизменяемы. Соответственно, чтобы сделать её изменяемой, нужно написать &mut guess, а не &guess. (В главе 4 ссылки будут описаны более подробно)

Что значит, что по умолчанию ссылки неизменяемы? Ведь мне только это достаточно знать. Неизменяем «адрес», хранимый в ссылке, или неизменяемы данные, на которые указывает ссылка? Что делает синтаксис «&mut guess» ? Он дает меняться «адресу», чтобы ссылка могла указываеть на другую область памяти, или дает меняться данным, на которые указывает ссылка? Почему, блин, с самого начала людей оставляют в неизвестности, не объясняя что конкретно происходит? Концепция владения в гл. 4 тут вообще не при чем.

Почему я пишу слово «адрес» в кавычках? Потому что я не смог понять, что такое ссылка. Поэтому я не понимаю механизм работы ссылки:

  • Ссылка Rust хранит адрес в памяти, где хранятся данные?
  • Ссылка Rust хранит адрес в памяти, где находится внутреннее описание переменной, на которую указывает ссылка? Через которое уже будет доступ к памяти, где хранятся данные?
  • Ссылка Rust вообще не хранит адрес в памяти, а хранит некий номер/дескриптор из какой-то таблицы доступных переменных, по которой получается адрес в памяти? Но тогда это адрес чего - самих данных или внутреннего описания переменной, по которой доступен адрес самих данных?
  • Может быть, конструкция вообще другая?

 

Xintrea
()

Новое издание первого тома книги «Программирование: введение в профессию» А. В. Столярова

Новости — Документация
Группа Документация

Вчера, 14 января 2025 года на сайте автора был опубликован первый том нового издания известной книги «Программирование: введение в профессию» за авторством Андрея Викторовича Столярова, известного на данном портале как @Croco.

Новое издание является исключительно электронным и имеет номер 2,9, а не 3. Номер 3 получит полноценное типографское издание на бумаге, если оно состоится.

>>> Подробности

 , , , ,

Zeev
()

Столяров все-таки закостеневший и самовлюбленный

Форум — Talks

Уже пару недель как темы про него заглохли, надо новую начать =)

liksys, как ты и говорил, реально Croco остался в мире программирования 90-х, в лучшем случае начала нулевых. Я как-то раньше не особо это замечал, но сейчас почитал его гостевуху, это же lol и facepalm

http://www.stolyarov.info/guestbook/archive/10/#cmt751

Ему написали, что может зло в Web не в жабоскрипте, а в злоупотреблении им и новомодными технологиями и привели в пример сервис, в котором по какой-то БД делается какой-то особый поиск по картинкам с выделением существенной части картинка на сайте прямоугольником.

В ответ «вон с моего сайта, мразь. А лучше сдохни. Или хотя бы найди себе такую профессию, где не будешь ежедневно вредить людям.» с пояснением:

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

И еще кучка подражателей затявкали в тон гуру.

Это мдец какой-то. Вот он реально похоже не видит разницы между пассивным или относительно пассивным (форумы) доступом к информации и активной работы (что-то там выделять на картинке) на сервере и не понимает, что трудозатраты программиста и гимор юзера в разы больше в случае какой-то спецподелки для подобной работы, вместо один раз сделанного Web-решения?

А сервисы для совместной и/или удаленной работы типа гугл-коллаба, гугл-доков, онлайн-редакторы для LaTex (overleaf) и прочей научной работы и тд и тп, молчу уже про гитхаб с копилотом - все это не имеет права на существование? Все это «вебанутая плесень»? Ну чудак на букву «м».

Притом, если бы он аргументировал, что это мол хорошо, но приводит к огромным проблемам, что может лишать юзеров свободы, привязывая всех в итоге к SaaS и подобное, можно было бы еще уважать такое мнение. Я даже с этой стороны с ним мог бы и согласиться. Но он же тупо не понимает похоже. И видит только «плесень» и ахинею в которую превратились браузеры.

 , ,

praseodim
()

Xorg всё

Форум — Talks

xorg-x11-server is removed from RHEL 10

So Long, and Thanks for All the Fish

 ,

vbr
()

Почему выбирают XML для написания книг?

Форум — Talks

Помню, давно читал книгу «PHP5 в подлиннике» Дмитрия Котерова в которой он упомянул, что писал книгу на XML. Я тогда удивился, но особого значения не придал. Сейчас читаю книгу «Практическое использование Vim» в которой автор Дрю Нейл также упомянул, что писал книгу на XML.

Подскажите, почему программисты выбирают XML для написания книг, а не, например, Latex?

Перемещено hobbit из general

 , ,

Gnom7
()

Fish shell переписан с C++ на Rust

Форум — Talks

https://fishshell.com/blog/new-in-40

Разработчики фиша упоролись, и переписали весь шелл с плюсов на раст, на это ушло больше двух лет.

В качестве причин указывается следующее:

  • Никто не любит С++ и Cmake
  • C++ становится легаси языком, искать контрибьюторов на нем сложнее, у Раст активное комьюнити
  • Удобней работать с многопоточкой
  • И вообще надо быть модным и актуальным

 , ,

Fizzika
()

Ремаппинг кнопок под Wayland

Форум — General

Привет, ЛОР!

Я хочу одну странную фичу: чтобы при однократном нажатии на Shift без других клавиш генерировалась левая или правая скобка для левого или правого шифта соответственно. Под иксами это делается простым запуском xcape -e 'Shift_L=parenleft;Shift_R=parenright'.

Пробовал через evremap, но он не позволяет отправить именно скобку на ввод. Только комбинацию, например, SHIFT+0, но её результат уже будет зависеть от раскладки.

Что посоветуешь?

UPD:

Анон подсказал рецепт с keyd.

 , ,

hateyoufeel
()

Как оставить в выходном файле неиспользуемую явно функцию?

Форум — Development

Если линкеру задать опции --gc-sections, а компилятору -ffunction-sections, из выходного файла будут выкинуты функции, к которым нет явного обращения. Размер выходного файла заметно уменьшится, это хорошо. А плохо то, что в прошивке присутствует одна функция, не используемая явно, но сильно нужная, которую линкер радостно и выкидывает.

Вопрос: как объяснить линкеру, что выкидывать можно всё, кроме вот этой вот функции? Линкер и компилятор — из набора GCC.

 , ,

one_more_hokum
()

А насколько можно «обезжирить» программу на C++?

Форум — Development

Предположим, есть у меня исходники программы на С++. Если я перепишу ее так, чтобы не зависеть от стандартной библиотеки, насколько это может сэкономить размер исполняемого файла?

Раньше так особо не делал, или писал как есть на плюсах или сразу на С.

 

LongLiveUbuntu
()

Groonga 14.1.3

Новости — Open Source
Groonga 14.1.3
Группа Open Source

29 января, после месяца разработки, состоялся выпуск 14.1.3 полнотекстовой поисковой системы и столбцовой системы управления базами данных Groonga, написанной на языках C и C++, и распространяемой по лицензии GNU LGPL 2.1 или более поздней.

Проектом предоставляется библиотека и консольные утилиты.
Из связанных проектов стоит отметить Mroonga и PGroonga – интеграции Groonga в MySQL и PostgreSQL соответственно.

( читать дальше... )

>>> Список изменений на groonga.org

 , , , ,

dataman
()

STC 5.0

Новости — Разработка
STC 5.0
Группа Разработка

После почти двух лет разработки состоялся выпуск 5.0 библиотеки STC (header-only), написанной на языке C (стандарт C11) и распространяемой по лицензии MIT.
Библиотека предоставляет большой набор структур данных и алгоритмов, основанных на макросах C и свою реализацию регулярных выражений и форматированного вывода.

( читать дальше... )

>>> Список изменений версии 5.0 на GitHub

 , , , ,

dataman
()

termbox2 2.5.0

Новости — Разработка
termbox2 2.5.0
Группа Разработка

28 декабря, после более чем двухлетнего перерыва, состоялся выпуск 2.5.0 библиотеки для создания TUI termbox2, написанной на языке C и распространяемой по лицензии MIT.

( читать дальше... )

>>> Исходный код версии 2.5.0 на GitHub

 , , ,

dataman
()

webassembly - пара теоретических вопросов.

Форум — Development

Заранее прошу простить, но конкретный исходник по вопросу к посту подготовить не успеваю, но в конце пара ссылок на суть дела от других производителей…

Пытался сделать максимально компактную .wasm хрень на C с помощью emcc, задача которой просто байтики молотить - картинку обработать. Исходник оставил на другом компе, но дело не столько в нём, сколько в понимании модели памяти вебасма. Сделать-то компактно ополучилось: ноль инклудов, пара функций, пара глобальных переменных, экспорт всего наружу, всего 50 строк, ~400 байт на выходе.

Компилируется, в JS инициализируется, как надо не работает, но и не падает.

Вопросы:

  1. А правда, что wasm-инстанс (ну, «запущенная wasm программа») имеет модель памяти вида «плоский шмат» и любой указатель - это оффсет в этом шмате? То есть, если я хочу выделить память без планов её освобождать, я могу просто отступить куда-нибудь вперёд килобайт на 100 (при наличии Memory достаточного размера) и спокойно туда записывать? То есть, правда ли то, что в wasm-инстансе нет ничего подобного вызовам mmap/brk в линуксе, когда тебе могут надавать вообще разных адресов? В wasm у тебя только один шмат, просто можно как-то нарастить размер.

  2. А во что превратится глобальный static int[1024 * 1024]; написанный в сишном коде в webassembly? А можно я буду выделять себе свой единственно нужный буфер именно так? Пробовал взять на него указатель - дают некое число небольшое число типа 1050 - ну типа прямо как offset в пункте (1). Попробовал туда записывать - причём циклом по всему массиву - нормально, ничего не упало.

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

Про исходник: в принципе все технические детали сп***ны отсюда: https://github.com/quin2/fast-paint

На что обратить внимание:

  1. Шмат памяти, в котором вся сишная часть этого проекта ковыряется, была «выделена» вот тут: https://github.com/quin2/fast-paint/blob/main/buffer.c#L63 - но, как мы знаем, в webassembly модель памяти - просто один шмат, поэтому этот malloc был скомпилён скорее всего в итоге во что-то, что вернуло uint32 с оффсетом на память.

  2. Далее со значением этого указателя screen имеют дело уже вот тут https://github.com/quin2/fast-paint/blob/main/script.js#L35 в виде обычного числа.

  3. Ну и основной цимес: как чуваки апдейтят canvas context: https://github.com/quin2/fast-paint/blob/main/script.js#L421 - вот просто хоба и скопировали прямо из буфера, в который инстанцировали webassembly с оффсетом pointer шмат памяти и закинули на ctx. Тащемта всё! В этой простоте и вся трагедия - попытка это повторить БЕЗ ВЫЗОВА malloc в сишной части, а просто отступив сколько-то памяти - это какой-то провал и непонятно почему, хоть и незаконно.

 

lesopilorama
()

Qlibs++ — header-only библиотеки для C++20

Форум — Development

Kris Jusiak создал проект Qlibs++ с header-only библиотеками для С++20, без сторонних зависимостей. Часть из них – облегчённые версии библиотек из boost-ext.

На данный момент есть:

Приятного чтения! :)

Дополнение от 26.11.2024: Автор создал ещё два репозитория, пока пустые:

https://github.com/qlibs/uefi – C++ UEFI library.

 , ,

dataman
()

Наглухо зависает xserver

Форум — Desktop

Проблема проявляется в основном при большом количестве активных процессов, когда загрузка памяти и ЦП близка к 100. Но иногда система по непонятных причинам начинает тормозить и заканчивается все тем же. Сначала система перестает реагировать на все нажатия клавиш и щелчки мыши (хотя управление курсором еще доступно), затем зависает курсор и все процессы (к примеру, перестает играть музыка из clementine). Наиболее часто у меня эта проблема возникает при просмотре роликов на ютуб.

При таких зависаниях не помогает ничего. Комбинации Ctrl+Alt+F1-F7 не работают в том случае, если уже зависла и мышь. Если мышь еще реагирует, то остается возможность сменить tty и сделать killall xorg. В других же случаях только удержание кнопки питания, чтобы потушить систему.

В логах ничего криминального не нашел.

По системе: ноут Asus X540NV, дистрибутив Debian 12+xfce4. Ядро 6.1.0-25-amd64. Версия Xorg 1.7.7. Также в ноуте два видеоадаптера, встроенный от Intel (HD Graphics 505) и дискретка (Geforce 920MX). Дискретка не используется, только интегрированная графика. Никаких проприетарных драйверов не стоит.

Кто-нибудь сталкивался с подобной проблемой? В чем может быть причина?

Уточню, что пробовал ставить до этого ubuntu и manjaro еще с 5 ядром и ситуация там была такая же, что собственно и послужило в то время возвратом к винде, ибо решения этой проблемы я тогда так и не нашел. Грешил тогда на ядро, но в 6 все также печально.

 , , ,

zhel_1
()

Контекстно-зависимость в синтаксисе ЯП

Форум — Development

Вот такой чисто теоретический вопрос, навеянный топиком Странная ошибка c шаблоном (или я идиот, или одно из двух)

В C++ одна из особенностей, делающих грамматику контекстно-зависимой — это неоднозначность парсинга выражения

foo<a>(b);

То ли это шаблонная функция foo<a>, вызываемая с аргументом b.

То ли это выражение (foo < a) > b.

Чтобы это понять, компилятор должен иметь доступ к декларации foo.

Как бы вы сделали эту часть грамматики контекстно-свободной, если бы дизайнили ЯП с нуля? Ваши идеи?

 ,

wandrien
()

SDL3 - Камера - Заметка

Форум — Development

Короче захотел сделать фотку через SDL3 столкнулся с парой проблем.

Пишу просто по причине того что я долго ломал голову что не так, откуда ошибка, пока не втыкнул паузу, почему вместо снимка чернота, пока не пропустил несколько первых кадров. Для меня это было нифига не очевидно, может кому сэкономит время.

  1. Появляется ошибка Parameter 'surface' is invalid если не сделать паузу после открытия камеры, решается в установлении паузы в 0,5 секунды после SDL_OpenCamera

  2. Первые кадры с камеры либо просто чёрные, либо очень тёмные. Решается пропуском (в моём случае 7) нескольких первых кадров.

Я забросил в SDL3 уведомительное issue, чтобы было

Продублирую тут тестовый пример и результаты

Информация о системе

Web-camera встроена в ноут, понятия не имею что за камера
description: Notebook
    product: K53U
    vendor: ASUSTeK Computer Inc.
    version: 1.0
Distributor ID:	Debian
Description:	Debian GNU/Linux 12 (bookworm)
Release:	12
Codename:	bookworm
fedor@nixfed:~/drawshoot$ cat SDL3/VERSION.txt 
3.1.3
fedor@nixfed:~/drawshoot$

Тестовый код

Makefile

SDL_DIR=SDL3
SDL_LIB_DIR=$(SDL_DIR)/build
SDL_INC_DIR=$(SDL_DIR)/include

test-1:
	$(CC) main.c -I$(SDL_INC_DIR) -L$(SDL_LIB_DIR) -lSDL3 -o app

test-2:
	$(CC) main.c -I$(SDL_INC_DIR) -L$(SDL_LIB_DIR) -lSDL3 -o app -DENABLE_DELAY

test-3:
	$(CC) main.c -I$(SDL_INC_DIR) -L$(SDL_LIB_DIR) -lSDL3 -o app -DENABLE_DELAY -DENABLE_FRAMEDROP


sdl:
	cd $(SDL_DIR) && mkdir build
	cd  $(SDL_DIR)/build && cmake ..
	cd  $(SDL_DIR)/build && $(MAKE) -j2

clean:
	-$(MAKE) -C $(SDL_DIR) clean
	-rm app

run:
	LD_LIBRARY_PATH=$(SDL_DIR)/build ./app

main.c

#include "SDL3/SDL.h"
#include "SDL3/SDL_camera.h"
#include <stdio.h>

/*just for debug*/
const char * pixel_format_name(SDL_PixelFormat format)
{
    switch(format){
    case SDL_PIXELFORMAT_UNKNOWN:    return      "UNKNOWN";
    case SDL_PIXELFORMAT_INDEX1LSB:  return      "INDEX1LSB";
    case SDL_PIXELFORMAT_INDEX1MSB:  return      "INDEX1MSB";
    case SDL_PIXELFORMAT_INDEX2LSB:  return      "INDEX2LSB";
    case SDL_PIXELFORMAT_INDEX2MSB:  return      "INDEX2MSB";
    case SDL_PIXELFORMAT_INDEX4LSB:  return      "INDEX4LSB";
    case SDL_PIXELFORMAT_INDEX4MSB:  return      "INDEX4MSB";
    case SDL_PIXELFORMAT_INDEX8:     return      "INDEX8";
    case SDL_PIXELFORMAT_RGB332:     return      "RGB332";
    case SDL_PIXELFORMAT_XRGB4444:   return      "XRGB4444";
    case SDL_PIXELFORMAT_XBGR4444:   return      "XBGR4444";
    case SDL_PIXELFORMAT_XRGB1555:   return      "XXRGB1555";
    case SDL_PIXELFORMAT_XBGR1555:   return      "XXBGR1555";
    case SDL_PIXELFORMAT_ARGB4444:   return      "XARGB4444";
    case SDL_PIXELFORMAT_RGBA4444:   return      "XRGBA4444";
    case SDL_PIXELFORMAT_ABGR4444:   return      "XABGR4444";
    case SDL_PIXELFORMAT_BGRA4444:   return      "XBGRA4444";
    case SDL_PIXELFORMAT_ARGB1555:   return      "XARGB1555";
    case SDL_PIXELFORMAT_RGBA5551:   return      "XRGBA5551";
    case SDL_PIXELFORMAT_ABGR1555:   return      "XABGR1555";
    case SDL_PIXELFORMAT_BGRA5551:   return      "XBGRA5551";
    case SDL_PIXELFORMAT_RGB565:     return      "XRGB565";
    case SDL_PIXELFORMAT_BGR565:     return      "XBGR565";
    case SDL_PIXELFORMAT_RGB24:      return      "XRGB24";
    case SDL_PIXELFORMAT_BGR24:      return      "XBGR24";
    case SDL_PIXELFORMAT_XRGB8888:   return      "XXRGB8888";
    case SDL_PIXELFORMAT_RGBX8888:   return      "XRGBX8888";
    case SDL_PIXELFORMAT_XBGR8888:   return      "XXBGR8888";
    case SDL_PIXELFORMAT_BGRX8888:   return      "XBGRX8888";
    case SDL_PIXELFORMAT_ARGB8888:   return      "XARGB8888";
    case SDL_PIXELFORMAT_RGBA8888:   return      "XRGBA8888";
    case SDL_PIXELFORMAT_ABGR8888:   return      "XABGR8888";
    case SDL_PIXELFORMAT_BGRA8888:   return      "XBGRA8888";
    case SDL_PIXELFORMAT_XRGB2101010:   return   "XXRGB2101010";
    case SDL_PIXELFORMAT_XBGR2101010:   return   "XXBGR2101010";
    case SDL_PIXELFORMAT_ARGB2101010:   return   "XARGB2101010";
    case SDL_PIXELFORMAT_ABGR2101010:   return   "XABGR2101010";
    case SDL_PIXELFORMAT_RGB48:         return   "XRGB48";
    case SDL_PIXELFORMAT_BGR48:         return   "XBGR48";
    case SDL_PIXELFORMAT_RGBA64:        return   "XRGBA64";
    case SDL_PIXELFORMAT_ARGB64:        return   "XARGB64";
    case SDL_PIXELFORMAT_BGRA64:        return   "XBGRA64";
    case SDL_PIXELFORMAT_ABGR64:        return   "XABGR64";
    case SDL_PIXELFORMAT_RGB48_FLOAT:   return   "XRGB48_FLOAT";
    case SDL_PIXELFORMAT_BGR48_FLOAT:   return   "XBGR48_FLOAT";
    case SDL_PIXELFORMAT_RGBA64_FLOAT:  return   "XRGBA64_FLOAT";
    case SDL_PIXELFORMAT_ARGB64_FLOAT:  return   "XARGB64_FLOAT";
    case SDL_PIXELFORMAT_BGRA64_FLOAT:  return   "XBGRA64_FLOAT";
    case SDL_PIXELFORMAT_ABGR64_FLOAT:  return   "XABGR64_FLOAT";
    case SDL_PIXELFORMAT_RGB96_FLOAT:   return   "XRGB96_FLOAT";
    case SDL_PIXELFORMAT_BGR96_FLOAT:   return   "XBGR96_FLOAT";
    case SDL_PIXELFORMAT_RGBA128_FLOAT: return   "XRGBA128_FLOAT";
    case SDL_PIXELFORMAT_ARGB128_FLOAT: return   "XARGB128_FLOAT";
    case SDL_PIXELFORMAT_BGRA128_FLOAT: return   "XBGRA128_FLOAT";
    case SDL_PIXELFORMAT_ABGR128_FLOAT: return   "XABGR128_FLOAT";
    case SDL_PIXELFORMAT_YV12:          return   "XYV12";
    case SDL_PIXELFORMAT_IYUV:          return   "XIYUV";
    case SDL_PIXELFORMAT_YUY2:          return   "XYUY2";
    case SDL_PIXELFORMAT_UYVY:          return   "XUYVY";
    case SDL_PIXELFORMAT_YVYU:          return   "XYVYU";
    case SDL_PIXELFORMAT_NV12:          return   "XNV12";
    case SDL_PIXELFORMAT_NV21:          return   "XNV21";
    case SDL_PIXELFORMAT_P010:          return   "XP010";
    case SDL_PIXELFORMAT_EXTERNAL_OES:  return   "XEXTERNAL_OES";
    }
    return "UNKNOWN";
}

int main(int argc, char *argv[])
{
    SDL_InitSubSystem(SDL_INIT_CAMERA);
    int camera_count = 0;
    SDL_CameraID * camera_id = SDL_GetCameras(&camera_count);
    printf("count=%d id=%u %s\n",camera_count,camera_id,SDL_GetError());
    SDL_CameraSpec ** camera_spec;
    int camera_specs = 0;
    camera_spec = SDL_GetCameraSupportedFormats(*camera_id,&camera_specs);
    /*show supported formats and resolutions*/
    for(int i=0; i != camera_specs;i++)
    {
        printf("camera=%-2i "
               "w=%-4d h=%-4d "
               "format=%-14s "
               "frame_n=%-3d "
               "frame_d=%d\n",
               i,
               camera_spec[i]->width,
               camera_spec[i]->height,
               pixel_format_name(camera_spec[i]->format),
               camera_spec[i]->framerate_numerator,
               camera_spec[i]->framerate_denominator);
    }
    /*init camera*/
    SDL_Camera * cam =  SDL_OpenCamera(*camera_id, camera_spec[0]);

    #ifdef ENABLE_DELAY
        SDL_Delay(5000);
    #endif

    printf("[1] %s\n",SDL_GetError());
    SDL_Surface * frame;
    Uint64 t=0;
    SDL_Surface * s;
    SDL_Event event;
    while ( SDL_WaitEvent(&event) >= 0 )
    {
       if(event.type == SDL_EVENT_CAMERA_DEVICE_APPROVED)
       {
            printf("DEVICE_APPROVED!\n");
            break;
       };
       if(event.type == SDL_EVENT_CAMERA_DEVICE_DENIED)
       {
            printf("DEVICE_DENIED!\n");
            return 0;
       };
    }

    #ifdef ENABLE_FRAMEDROP
    for(int i=0;i<7;i++)
    {
        frame = SDL_AcquireCameraFrame(cam, &t);
        SDL_ReleaseCameraFrame(cam, frame);
    }
    #endif

    /*take photo*/
    frame = SDL_AcquireCameraFrame(cam, &t);
    printf("[2] %lu %s\n",t,SDL_GetError());
    /*convert photo*/
    s = SDL_ConvertSurface(frame, SDL_PIXELFORMAT_RGB24);
    /*save result*/
    SDL_SaveBMP(s,"out.bmp");
    printf("[4] %lu %s\n",t,SDL_GetError());
    /*release memory*/
    SDL_ReleaseCameraFrame(cam, frame);
    printf("[4] %lu %s\n",t,SDL_GetError());
    SDL_Quit();
    return 0;
}

Результаты

  • Ошибка Invalid surface
fedor@nixfed:~/drawshoot$ make test-1 run
cc main.c -ISDL3/include -LSDL3/build -lSDL3 -o app
LD_LIBRARY_PATH=SDL3/build ./app
count=1 id=845253408 
camera=0  w=640  h=480  format=XYUY2          frame_n=30  frame_d=1
camera=1  w=640  h=480  format=XYUY2          frame_n=25  frame_d=1
camera=2  w=640  h=480  format=XYUY2          frame_n=20  frame_d=1
camera=3  w=352  h=288  format=XYUY2          frame_n=30  frame_d=1
camera=4  w=352  h=288  format=XYUY2          frame_n=25  frame_d=1
camera=5  w=352  h=288  format=XYUY2          frame_n=20  frame_d=1
camera=6  w=320  h=240  format=XYUY2          frame_n=30  frame_d=1
camera=7  w=320  h=240  format=XYUY2          frame_n=25  frame_d=1
camera=8  w=320  h=240  format=XYUY2          frame_n=20  frame_d=1
camera=9  w=176  h=144  format=XYUY2          frame_n=30  frame_d=1
camera=10 w=176  h=144  format=XYUY2          frame_n=25  frame_d=1
camera=11 w=176  h=144  format=XYUY2          frame_n=20  frame_d=1
camera=12 w=160  h=120  format=XYUY2          frame_n=30  frame_d=1
camera=13 w=160  h=120  format=XYUY2          frame_n=25  frame_d=1
camera=14 w=160  h=120  format=XYUY2          frame_n=20  frame_d=1
[1] 
DEVICE_APPROVED!
[2] 0 
[4] 0 Parameter 'surface' is invalid
[4] 0 Parameter 'surface' is invalid
fedor@nixfed:~/drawshoot$ 

  • Чёрный снимок вместо нормального
fedor@nixfed:~/drawshoot$ make test-2 run
cc main.c -ISDL3/include -LSDL3/build -lSDL3 -o app -DENABLE_DELAY
LD_LIBRARY_PATH=SDL3/build ./app
count=1 id=3957504800 
camera=0  w=640  h=480  format=XYUY2          frame_n=30  frame_d=1
camera=1  w=640  h=480  format=XYUY2          frame_n=25  frame_d=1
camera=2  w=640  h=480  format=XYUY2          frame_n=20  frame_d=1
camera=3  w=352  h=288  format=XYUY2          frame_n=30  frame_d=1
camera=4  w=352  h=288  format=XYUY2          frame_n=25  frame_d=1
camera=5  w=352  h=288  format=XYUY2          frame_n=20  frame_d=1
camera=6  w=320  h=240  format=XYUY2          frame_n=30  frame_d=1
camera=7  w=320  h=240  format=XYUY2          frame_n=25  frame_d=1
camera=8  w=320  h=240  format=XYUY2          frame_n=20  frame_d=1
camera=9  w=176  h=144  format=XYUY2          frame_n=30  frame_d=1
camera=10 w=176  h=144  format=XYUY2          frame_n=25  frame_d=1
camera=11 w=176  h=144  format=XYUY2          frame_n=20  frame_d=1
camera=12 w=160  h=120  format=XYUY2          frame_n=30  frame_d=1
camera=13 w=160  h=120  format=XYUY2          frame_n=25  frame_d=1
camera=14 w=160  h=120  format=XYUY2          frame_n=20  frame_d=1
[1] 
DEVICE_APPROVED!
[2] 706952397 
[4] 706952397 
[4] 706952397 
fedor@nixfed:~/drawshoot$ 
  • Всё хорошо, ошибок нет, фотография с камеры нормальная
fedor@nixfed:~/drawshoot$ make test-3 run
cc main.c -ISDL3/include -LSDL3/build -lSDL3 -o app -DENABLE_DELAY -DENABLE_FRAMEDROP
LD_LIBRARY_PATH=SDL3/build ./app
count=1 id=3940756256 
camera=0  w=640  h=480  format=XYUY2          frame_n=30  frame_d=1
camera=1  w=640  h=480  format=XYUY2          frame_n=25  frame_d=1
camera=2  w=640  h=480  format=XYUY2          frame_n=20  frame_d=1
camera=3  w=352  h=288  format=XYUY2          frame_n=30  frame_d=1
camera=4  w=352  h=288  format=XYUY2          frame_n=25  frame_d=1
camera=5  w=352  h=288  format=XYUY2          frame_n=20  frame_d=1
camera=6  w=320  h=240  format=XYUY2          frame_n=30  frame_d=1
camera=7  w=320  h=240  format=XYUY2          frame_n=25  frame_d=1
camera=8  w=320  h=240  format=XYUY2          frame_n=20  frame_d=1
camera=9  w=176  h=144  format=XYUY2          frame_n=30  frame_d=1
camera=10 w=176  h=144  format=XYUY2          frame_n=25  frame_d=1
camera=11 w=176  h=144  format=XYUY2          frame_n=20  frame_d=1
camera=12 w=160  h=120  format=XYUY2          frame_n=30  frame_d=1
camera=13 w=160  h=120  format=XYUY2          frame_n=25  frame_d=1
camera=14 w=160  h=120  format=XYUY2          frame_n=20  frame_d=1
[1] 
DEVICE_APPROVED!
[2] 1329622684 
[4] 1329622684 
[4] 1329622684 
fedor@nixfed:~/drawshoot$ 

Может быть кому пригодится, досвиданья ::)

 , , , , sdl3

LINUX-ORG-RU
()

Рисовалка диаграмм на tcl/tk?

Форум — Development

Есть у кого-нибудь? Не гуглится. Я нашёл пакет diagrams в tcl/tk, но нет примера, есть только документация. Также есть пример приложения, но я не смог его запустить (оно не принял параметры, которые у него в доке заявлены, по исходникам за 5 минут тоже не разобрался).

 , ,

den73
()

Эмулятор Android на Linux

Форум — General

Ситуация, с отсутствием нормально работающих эмуляторов Android на Linux все еще сохраняется? Есть ли сейчас более менее юзабельные варианты?

 , ,

Vishera845
()

GameScope плохо работает

Форум — Games

В стиме ставлю на игры: gamescope – %command% и игры при запуске выдают не то разрешение и мышка вообще идёт верх тормашками и не фокусируется в приложении. Я gamescope не сильно знаю ,но наверное нужна какая то длинная команда с настройками чтобы этой фигни не было. Подскажите пожалуйста что делать. Заранее спасибо!

Manjaro Linux KDE Xeon 1270 v3 gtx 1650

 

DANIL10RUS
()