LINUX.ORG.RU

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

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
()

Игры, Linux, Steam, обзоры

Форум — Games

Список 1000+ игр со ссылками на обзоры от GNU/Linux пользователей. Здесь список больше не обновляется.

Список на базе Steam с оглавлением по прежнему улучшается.

English version of the list Games, Steam, Linux, reviews.

Здесь встречаются обзоры на разных языках: [rus] — русский, [eng] — английский, [fra] — французский, [spa] — испанский, [por] — португальский, [ces] — чешский, [deu] — немецкий, [pol] — польский, [fin] — финский и [ukr] — украинский.

Должен предупредить, что в части обзоров крайне мало информации, кроме того факта, что обзор существует и автор как минимум запустил игру в среде GNU/Linux. Со временем я постараюсь улучшить эту ситуацию.

Деление на жанры довольно условно. Распространение ссылок на перечисленные здесь обзоры всячески приветствуется. «Лайкать» обзоры тоже не возбраняется.

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

 ,

Evgueni
()

Рефлексия в плюсах - обойти все поля структуры в рантайм?

Форум — Development

Хочется объявить поля в структуре/классе так, что бы потом иметь возможность обойти их в рантайм/иметь возможность обращаться по имени в рантайм. Ограничения:

  1. стандарт не свежее с++-17

  2. всякие толстые сторонние либы а-ля буст не подходят

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

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

Хочется че то такое:

struct A{
    BEGIN();  // некий макрос
    int PAR(x, 0, "число рыбов");
    std::array<double, 2> PAR(y, {0., 0.}, "координаты главрыбы");
    END();
};

но как это сделать фантазии не хватает (есть варианты, но они все ужасно костыльные).

Можно легко сделать что то вроде

struct A{
   double x = 0;
   std::array<double, 2> y = {0., 0.};
   A(){ TABLE(x, "число рыбов")(y, "координаты главрыбы"); }
};

но нарушается п.3.

Можно на худой конец сделать

struct A{
   int x = 0; ///< число рыбов
   std::array<double, 2> y = {0., 0.}; ///< координаты главрыбы
};

и перед сборкой обрабатывать это питоньей утилитой, генерить хидер с какой то оберткой и его инклюдить, но выглядит несколько радикально…

Как бы такое сделать Ъ? @annulen, @fsb4000, @monk, @bugfixer


UPD. Решил чуть подробнее расписать зачем это нужно и что должно выйти в итоге. Есть приложение (HPC) в котором есть вычислительное ядро на плюсах. В ядре есть класс Model со 100500 параметров (входных и выходных содержащих результаты расчета) которые имеют значения по умолчанию, но нужно мочь их менять через конфиги/аргументы командной строки, куда то записывать (в json) и т.д. Если забиндить ядро в питон (через SWIG) то это все делается довольно легко, но такой биндинг не всегда возможен. Хочется иметь аналогичную функциональность на чистых C++. Т.е. в C++ я изначально пишу:

class Model{
...
   double J = 1;      ///< exchange integral
   double T = 2;      ///< temperature
   double c = 0.1;    ///< concentration
   double dt = 1e-2;  ///< time step
   double t = 0;      ///< time
...
   
   void init();
   void calc();
};

Пускач в питоне

model = Model()
config(model)  # это функция из моей либы накатывающая параметры из командной строки
model.init()
while model.t<t_max: model.calc()

при запуске я могу писать что то вроде

./run.py T=4 dt=1e3

хочется мочь писать аналогичный пуска на плюсах.

Для этого необходимо и достаточно иметь в плюсах некую обертку для модели которая:

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

 ,

AntonI
()

Кто как сейчас ускоряет youtube?

Форум — General

Раньше мне помогал spoofdpi, а теперь, два дня назад, и он перестал работать. В интернете говорят, что и у goodbyedpi в этот момент проблемы возникли но их быстро решили. К сожалению, его нету под Linux. Были надежды на byeDPI но либо он тоже не справляется, либо я не могу найти подходящую команду для него. Хотя приложение ByeDPI на андроиде ещё работает. Так вот, кто какими решениями пользуется под Linux? v2ray, vpn, это всё конечно хорошо но своей VPS у меня нету, а публичные в 12 раз медленнее чем мой интернет.

Ещё примечание, я обычно предварительно скачиваю через yt-dlp а потом уже смотрю. Где-то говорили, что у кого-то youtube работает если включить протокол QUIC в браузере. Есть ли такая возможность в yt-dlp? Или может есть какая-то дополнительная программа, которая будет работать как прокси и будет трафик в QUIC превращать.

 , ,

whatiswhat
()

X11 connection rejected because of wrong authentication.

Форум — Admin

Добрый день!

Столкнулся с проблемой: При обычных условиях, Х-сервер все спокойно отрисовывает, но при создании файла sshrc в каталоге /etc/ssh/sshrc возникает ошибка из топика. Во всех конфигах ForwardX11 установлен как yes

cat ~/.ssh/config 
Host *
    ForwardX11 yes
    ForwardX11Trusted yes
ssh_config:
Include /etc/ssh/ssh_config.d/*.conf

Host *
   ForwardX11 yes
   ForwardX11Trusted yes
   SendEnv LANG LC_*
   HashKnownHosts yes
   GSSAPIAuthentication yes
sshd_config:
Include /etc/ssh/sshd_config.d/*.conf
KbdInteractiveAuthentication no
UsePAM yes
X11Forwarding yes
X11DisplayOffset 10
PrintMotd no
AcceptEnv LANG LC_*
Subsystem       sftp    /usr/lib/openssh/sftp-server
cat /etc/ssh/sshrc 
figlet -ct Wellcom !
X11 connection rejected because of wrong authentication.
Error: Can't open display: localhost:10.0

 ,

hettoko
()

Программирование SIMD библиотек на Fasm в x86-64 Linux

Форум — Development

Начал недавно проект по разработке SIMD бибилиотек для С++ на Fasm под 64-bit Linux. Интересно услышать мнение матерых программеров как о самом проекте, так и качестве кода. Вот вебсайт, где можно качнуть исходники и посмотреть документацию, которая уже есть.

Сайт проекта на sourceforge.net

 , , , ,

LinAsm
()

Запуск таркова на арч линукс

Форум — Games

Кто нибудь сталкивался с проблемой запуска таркова?

Хочу поставить пиратку таркова с спт на арчлинукс. Сервер и лаунчер запускаются а игра крашит как только ее запускаешь. Что делаать? У кого-то вообще пиратка работает ну или лицуха?

 

hinaichigo
()

помогите с reportlab.pdfgen

Форум — General

пытаюсь напечатать отрывной календарь с ивритскими датами.

генерировать файл со страницей на каждый день получается.

не получается отображать ивритские буквы.

добавил ивритский фонт.

но выглядит так будто не использует настройки фонта , меняю в скрипте размер а в пдф не меняется

hebcal -H  5785  -8 -d -e -w -h -H >hcal.txt
from reportlab.pdfgen import canvas
from reportlab.pdfbase  import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont

pdfmetrics.registerFont(TTFont('alef','/usr/share/fonts/truetype/alef/TTF/Alef-regular.ttf'))


f = open("hcal.txt", "r")
lines = f.readlines()
c = canvas.Canvas("out.pdf", pagesize=(200,100))
c.setFont('alef', 20)
for line in lines:
  c.drawString(5, 5, line.strip())
  c.rect(0, 0, 200, 100)
  c.showPage()
c.save()

 ,

bloodmeri
()

TGUI — кроссплатформенная библиотека виджетов на C++

Галерея — Скриншоты

TGUI – кроссплатформенная библиотека виджетов и простой дизайнер GUI, написанные на языке C++ (стандарт C++14) и распространяемые по лицензии Zlib.
Библиотека поддерживает несколько бэкендов ввода-вывода: SFML, SDL2, SDL3, OpenGL 3, OpenGL ES 2 и raylib.

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

 , , ,

dataman
()

Как узнать имя функции по её адресу (из отладочных символов)

Форум — Development

Ситуация такая: Через sigaction ставится обработчик на SIGFPE, SIGILL, SIGSEGV, SIGBUS с флагом SA_SIGINFO. В обработчике происходит добавления записи в лог. В лог попадает информация об ошибке:

  1. Время ошибки
  2. Из siginfo_t - значение si_addr
  3. Из контекста - значение регистра EIP/RIP

Т.е. допустим если произошла ошибка SIGSEGV, то si_addr указывает на адрес памяти к которому было обращение, а EIP/RIP на адрес команды которая выполнила это действие.

И вот главный вопрос: Как по EIP/RIP узнать имя функции, которой принадлежит данный адрес? Если программа компилируется с отладочными символами, то вычислить имя функции вроде как возможно, а вот как это сделать - хз. Может быть есть какая-нибудь функция для этого?

slesh
()

Groonga 14.0.7

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

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

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

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

 , , ,

dataman
()

Когда nice не работает и процессы НЕвежливые

Статьи — Desktop

Отключать ли автогруппировку процессов чтобы позволить приоритетам nice работать глобально?

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

 ,

kirill_rrr
()