Задать вопрос
  • Как заполнить оставшуюся ширину элементом ввода, но без обёртки?

    @makaleks Автор вопроса
    IvanU7n в комментарии подсказал, что flex умеет всё, что нужно, и на рендеринге это похоже на правду. Там есть те же fill-content и flex-grow:1 (вместо width: 100%), просто в отличие от table-cell это работает даже на <select>

    Ответ

    <!DOCTYPE html>
    <html lang="ru" style="height:100%;">
    <head>
        <meta charset="utf-8">
        <title>Полигон</title>
        <!--
        <link href="stypes.css" rel="stylesheet">
        <script src="script.js"></script>
        -->
        <!--<script type="module" src="/static/vue.js"></script>-->
    <style>
    </style>
    </head>
    <body style="height:100%;margin:0;">
        <div style="display:flex;flex-direction:row;flex-wrap:nowrap;width:100%;">
            <button style="flex:0 1 fit-content;background-color:lightgray;"
                >setraw
            </button>
            <select
                style="flex-grow:1;background-color:lightyellow"
            >
                    <optgroup>
                        <option>Select-remaining</option>
                        <option>many1</option>
                        <option>many2</option>
                        <option>many3</option>
                    </optgroup>
            </select>
            <button
                style="flex:0 1 fit-content;background-color:lightblue"
                >vsplit
            </button>
        </div>
    </body>
    <script>
    </script>
    </html>

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

    @makaleks Автор вопроса
    Событие PopStateEvent возникает, на сколько бы позиций назад ни переходил пользователь. В себе событие содержит аттрибут state, в котором лежит то состояние, которое пользователь передавал в push_state. Таким образом, через это состояние можно определить, на сколько позиций назад вернулся пользователь, и избавляться от боли в зависимости от того, насколько функциональность много̶с̶т̶р̶а̶д̶а̶л̶ь̶н̶а̶я̶целевая
    Ответ написан
    Комментировать
  • Какой есть оптимальный алгоритм загрузки ассоциированного файла?

    @makaleks Автор вопроса
    Узнал о существовании такого понятия, как журнал упреждающей записи (WAL). В результате веду файл журнала с блоками аннотацией {флаги вроде готов к удалению/готов к дампу, неубывающий идентификатор, зависимости, зависимый, ожидаемый размер и ещё что-то} и срезов данных {тот же идентификатор, N байт кусочка файла}. По ходу выгрузки строится дерево зависимостей, и как только все ноды оказались в WAL, ставлю флаги готов к дампу и начинаю запись. Случится нарушение - восстановлю недозаписанную транзакцию по WAL, истечёт актуальность - помечу блоки как готов к удалению.

    Можно, конечно, вместо срезов полученных данных писать во временные файлы - тогда запись дампа будет выглядеть как просто перемещение файла, что дешевле и быстрее освобождает место - но это больше сущностей в и так непростом велосипеде (пока актуальнее добиться аккуратной обработки дерева зависимостей, с тестами). Плюс понадобится проверять актуальность на файловой системе на случай, если [все блоки получены]=>[оригинал перезаписан]=>[транзакция прервалась, а некоторых временных файлов не осталось]. В таком случае можно предложить перебраться на sqlite, но выигрыша по сравнению с уже написанным простым wal не вижу.
    Ответ написан
    Комментировать
  • Как изменять область видимости символов в CMake или Visual Studio?

    @makaleks Автор вопроса
    01.2022. Пока ограничиваюсь llvm, с такими шагами.
    Ответ написан
    Комментировать
  • Шаблоны в Си. Как выполнить макроподстановку при конкатенации?

    @makaleks Автор вопроса
    Можно ли как-то выполнить нужную мне подстановку?


    Нужно было добавить второй уровень подстановки, чтобы конкатенация происходила с макросом, а не аргументом
    Ответ написан
    Комментировать
  • Как увеличить максимальный размер точки в opengl?

    @makaleks
    Доки
    Тут сказано, что от платформы зависит, какой максимальный размер может быть у сглаженной точки, гарантируя только поддержку размера 1. Параграф перед Notes - там всё.
    В opengl всё скачет от треугольников, так почему бы не использовать GL_TRIANGLE_FAN? Эти вычисления всё равно будут - либо на вашей стороне, либо на стороне opengl. Списки отображения (glList) позволят произвести вычисления всего один раз для некоторого сглаживания (на сколько частей круг делить), а glScale позволит масштабировать до тех пор, пока не станут видны отдельные отрезки. Используйте вершинные массивы (glDrawElements), чтобы не обращаться к видеокарте по двадцать раз для одного объекта, т.к. так никто не делает. Всё описано в OpenGL Red Book, у которой даже перевод есть.
    Ответ написан
    Комментировать
  • Как затереть ссылку возврата?

    @makaleks
    Смотрите указатели на функции.
    Если у вас есть указатель на функцию, то фактически, есть точка отсчёта для памяти программы. В принципе, для исследования этого достаточно. Для обхода памяти лучше использовать указатель на int - если компилируете под 32 бита, то вроде столько должен занимать размер стека. И конечно, 16-ричный вывод для удобства (одинаковое кол-во символов для любого числа). Да, и не пытайтесь вносить изменения - int const * в помощь!)
    Попробуйте посмотреть ассемблерный листинг (опция в компиляторе), может получится вывести, какая команда в каком адресе лежит. Вы же поймёте значение команд call и ret?)
    Ответ написан
  • OpenGL, как связать прыжки персонажа с нажатием мыши?

    @makaleks
    Не углублён в вопрос (пробовал только с OpenGL v1.1) но предложение есть.
    Во главном цикле приложения (1) Вы рисуете каждый нужный Вам объект. Объект имеет поле(2), описывающее его состояние. Событие может менять(3) состояние, а перед отрисовкой над объектом производится какое-то изменение (маленький кусочек подпрыгивания)(4). Некоторые состояния имеют ограничение по длительности - нужна степень выполнения (н-р по времени), т.е. во время обработки надо проверять: "а, может, хватит? если да, произвести преобразование последний раз, и сбросить состояние на 'не активное'". По вопросу вроде всё.

    Возможные уточнения:
    1) Библиотеки, обеспечивающие OpenGL окно и регистрацию событий, могут иметь функцию типа WaitEvents(), которая заморозит текущий поток до наступления события, следовательно, убьёт анимацию. От такого метода придётся отказаться, пока анимация может наступать.
    2) Можно в структуре иметь список структур, описывающих обработку состояния. По мере активаний/деактиваций состояний список можно увеличивать/уменьшать.
    3) Вы уже умеете выбирать объект по щелчку мыши? В OpenGL Red Book описано, как пользоваться буфером обратного вызова: передаём в OpenGL массив, указываем его размеры. С помощью преобразований OpenGL Включаем буфер. Далее в цикле [ => загрузить имя (число) => нарисовать объект => ]. На самом экране ничего не появится, даже если сделать SwapBuffers(). Выключаем буфер - эта функция вернёт нам число попаданий - сколько "имён" было нарисовано. Ещё раз - мы на невидимом экране произвели зум в указателю мыши до масштаба порядка пикселя и нарисовали все объекты на сцене. Если после вызова glLoadName(i) на экране что-то появилось - записать информацию в буфер. Теперь в буфере определённом формате записано, что было нарисовано с доп. информацией, типа значения координаты z (помогает в сложном 3D). Старый код:
    gliuButton* gliuCallBackStafGL(double mouseX, double mouseY)
    {
    	if (!gliuButtonStore.stackSize)// мой стек кнопок. кнопки хранятся блоками.
    	{
    		return;
    	}
    
    	glPushMatrix();	// сохраним матрицу, чтобы ничего не испортить
    	GLuint buf[8] = { 0 };
    	glSelectBuffer(8, buf);
    
    	glLoadIdentity();	// координаты объектов я задавал в экранных координатах
    					// => стандартные координаты [-1;1]x[-1;1] будут охватывать 4 пикселя
    	glTranslatef(-mouseX, -mouseY, 0);
    
    	glRenderMode(GL_SELECT);	// включаем буфер
    	glInitNames();
    	glPushName(0);		// не помню, для чего именно это нужно, но иначе не работает
    
    	unsigned i = 0;
    	// сложности с хранением блоками
    	struct _gliuStackElemSet_buttonPtr *ptr = gliuButtonStore.current;
    	gliuButton **cur;
    	if (!ptr->_bsize)
    	{
    		ptr = ptr->_before;
    	}
    	cur = &ptr->_buf[ptr->_bsize - 1];
    
    	for (i = 0; i < gliuButtonStore.stackSize; i++)
    	{
    		glLoadName(i);	// загрузить имя
    		glRecti((*cur)->labelPart->x, (*cur)->labelPart->y, (*cur)->labelPart->x + (*cur)->labelPart->width, (*cur)->labelPart->y + (*cur)->labelPart->height);	// вместо кнопки - просто прямоугольник
    		if (cur != ptr->_buf)
    		{
    			cur--;
    		}
    		else
    		{
    			ptr = ptr->_before;
    		}
    	}
    	glPopName();
    
    	// сколько попаданий?
    	int hits = glRenderMode(GL_RENDER);
    
    	if (hits>0)
    	{
    		ptr = gliuButtonStore.current;
    		if (!ptr->_bsize)
    		{
    			ptr = ptr->_before;
    		}
    		cur = &ptr->_buf[ptr->_bsize - 1];
    
    		for (i = 0; i < gliuButtonStore.stackSize; i++)
    		{
    			if (i == buf[3])
    			{
    				// именно в buf[3] хранится "имя"
    				// полезно изучить всё содержимое buf
    				break;
    			}
    			if (cur != ptr->_buf)
    			{
    				cur--;
    			}
    			else
    			{
    				ptr = ptr->_before;
    			}
    		}
    		glPopMatrix();
    		return *cur;
    	}
    	else 
    	{
    		glPopMatrix();
    		return 0;
    	}
    }

    4) Список активных обработчиков состояний можно для единообразия заполнять структурами из: значение степени выполнения (int) + указатель на функцию, принимающую этот int и void* указатель на объект

    P.S.
    Не хотите ли перебраться на C++? В нём реализовано несколько возможностей, которые упрощают разработку (классы, их методы, перегрузка, шаблоны), например, позволяют абстрагировать интерфейс от реализации (наследование, виртуальные функции). Есть литература по приёмам организации кода ("Паттерны проектирования" от Банды Четырёх). Совместим с Си. "Полный справочник по C++" Шилдта расскажет о Си и С++ - по нему удобно искать. И да, во многих компиляторах C++ уже реализованы потоки C++11, что позволяет без подключения сторонних библиотек и Sleep() (только! винда) ставить приложение на паузу.
    P.P.S.
    Вроде ответ дан, кидайте доп. вопросы в комментарии.
    Ответ написан
    Комментировать
  • Как распарсить строку без обратной польской нотации?

    @makaleks
    Принципиально другого способа не знаю, но, если очень надо, с рекурсией мучиться можно. Будут ошибки, сложности добавления новых операторов и прочее.
    Сам на заре ещё самообучения пилил такое дело. Тот ещё ужас... Хотите подсмотреть - ловите .h, но это фактически Си и вообще я ничего не знал. Хотя поддерживает аргументы (через латинские буквы), функции sin и cos, а также скобки и модули. Ни пробелов, ни табуляции.

    Надеюсь, увидев этот ужас, Вы поймёте, что лучше разобрать обратную польскую.
    Лучше разобрать, правда.
    Ответ написан
  • Microsoft Visual Studio 2013, как перейти от простого вывода в консоли до полноценных программ?

    @makaleks
    Взять и начать)
    Графика в плюсах платформо-зависимая. Хотите, чтобы ваша графика работала без изменений кода в Windows, Linux, MacOS...? Ставьте кроссплатформенные библиотеки. Не хотите ничего ставить? Работайте с формами Windows. У меня 2015-я бесплатная, и там я тоже не вижу форм. Зато есть кое-что получше - универсальные приложения Windows. Посмотрите, авось и Вас найдётся. Хотя действительно ли Вам нужно программирование, когда Вы работаете с конструктором?
    Из кроссплатформенных Graphic User Interfase (GUI) библиотек особо популярны GTK+ и QT. Это мощные библиотеки с огромным сообществом, благодаря чему можно будет найти ответы на очень многие вопросы.

    А если вы чисто для продолжения обучения хотите повозиться с чем-то низкоуровневым (точки, полигоны, матрицы, т.д. и никакого текста), то я в своё время возился с OpenGL, который у Вас уже установлен. Понадобится только кроссплатформенная обёртка исключительно для создания графического окна и приёма событий клавы/мышки. Здесь очень посоветую glfw, в отличие от заброшенного glut. Будет вам отличая html документация по glfw, а RedBook поможет с OpenGL. Но это только для обучения, хотя я и дошёл до того, что написал свой удобный костыль для вывода шрифтов через FreeType. На винде стоит версия 1.1, хотя давно уже OpenGL перешагнул 4-ю версию и очень сильно изменился с тех давних пор - а Microsoft вместо этого обновляет свой DirectX для Windows.

    В общем, делайте выбор, раз хотите начать)

    Удачи
    Ответ написан
    Комментировать
  • Как заставить монитор (Dell S2340T) поддерживать все точки касания?

    @makaleks Автор вопроса
    Makaleks @Makaleks
    Всё исправилось с обновлением до Windows 10. Судя по изображению плиточного интерфейса Win8-8.1, от меня ожидалась Windows 8+... Ни на сайте, ни в документации ничего об этом не сказано. Только требование USB-подключения для поддержки сенсорного ввода вообще.
    Ответ написан
    Комментировать
  • Как написать приложение с раcписанием?

    @makaleks
    Больно серьёзная задача при таких знаниях C++. При написании GUI не обойтись без классов, Qt Вам уже посоветовали. В этой же библиотеке есть способы работать с сетью и не только. Но ВУЗы обычно (не встречал) не предоставляют API для работы со своим сайтом, а посему есть разные варианты, и парсинг - не самый лучший из них для Вас. Поскольку расписание на то и расписание, чтобы обновляться редко, то можно просто забить это расписание "ручками" (например на сервере для таких обновлений), а затем и обрабатывать.

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

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

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

    1: да, разумеется на C++ можно писать и не такое, хотя практически полный контроль над каждой оперцией и обещает длительный цикл разработки (порой для прототипов используют вообще другой язык программирования, полный абстракций, например Python). По Qt советую для начала книгу
    "Qt 4.8. Профессиональное программирование на C++" (М. Шлее)
    И надеюсь, что у Вас есть под рукой что-то вроде
    "Полный справочник по C++" (Г. Шилдт)

    Андроиду действительно больше подходит Java, но и для C++ существуют способы написания под мобильные платформы (не только Android).

    Удачи
    Ответ написан
    Комментировать
  • Как Java программисту подшутить над C++ программистом?

    @makaleks
    Найти в начале main() (или в другом видном месте) какое нибудь число и подписаться целочисленными константами:
    unsigned i='Hell'+'o, '+'C++'+'prog'+'ger!' - 552576319;//==0
    //...
    for(i; i < 5; i++)
    {
    //...
    }
    Ответ написан
    Комментировать
  • Алгоритм связанный с графами?

    @makaleks
    Раз этот огромный граф хранится на диске и вас беспокоит память для std::list, то можно, например, сохранить на диск (или попробовать в память) матрицу смежности, для которой пишутся базовые алгоритмы. Конечно, не совсем ясна задача, но это вариант "в лоб", для базовых вещей.
    Ответ написан
    Комментировать
  • Почему трясётся обект в OpenGL?

    @makaleks
    Класс Camera использует перспективу?
    Не исключено, что неверные расчёты происходят постоянно, но заметны они становятся только при приближении (более заметно) либо при активных движениях на расстоянии (что заметить будет непросто при непрерывном перемещении).
    Ответ написан
    Комментировать
  • OpenGL цветовые индексы или реализация glDrawPixels с праметром GL_BITMAP. Как?

    @makaleks Автор вопроса
    Спасибо за ответы)
    Если кому надо:

    Задание цветового индекса является платформо-зависимой операцией.
    У пользователей GLUT есть
    glutSetColor(int cell,
    GLfloat red, GLfloat green, GLfloat blue);

    Другой способ лежит через GL_MAP_COLOR
    Пример:
    unsigned char bitmap[] = { 0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00,
    	0x00, 0x00, 0x00, 0x00,
    	0x00, 0xFF, 0xFF, 0x00,
    	0x03, 0xFF, 0xFF, 0xC0,
    	0x07, 0xFF, 0xFF, 0xE0,
    	0x0F, 0x80, 0x01, 0xF0,
    	0x1E, 0x00, 0x00, 0xF8,
    	0x1C, 0x00, 0x00, 0x38,
    	0x3C, 0x7E, 0x7E, 0x3C,
    	0x38, 0x0E, 0x70, 0x1C,
    	0x39, 0xF0, 0x0F, 0x9C,
    	0x38, 0x00, 0x00, 0x1C,
    	0x38, 0x00, 0x00, 0x1C,
    	0x38, 0x38, 0x1C, 0x1C,
    	0x38, 0xFE, 0x7F, 0x1C,
    	0x38, 0xC6, 0x63, 0x1C,
    	0x38, 0xD6, 0x6B, 0x1C,
    	0x38, 0xD6, 0x6B, 0x1C,
    	0x38, 0xC6, 0x63, 0x1C,
    	0x38, 0xFE, 0x7F, 0x1C,
    	0x38, 0x7C, 0x3E, 0x1C,
    	0x3C, 0x00, 0x00, 0x3C,
    	0x3C, 0x00, 0x00, 0x3C,
    	0x7E, 0x00, 0x00, 0x7E,
    	0x7F, 0x80, 0x01, 0xFE,
    	0x77, 0xFF, 0xFF, 0xEE,
    	0x63, 0xFF, 0xFF, 0xC7,
    	0xE7, 0xFF, 0xFF, 0xE7,
    	0xFF, 0xF0, 0x0F, 0xFF,
    	0xFF, 0x00, 0x01, 0xFF,
    	0xF0, 0x00, 0x00, 0x0F
    };
    void draw(){
    	glClearColor(1, 1, 0, 1);//жёлтым
    	glClear(GL_COLOR_BUFFER_BIT);//закрасить
    	glPixelTransferi(GL_MAP_COLOR, 1);//использоваь карту
    	float map[2] = { 1, 0 };//пусть...
    		//...все единицы закрашивают в чёрный, а все нули - в белый цвета...
    		glPixelMapfv(GL_PIXEL_MAP_I_TO_R, 2, map);
    		glPixelMapfv(GL_PIXEL_MAP_I_TO_G, 2, map);
    		glPixelMapfv(GL_PIXEL_MAP_I_TO_B, 2, map);
    	//...и все нули будут прозрачными
    	map[0] = 0, map[1] = 1;
    	glPixelMapfv(GL_PIXEL_MAP_I_TO_A, 2, map);
    	//Итого: для единиц действует цвет glColor4f(0,0,0,1), а для нулей будет glColor4f(1,1,1,0)
    
    	glRasterPos2i(-160, -160);//позиция от центра экрана в пикселях ( не забыть вызвать glOrtho(...) )
    	glPixelZoom(10, 10);//теперь работает
    
    /*этот блок*/		glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    /*лучше поставить*/	glEnable(GL_BLEND);					//прозрачность
    /*в начале программы*/	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);	//определяется компонентом ALPHA
    	glDrawPixels(32, 32, GL_COLOR_INDEX, GL_BITMAP, bitmap);//рисовать 32x32 bitmap, где кадый бит определяет цветовой индекс "0" или "1"
    
    	glPixelTransferi(GL_MAP_COLOR, 0);//не использовать карту
    }

    2b74cc08dc274662aebbbd40563885b8.PNG
    Ответ написан
    Комментировать
  • Как удалить список отображения в OpenGL?

    @makaleks Автор вопроса
    Удаление списков отображения - void glDeleteLists(GLuint list,GLsizei range);
    Проверить занятость идентификатора - GLboolean glIsList(GLuint list);
    Использование идентификатора старого списка при создании нового якобы ведёт к простой перезаписи
    Ответ написан
    Комментировать
  • Как перевести координаты мыши, полученные glutMouseFunc в координаты OpenGL?

    @makaleks
    так я перевожу в центр
    my_x=-x+app.width/2;
    my_y=-app.height/2+y;
    , где app - моя структура, хранящая высоту и ширину окна, аint x,y; - переменные с координатами мыши

    И если я правильно понял, Вам нужно прибавить width/2 и height/2 в соответствующих местах
    Ответ написан
    Комментировать