LINUX.ORG.RU

Metaprog: универсальная графическая среда программирования [в разработке] часть 2

 , , ,


2

3

Не нравится - проходите мимо. Нравится - помогайте проекту.

Дополнительно:

Структуры условного выбора типа

Примеры

Metaprog: универсальная графическая среда программирования [в разработке]

Metaprog: универсальная графическая среда программирования [в разработке] часть 3

Структура

Структура GtkWidgetClass с кучей членов-указателей на функции:

https://i.postimg.cc/bwTrb1r1/2.png

Слева - члены структуры, справа - подсказки к выходам структуры, всплывшие при наведение мышью. Там можно прочитать имена членов структуры. Здесь я буду брать прототипы для функций, вызываемых по перечисленным событиям (фишка gtk+).

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

Она же в текстовом виде: https://pastebin.com/TeTsSMQz



Последнее исправление: CYB3R (всего исправлений: 12)

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

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

metaprog
() автор топика
Ответ на: комментарий от Deleted

Скоро уже тртью часть откроем. За неполный день 7 страниц - рекорд. Из той же книги Линуса:

У  нас  была  своя  собственная
телеконференция в  Интернете  --  comp.os.linux, выросшая из  пепла нашей  с
Эндрю Таненбаумом перепалки. И она привлекала орды участников. В  те времена
Internet Cabal (группа администраторов некоторых узлов Интернета) ежемесячно
подводила неофициальную  статистику:  сколько  человек  участвует  в  каждой
конференции. Данные  были не очень  точные,  но они  лучше всего  говорили о
популярности твоего сайта --  в данном  случае, сколько людей интересовалось
Linux.  Неизменным  лидером  среди телеконференций  была alt.  sex. (Я-то ей
особенно  не интересовался.  Хотя и сходил туда пару раз, чтобы  посмотреть,
из-за чего подняли такой шум. Но вообще я был типичным  фригидным ботаником,
которому  гораздо интересней  играть  в процессор  с  плавающей  точкой, чем
следить за новостями  с  сексуального фронта:  о свеженайденных позициях при
половом акте, отчетах о крутых любовных играх  или о  чем там еще говорят на
alt. sex.)
     С  помощью   ежемесячной   статистики  Cabal  легко   было  следить  за
популярностью  comp.os.linux.  Можете не  сомневаться  --  так  я  и  делал.
(Некоторые считают меня чуть ли не народным героем, но я  никогда не был тем
бескорыстным,  самоотверженным  компьютерным  фанатом,  каким меня  пытается
представить  падкая  на  мифы пресса.)  К осени  1992 года  в  нашем  форуме
участвовали десятки тысяч людей. Все эти  люди  следили  за событиями вокруг
Linux, но  не все из них  пользовались самой операционной  системой.  Каждый
месяц  в  момент   подведения  итогов  выпускался  список  из  сорока  самых
популярных телеконференций. Если твой форум не входил в эти  сорок, то о его
популярности можно было узнать из полного отчета,  который распространялся в
специальной  служебной  конференции.  Мне  обычно  приходилось обращаться  к
полному отчету.
     Однако форум Linux неуклонно двигался вверх. В какой-то момент он вошел
в  первые сорок, и  я был  счастлив. Это было круто. Помню, я тогда  написал
довольно злорадное  сообщение в comp.os.linux, в  котором перечислял форумы,
посвященные разным ОС,  включая Minix,  и  говорил: "Смотрите, мы популярнее
Windows!" (Учтите, что в то время любители Windows еще не освоили Интернет.)
Где-то  в  1993-м  мы  вошли в  первую  пятерку.  В  ту  ночь  я  лег  спать
преисполненный самодовольства, в экстазе от того,  что Linux по популярности
почти догнала секс.
metaprog
() автор топика
Ответ на: комментарий от metaprog

как насчет того чтобы написать все на html5/javascript?

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

Написал пример сервера на Vala, это такой C# от мира Gnome!

public async void handle(SocketConnection connection) {
	var socket = connection.get_socket();
	
	// Шлем клиенту данные
	socket.send((uint8[])"Hello World!".to_utf8());
	
	// Закрываем соединение (не сокет), что бы 
	// браузер корректно отобразил данные!
	socket.shutdown(true, true);
}

public static int main(string[] args) {	
	try {
		var loop = new MainLoop();
		var service = new SocketService();
		
		service.add_inet_port(8080, null);
		
		// Делаем g_signal_connect на подключение!
		service.incoming.connect((connection, source) => {
			handle.begin(connection);
			return false;
		});
	
		service.start();
		
		// Запускаем event-loop!
		loop.run();
	} catch(Error e) {
		print("Error: %s\n", e.message);
	}
	
	return 0;
}
Когда на С будешь реализовывать сеть, возможно изменишь свое отношение к ООП итд %)

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

Vala если что использует GObject для ООП, как стандартную библиотеку GLib, Gtk, Gdk, итд. Пример выше это GLlib/Gio!

Deleted
()
Ответ на: комментарий от metaprog

Надо же, плюсы умеют даже говорить в какой СТРОЧКЕ кода был баг.

Именно. Вот теперь подумай, каким образом у тебя будет описываться локализация ошибок. Имя диаграммы и координаты на ней (x, y)?

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

Надо же, плюсы умеют даже говорить в какой СТРОЧКЕ кода был баг.

Так и С умеет, посмотри на тот же assert!

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

Си по-любому бэкендом для Метапрога будет.

Плиз, делай примеры на Си, понятнее будет. Хотя я уже нашел функции семейства g_socket_listener:

https://i.postimg.cc/pLKjbCF8/image.png

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

metaprog
() автор топика
Ответ на: комментарий от metaprog

Плиз, делай примеры на Си

Это писанины много.

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

Б**ть! Почему вы путаете язык (Си) и способ структурирования и организацию (парадигму, методологию, whatever) программ? Цуко нах, все ядро линюкса (да, пошел к логопеду) это ООП. qemu посмотрите. Чистый Си. ООП. И эти люди что-то там разрабатывать пытаются. Секретарши добрались до мышек...

anonymous
()
Ответ на: комментарий от hobbit

В Лабвью я использую брейкпоинты в тех местах где недопустимое состояние.

Все ошибки в Метапроге будут обрабатываться через условия. Если какое-то состояние недопустимо - ставишь туда специальную функцию-обработчик.

metaprog
() автор топика
Ответ на: комментарий от metaprog

Си по-любому бэкендом для Метапрога будет.

Ну это ясно, и у Vala бекенд С кстати тоже. Просто показываю как сокращают высокоуровневые языки код...

Deleted
()
Ответ на: комментарий от metaprog

Вообще будем решать проблемы по мере их поступления:)

metaprog
() автор топика
Ответ на: комментарий от balsoft

Э-э, поосторожнее, а то он 1 и 3 выберет, и мы лишимся надежды что-нибудь увидеть.

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

Никто ничего не путает, в С нету сахарка для GObject, там мой код будет раз в 10 длиннее. А в Vala есть ООП сахарок...

Deleted
()
Ответ на: комментарий от metaprog

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

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

Код не надо сокращать. Если в метапрог-диаграмме будет даже сотня-другая функций и тысячи проводников между ними - ничего страшного, главное удобный зум и подсветка связей.

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

metaprog
() автор топика
Ответ на: комментарий от metaprog

Код не надо сокращать.

Но чем короче код тем меньше времени на создание приложения, ты о чем, лол?

Deleted
()
Ответ на: комментарий от anonymous

Слилась, секретарша? Иди букварь почитай, чтоль.

Ты хоть сам то понимаешь какую ахинею несешь?

Deleted
()
Ответ на: комментарий от hobbit

Данные о диаграмме и координатах, по которым Метапрог автоматически найдет нужное место.

metaprog
() автор топика
Ответ на: комментарий от Deleted

var loop = new MainLoop(); var service = new SocketService();

Сократить код без ввода новых понятий нереально. А новые понятия - это жуткий геморрой. Каждое новое понятие усложняет язык, то есть трансляторы, компиляторы, забивает мозги программисту.

Хотя в Метапроге еще посмотрим как что будет.

metaprog
() автор топика
Ответ на: комментарий от Deleted

Вообще в Си мало слов, основ, лексем, мало понятий, и сишный код проще и понятнее. Даю слово Линусу:

Осенью  1990  года  начался первый учебный  год,  когда в  Университете
Хельсинки  заработала  Unix.  Эта  мощная  операционная  система родилась  в
исследовательском центре Bell Labs компании  AT&T в конце 60-х годов, но
выросла  в других местах.  Когда  я был  на первом  курсе, у нас стоял VAX с
операционной системой VMS. Она была ужасна, про нее никто не сказал бы: "Вот
бы и мне домой такую". Она вызывала иную реакцию: "Как вы умудрились сделать
такое!" Ею  было трудно пользоваться. В  ней  было мало инструментария. С ее
помощью было  сложно выходить в  Интернет, который  работал  под Unix.  Даже
узнать, насколько велик файл, -- и то было  непросто. Надо признать, что для
некоторых  приложений  -- например, для  баз данных -- VMS была очень хорошо
приспособлена. Но она была не из тех операционок, которые вызывают восторг.
     В университете наконец поняли, что с ней  пора кончать.  В научном мире
многие  тогда  увлеклись  Unix, поэтому  университет  приобрел  MicroVAX, на
котором  работала  Ultrix --  вариант  Unix,  созданный корпорацией  Digital
Equipment. Они захотели примериться к Unix.
     Мне не  терпелось поработать с Unix, чтобы  поэкспериментировать с тем,
что я узнал из книги  Таненбаума.  Сколько всего я мог бы сделать, если бы у
меня была 386-я машина!  Однако взять 18 тысяч  финских  марок на ее покупку
мне было негде. Я знал, что с началом учебного семестра я смогу использовать
свой  Sinclair QL для выхода на  новый университетский Unix-компьютер до тех
пор,  пока не  куплю себе  PC -- машину, на которой  можно будет  установить
Unix.
     Поэтому  тем   летом   я   делал   две   вещи:  бездельничал   и  читал
"Проектирование и реализацию операционных  систем". Эти 719 страниц в мягком
красном переплете, можно сказать, поселились у меня в постели.
     Университет  Хельсинки размахнулся на  16-пользовательскую лицензию для
MicroVAX.  Это  значило, что  прием  на курс  "Си и  Unix" ограничивался  32
студентами --  видимо, предполагалось, что 16 человек будут использовать  ее
днем и 16 -- вечером. Преподавателю, как и всем нам, Unix была в новинку. Он
сразу же об этом сказал, так что проблем не было. Но он обычно знал материал
своего курса на одну главу вперед, а студенты иногда уходили вперед главы на
три. Это стало своего рода игрой: студенты пытались подловить преподавателя,
задавая ему вопросы по будущему материалу, чтобы выяснить, читал  он его или
нет.
     Все мы были  младенцами в дебрях  Unix;  курс создавался по ходу нашего
обучения. Однако из него было ясно, что за Unix стоит своя особая философия.
Это становилось понятно после первого  же часа  занятий. В  остальное  время
объяснялись подробности.
     Unix характерна тем, что она утверждает некоторые базовые ценности. Это
цельная и красивая операционная система. Она избегает особых случаев. В Unix
есть понятие процесса: процесс -- это  все,  что  что-нибудь делает. Простой
пример. В Unix команда оболочки, которую  вводят, чтобы  войти в систему, не
встроена в операционку, как в DOS. Это просто задание. Ничем не отличающееся
от остальных. Просто это задание читает с  клавиатуры  и пишет на монитор. В
Unix все, что что-то делает, -- процесс. А еще там есть файлы.
     Простота структуры Unix всегда поражала меня, как и  большинство  людей
(ну  по  крайней  мере  -- нас, хакеров). Почти  все,  что делается  в Unix,
выполняется  с  помощью  шести  базовых  операций  (называемых   "системными
вызовами", потому что они представляют из себя вызовы системы для выполнения
тех или иных действий), А уж из этих шести  базовых  вызовов можно построить
почти все на свете.
     Одной из фундаментальных операций Unix  является  "операция  порождения
(fork)".  Выполняя "fork", процесс создает свою точную копию. Таким  образом
вы получаете две идентичные копии. Порожденная  копия чаще  всего  выполняет
другой  процесс  --  заменяет  себя  новой  программой. Это  вторая  базовая
операция. Оставшиеся четыре вызова -- open (открыть), close  (закрыть), read
(читать)  и write (писать) --  предназначены для доступа к файлам. Эти шесть
системных вызовов представляют  собой простые операции, из которых и состоит
Unix.
     Конечно,  есть еще куча других системных вызовов, которые  осуществляют
детализацию. Но если  вы  поняли шесть базовых -- вы поняли Unix. Потому что
одна  из  прелестей  Unix в  том, что  для создания сложных  вещей  не нужны
сложные интерфейсы. Любого уровня сложности можно достичь за  счет сочетания
простых  вещей.  Для  решения  сложной  проблемы нужно  лишь  создать  связи
("каналы" в терминологии Unix) между простыми процессами.
     Уродство,  когда  для  любого  действия  у  системы  есть   специальный
интерфейс. В Unix -- все наоборот. Она предоставляет строительные блоки,  из
которых можно создать что угодно. Вот что такое стройная архитектура.
     То  же  самое  с  языками. В английском 26  букв, и с  их помощью можно
написать  все.  А  в китайском для  каждой мыслимой  вещи --  своя  буква. В
китайском  вы сразу же получаете в свое  распоряжение  сложные вещи, которые
можно комбинировать ограниченным образом.  Это больше напоминает подход VMS:
есть   множество  сложных   вещей   с  интересным  смыслом,  которые   можно
использовать только одним способом. И в Windows то же самое.
     В Unix, напротив, основная идея: "Чем меньше, тем красивее". Здесь есть
небольшой  набор простых  базовых  строительных  блоков,  из  которых  можно
строить бесконечно сложные конструкции.
     Именно  так, кстати, обстоит  дело  и в физике. Эксперименты  позволяют
открыть фундаментальные законы, которые,  как предполагается, крайне просты.
Сложность  мира  возникает  за  счет  множества  удивительных  взаимосвязей,
которые можно  вывести из этих простых законов, а не из внутренней сложности
самих законов.
     Простота  Unix  не возникла  сама по  себе.  Unix  со  своей концепцией
простых строительных  блоков была  кропотливо разработана  Деннисом  Ричи  и
Кеном Томпсоном в Bell Labs  компании  AT&T.  Простоту вовсе не  следует
отождествлять с легкостью. Простота требует проектирования и хорошего вкуса.
     Если  вернуться к  примеру  с  языками, то  пиктографическое  письмо --
например,  египетские или  китайские иероглифы  -- обычно древнее  и кажется
"примитивнее", а  подход, использующий строительные  блоки,  требует гораздо
более абстрактного мышления. Точно так же и простоту Unix не следует  путать
с отсутствием изощренности -- совсем наоборот.
metaprog
() автор топика
Ответ на: комментарий от hobbit

Владимир

Так у меня говоря современным языком своооободы больше .../шутка конечно/.
Да и вообще «Язык мой - враг мой»/.
Вот сегодня у дочки соседки муж умер /видел его пару раз/.
М-да.

PS: Жаль, что ТС идет этим путем - «Молодой эшо».

anonymous
()
Ответ на: комментарий от metaprog

По сути там GMainLoop *loop = g_main_loop_new(); ну как то так.

Deleted
()
Ответ на: комментарий от anonymous

Так значит, песня «Пока несут сакэ» посвящена скуке прикладной программы, запросившей открытие сокета???

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

Набери просто в гугле «glib main loop», «glib socket service»

Deleted
()
Ответ на: комментарий от hobbit

Владимир

Не знаю как там у китайцев и японцев, ... произносится сокет/почему-то это слово на ум пришло/.

anonymous
()
Ответ на: комментарий от metaprog

Владимир

Ладно повторю.
Без хорошего интерфейса - «удачи не видать».
Интерфейс LabVIEW ИМХНО не годится для вашего проекта.
Но вы выбрали путь а-ля LabVIEW.

anonymous
()

Как правило, текст удобнее графики. Взять хотя бы такую область, как программирование FPGA. По сути, это рисование электрической схемы, т.е. вещь, идеально подходящая для графического представления. Однако, если лет 20 назад проект, выполненный в схематике, встречался довольно часто, то сейчас все пишут на verilog/VHDL. Схематику разве что студенты для курсовых используют. А все возможности ведь сохранились - бери Quartus, ставь логические элементы, соединяй их проводами. Только вот не нужно никому.

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

Тихо ты. тут свой маня-мирок.

anonymous
()
Ответ на: комментарий от Deleted

Делает одно и тоже, только на питоне у тебя это займет пару секунд а на C/C++ несколько часов. (с нуля)

Deleted
()
Ответ на: комментарий от metaprog

Владимир

Вот опять вспомнился «Рак, лебедь и щука».
А на форуме все это умножьте на сто.

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

Владимир

Ни кто еще «серебряную пулю» не изобрел.

anonymous
()
Ответ на: комментарий от Deleted

Так это еще знать-то надо!

Я, кстати, кликаю на всплывающие подсказки к терминалам с типами - и мне дает рисовать константу. Мне не надо прописывать что-то типа:

	struct Vertex {
		float position[3];
		float color[3];
	};

	// Vertex buffer and attributes
	struct {
		VkDeviceMemory memory;															// Handle to the device memory for this buffer
		VkBuffer buffer;																// Handle to the Vulkan buffer object that the memory is bound to
	} vertices;

	// Index buffer
	struct 
	{
		VkDeviceMemory memory;		
		VkBuffer buffer;			
		uint32_t count;
	} indices;

	// Uniform buffer block object
	struct {
		VkDeviceMemory memory;		
		VkBuffer buffer;			
		VkDescriptorBufferInfo descriptor;
} uniformBufferVS;

Метапрог мне по клику на подсказку выдает уже константу нужного типа!

metaprog
() автор топика
Ответ на: комментарий от metaprog

Но тебе придется прописывать всякое такое ж

			// Create a host-visible buffer to copy the vertex data to (staging buffer)
			VK_CHECK_RESULT(vkCreateBuffer(device, &vertexBufferInfo, nullptr, &stagingBuffers.vertices.buffer));
			vkGetBufferMemoryRequirements(device, stagingBuffers.vertices.buffer, &memReqs);
			memAlloc.allocationSize = memReqs.size;
			// Request a host visible memory type that can be used to copy our data do
			// Also request it to be coherent, so that writes are visible to the GPU right after unmapping the buffer
			memAlloc.memoryTypeIndex = getMemoryTypeIndex(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
			VK_CHECK_RESULT(vkAllocateMemory(device, &memAlloc, nullptr, &stagingBuffers.vertices.memory));
			// Map and copy
			VK_CHECK_RESULT(vkMapMemory(device, stagingBuffers.vertices.memory, 0, memAlloc.allocationSize, 0, &data));
			memcpy(data, vertexBuffer.data(), vertexBufferSize);
			vkUnmapMemory(device, stagingBuffers.vertices.memory);
			VK_CHECK_RESULT(vkBindBufferMemory(device, stagingBuffers.vertices.buffer, stagingBuffers.vertices.memory, 0));

			// Create a device local buffer to which the (host local) vertex data will be copied and which will be used for rendering
			vertexBufferInfo.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
			VK_CHECK_RESULT(vkCreateBuffer(device, &vertexBufferInfo, nullptr, &vertices.buffer));
			vkGetBufferMemoryRequirements(device, vertices.buffer, &memReqs);
			memAlloc.allocationSize = memReqs.size;
			memAlloc.memoryTypeIndex = getMemoryTypeIndex(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
			VK_CHECK_RESULT(vkAllocateMemory(device, &memAlloc, nullptr, &vertices.memory));
			VK_CHECK_RESULT(vkBindBufferMemory(device, vertices.buffer, vertices.memory, 0));

			// Index buffer
			VkBufferCreateInfo indexbufferInfo = {};
			indexbufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
			indexbufferInfo.size = indexBufferSize;
			indexbufferInfo.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
			// Copy index data to a buffer visible to the host (staging buffer)
			VK_CHECK_RESULT(vkCreateBuffer(device, &indexbufferInfo, nullptr, &stagingBuffers.indices.buffer));
			vkGetBufferMemoryRequirements(device, stagingBuffers.indices.buffer, &memReqs);
			memAlloc.allocationSize = memReqs.size;
			memAlloc.memoryTypeIndex = getMemoryTypeIndex(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
			VK_CHECK_RESULT(vkAllocateMemory(device, &memAlloc, nullptr, &stagingBuffers.indices.memory));
			VK_CHECK_RESULT(vkMapMemory(device, stagingBuffers.indices.memory, 0, indexBufferSize, 0, &data));
			memcpy(data, indexBuffer.data(), indexBufferSize);
			vkUnmapMemory(device, stagingBuffers.indices.memory);
			VK_CHECK_RESULT(vkBindBufferMemory(device, stagingBuffers.indices.buffer, stagingBuffers.indices.memory, 0));

			// Create destination buffer with device only visibility
			indexbufferInfo.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
			VK_CHECK_RESULT(vkCreateBuffer(device, &indexbufferInfo, nullptr, &indices.buffer));
			vkGetBufferMemoryRequirements(device, indices.buffer, &memReqs);
			memAlloc.allocationSize = memReqs.size;
			memAlloc.memoryTypeIndex = getMemoryTypeIndex(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
			VK_CHECK_RESULT(vkAllocateMemory(device, &memAlloc, nullptr, &indices.memory));
			VK_CHECK_RESULT(vkBindBufferMemory(device, indices.buffer, indices.memory, 0));

			// Buffer copies have to be submitted to a queue, so we need a command buffer for them
			// Note: Some devices offer a dedicated transfer queue (with only the transfer bit set) that may be faster when doing lots of copies
			VkCommandBuffer copyCmd = getCommandBuffer(true);

			// Put buffer region copies into command buffer
			VkBufferCopy copyRegion = {};

			// Vertex buffer
			copyRegion.size = vertexBufferSize;
			vkCmdCopyBuffer(copyCmd, stagingBuffers.vertices.buffer, vertices.buffer, 1, &copyRegion);
			// Index buffer
			copyRegion.size = indexBufferSize;
			vkCmdCopyBuffer(copyCmd, stagingBuffers.indices.buffer, indices.buffer,	1, &copyRegion);

			// Flushing the command buffer will also submit it to the queue and uses a fence to ensure that all commands have been executed before returning
			flushCommandBuffer(copyCmd);

			// Destroy staging buffers
			// Note: Staging buffer must not be deleted before the copies have been submitted and executed
			vkDestroyBuffer(device, stagingBuffers.vertices.buffer, nullptr);
			vkFreeMemory(device, stagingBuffers.vertices.memory, nullptr);
			vkDestroyBuffer(device, stagingBuffers.indices.buffer, nullptr);
			vkFreeMemory(device, stagingBuffers.indices.memory, nullptr);
}

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

Я ничего вообще не прописываю. Только составляю схемы!

metaprog
() автор топика
Ответ на: комментарий от Deleted

Составлять схемы с таким количеством функций, переменных и типов будет значительно проще чем писать.

metaprog
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.