Это копия, сохраненная 8 июля 2019 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Ответы на все вопросы - http://en.cppreference.com/w/ http://www.cplusplus.com/reference/
на самом деле это тред №88
87++
Пиздишь, номера еще в 2016 за сотню перевалили.
Будет в 20 стандарте
чтобы роботала магия виртуальных функций, чтобы был динамический полиморфизм
91, со всеми пропусками.
Лучше мизинец, его не жалко.
А в чём может быть проблема? В Qt достаточно удобные средства для работы с сетью, и клиент-серверная модель уже реализована.
Ребята я давно не спал и плохо говорить по-русски, но по другому я не могу. Я пишу some shitty code в IDE MS Visual Studio 2015, мне нужно чтобы когда я подгружаю в DataGridView свои данные из разных таблиц БД, этот элемент не менял свои размеры, нужно чтобы ширана столбцов растягивалась или сужалась но в совокупности всегда была одна ширина элемента. На текст в таблице не обращайте внимания это рыба.
Пример, пик1. Все заебись, таблица ровно такого размера как надо.
Пик 2. По ширине пиздец, таблица уменьшилась. На высоту похуй.
Я пробовал играться с автосайзом для строк и столбцов, а также принудительно ставить размеры элемента после подгрузки -- толку 0.
Надеюсь есть способ сделать то что нужно.
Пишу я на C++ обычно в консоли с чистым CLI компилируя gcc, тут же доебались со своим интерфейсом и загнали в студию от мелкомягких. Писать интерфейс я привык в Delphi от еще борланда и это нечто от редмонда вызывает у меня растерянность и сонливость.
Спасибо. Все работает.
Узел списка Комната с член-данными ширина (float), длина (double) и цвет стен (char *). Реализовать член-функцию «получение элемента с заданным порядковым номером»
Я бы хотел добротно заплатить тому, кто мне поможет, но так как я нищий и на 1к рублей мне жить еще месяц, могу лишь закинуть 50 рублей, только прикрепите сразу свой кошель в ответу, чтоб я левым людям не кинул.
пикрандом
В односвязном списке по определению же у каждого элемента есть указатель на следующий элемент.
https://prog-cpp.ru/data-ols/
Тут описано, как инициализировать и выводить все элементы, если тебе нужен конкретный, просто сделай цикл for(в теле цикла переход через указатели от элемента к элементу), пока не дойдет до элемента с нужным номером, и потом выведешь значения, на которые указывает полученный указатель.
Уже качаю полную студию, 5 гигабайт. Еле сдерживаюсь, чтоб не побежать в город обзывать каждого первого потребителя продукции МенструалсофтКорпорейшн говноедом и получать за это пизды. Это ж как, сука, надо смерти не бояться, чтоб не выпускать инструменты без IDE отдельным релизом.
Приведи пример данных и что у тебя за класс?
template<class T, class... Args>
void do_smth(std::size_t n, Args&&... args)
{
T^^ arr = new T^[n];
std::for_each(arr, arr + n, [&](auto& p){p = new T(std::forward<Args>(args)...);});
// do something
std::for_each(arr, arr + n, [&](auto& p){delete p;});
delete[] arr;
}
Домик замени на звёздочку.
Пример применения
struct A
{
A(int a, float b, char c) : a_(a), b_(b), c_(c){}
int a_;
float b_;
char c_;
};
int main()
{
do_smth<A>(10, 1, 2, 'a');
}
>Нахуя можно
Постановка вопроса наивная, пиши прямо -- "нахуя нужно".
>приватные виртуальные функции при наследовании
Имеется в виду нечто с комплексной характеристикой, "грубо говоря" свойства перечисляются. Что же, начнем читать как компилятор "с лево на право" попутно выстраивая собственный комплексный ответ
>при наследовании
Очевидно речь идет о ООП, какое именно наследование не указано, тогда берем самый простой "публичный одиночный" вариант, таким образом что - то закладывается в описание класса, дабы иметь возможность унаследовать сие в потомках данного СК.
>виртуальные функции
Опять же, ЭМНИП, используются для явного указания компилятору необходиомсти вызова тех или иных функций относящихся к тем или иным классам при преобладании ссылок. Что очень кстати при наследовании методов.
>приватные
Ну, а, собственно, с хуя ли, у нас, в ООП, должны, появляться функции, работающие с датой экземпляра класса напрямую, при этом, не являющимися приватными ? Опять же стоит учитывать особенности наследования.
В общем - то, нужно это все, как и все остальное в языках, в т.ч объектно ориентированных, дабы ты мог описать решение конкретной, иногда достаточно специфичной , задачи на пальцах компьютеру. Задачи, в которых релевантно использование ООП в целом, как - правило, имеют те или иные нотации в отношении того что должно наследоваться, куда, как работать в связке/ссылке на объекты в т.ч иных и родственных классов, вот для того чтобы полно описать решение, язык предоставляет соответсвующие способности.
1>MSVCRTD.lib(exe_main.obj) : error LNK2019: ссылка на неразрешенный внешний символ _main в функции "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ)
1>C:\Users\sudo\source\repos\Множества символов\Debug\Множества символов.exe : fatal error LNK1120: неразрешенных внешних элементов: 1
Как исправить?
>Нахуя можно делать приватные виртуальные функции при наследовании?
герб саттер "новые сложные задачи на с++", задача 18
детальный ответ на твой вопрос
если кратко - есть способы проектирования архитектуры приложения, когда вообще нет открытых виртуальных функций, такой подход сохраняет популярность
А как ты получаешь длину строки для создания динамического массива, если ты не знаешь заранее сколько будет элементов в массиве?
Это очень сильно тупо.
Да и с каких пор в школах учат программирование? Ещё и в восьмом классе. Да ещё и на крестах.
Откуда динамический массив будет узнавать насколько ему расширяться, если ты ему не предоставляешь конкретное число, получаемое прямо во время работы программы?
Зачем ему знать на сколько расширяться если он может просто увеличиться в джва раза?
У тебя массивы прям как твоя мамка, а твой код наверняка может потягаться даже с поделиями индусов.
Хотя у меня там цвет стен не char, а string, но ты это поправишь.
Java(script?)?
язык 19ти летних полубогов, получающих на изичах 3к в месяц на удаленочке
крестоблядки же на такую зп годам к 35 выходят и то если вьябывать
Рокет саенс это просто C, так что круг сужается еще больше.
Мне надо скомпилировать код, использующий библиотеку, которая в свою очередь скомпилировано майкрософтовским компилятором. Ставить для этого Шиндовз10 с .NET Framework 4.6 как-то неохото. Я вообще ни шага в разребании этой задачи не могу сделать, не пробубнев четырежды "виндоюзеры говноеды".
> #include <GL/glut.h>
Но у меня тупо нет этого файла. Что делать-то?
Если она не установлена, почему здесь присутствует папка GL? Тут есть все, кроме glut.h.
Это то, что твои пальцы должны набрать в гугле перед тем, как пойти нахуй, долбоёб.
пиздец, при поиске ответа на вопрос не использовать гугл как первую инстанцию. выпились
Можно считывать данные посимвольно и каждый шаг расширять массив на 1 элементбудет выдяляться новыц массив нужной длины и туда будет уопироваться содержимое старого - такое себе.занятие
Можно выделять память блоками по 256 байт например. А потом еще можно обрезать. А можно не обрезать, если тебе памяти жалко.
Если не ошибаюсь, glut это более старая версия. Сейчас используется glad. Вот тут гайд неплохой, я по нему поставил в итоге https://learnopengl.com/Getting-started/OpenGL
Может потому что glut уже лет двадцать не поддерживается? Или потому что это ОТДЕЛЬНАЯ БЛЯДЬ БИБЛИОТЕКА? Где ты вообще откопал код, который юзает glut? Ты хочешь буквы рисовать?
Он хоть и грубый, но я с ним согласен. Тебе прямо сказали что надо гуглить, и ты вместо гугла задал вопрос анону. Даже если не брать во внимание саму тупость этой ситуации, как думаешь, кто тебе быстрее ответит - гугл или анон?
>Где ты вообще откопал код, который юзает glut?
Статья на хабре... 2011 года. Не обратил внимания на дату. Как я понял, сейчас вместо glut юзают freeglut, так? Мне нужно его самостоятельно собрать?
https://habr.com/ru/post/111175/
Вроде там бинарники выкладывают, но лучше конечно самому собрать. А лучше, как анон выше писал, перейти на GLAD
Спасибо. Вот только бинарников я не нашел, но зато смог с горем пополам собрать эту срань с помощью CMake. А чем GLAD лучше freeglut?
void __fastcall TForm1::Button1Click(TObject Sender)
{
Memo1->Lines->Clear();
int A[4]; int B[5];
int m;
String One, Many;
for(int i = 5000; i < 10000; i++)
{
One = IntToStr(i);
for(int j = 0; j < 4; j++)
A[j] = StrToInt(One[j + 1]);
if(A[0] & 1) continue;
m = i 2;
Many = IntToStr(m);
for(int j = 0; j < 5; j++)
B[j] = StrToInt(Many[j + 1]);
if((B[1] == A[3]) && (B[2] == A[0]) && (B[4] == A[0]))
{
Memo1->Lines->Add("ОДИН - " + One);
Memo1->Lines->Add("МНОГО - " + Many);
Memo1->Lines->Add("");
}
}
}
Какого блядь хуя ей надо - то, а ? В Delphi я спокойно могу из одной формы, например, ебануть visible другой формы. Forname.visible ... траляля. Здесь же, сука, нихуя не получается, это говно ноет и срет ошибками. Как мне их одной формы убить другую, изменить что - то хотя бы
Вот сука, банально блядь. Как же в этой ссаной студии все через депу сделано сука. Берем елемент нейм, хуяим ему метод- событие. Переименовываем элемент нейм. А событие так и останется с прошлым именем. Вот блядь, какой даун это придумол сука.
С этими же формами. Какого хуя у меня в таком хуевом object basic это делается одной строчкой, а здесь я должен гуглить, объявлять их друг у друга, ебаться с сылками и статичностью.
Тьфу, блядь, ебля ради ебли as is
std::for_each(iter.begin(), iter.end(),
[] (auto element)
{
...element...
});
При этом в лямбде сам элемент, а как использовать не элемент, а его итератор?
никак
Проще тогда уж написать обычный цикл с итератором
зачастую оказывается достаточно написать обобщенную свободную функцию, которая принимает итераторы, что поддерживает этот контейнер и все
напишешь что за функционал тебе нужен, может напишу и требуемую функцию
а вообще от контейнеров не наследуются, а агрегируют их
а делать как ты предлагаешь - вообще нехорошо
мда хех
timer = startExecution("single-thread");
stopExecution("single-thread", timer);
MatrixMult(A, B, C);
джун на крестах, 20 тр в москве
нужно выполнить тестовое задание, а именно: реализовать пул памяти, используя virtualalloc, срок выполнения - три дня
велком
как можно получить символ юникода в std::wstring зная его код.
Пример:
Надо получить std::wstring res = "血";
Имеется:
std::wstring test = "8840" - юникод японского символа.
создать его из двух строк "\u" + "8840" нельзя, на стэк оверфлоу есть тема: https://stackoverflow.com/questions/47915811/c-adding-u-to-string
Есть ли способы создания символов динамически? Или как я могу еще преобразовать его в эту залупу 血?
Уже сменил несколько бутылок
Покажи, где снулю, вчерашнему студенту, плотят 100к?
Может оно у них там и называется "джуниором", но ловить там нехрена без 2+ лет опыта и знания всякой херни, которая по объему в 10 раз превышает собственно сам js. Да и в этом случае нужно очень плотно к собеседованию готовиться.
Это никак не доказывает, что снулем можно вкатиться и получать 100к.
Знакомый с моей мухосране работает жс-мидлом или около того, получает 80 начинал кстати с 25к. Хотет перекатиться в ДС. Только хотелка съеживается, как до поиска работы дело доходит.
Сложно что-ли? Обычную обертку над винапи просят написать. Такое каждый джун должен уметь делать. Для 50к норм работа.
Большой объем кода или там надо разбираться в api и тд?
Есть условный shape, есть circle и triangle.
Создаю я фактори для них c createShape и т.д. В коде создаю вектор shape и пушбэкаю в них через circle\triangle_factory. Вроде бы все работает и красиво, но если в конструкторах circle и triangle разное колво аргументов? Как заставить все работать с createShape с разным колвом аргументов?
Так же если у меня в circle условно дополнительные переменные и сеттер\геттер, как мне к ним получить доступ? После пушбека в массив v[0]. видит только функции с Shape но никак не с circle\triangle. Подскажите плз, всю голову сломал уже. (И да, использование фактори обязательно и принципиально)
vector<shape*> v;
v.pushback(circle_factory->createShape());
v[0]. и вот тут видны только функции с shape, как мне обнаружить еще и с класса circle?
dynamic_cast<Circle звездочка>(v[0])
Но если ты знаешь, что там будет именно Circle звёздочка, почему бы не хранить именно его?
>и вот тут видны только функции с shape
Это как бы подразумевается. Фабрика обычно делает объекты с одинаковым интерфейсом но разными имплементациями.
- итак, в коннект с использованием SIGNAL/SLOT макросов обычно пишут имя ф-и и типы всех параметров (тут 8 int), а у тебя один int. Обычно я использую версии коннекта с передачей адресов методов, так что честно хз можно ли так. Знаю что можно коннектиться к сигналу, если у сигнала количество параметров больше или равно каличеству параметров слота.
- НАХУЯ ты коннектишься к QHBoxLayout, если надо к объекту твоего Widget-а?
- я заебался считать количество аргументов, то ли их 9, то ли 8. Когда надо передать дохуя параметров не поленись сделать струкруру и емитить ее по ссылке;
- в основном окне, данные из LineEdit-ов используются только в слоте нажатия кнопки? Тогда делай их как локальные переменные, а не как члены класса.
- solutionWindow как-то удаляется после создания? Если нет, то или родителя передавай и ставь флаг, что это окно, или устанавливай аттрибут Qt::WA_DeleteOnClose. А то утечка памяти получается.
- в том виде как на пиках, я вообще не вижу смысла в этом сигнале. Так как solutionWindow создается каждый раз, и данные расчитываются в том же методе. Проще сделать solutionWindow-у публичный метод setData и вызывать его.
- лучше приконектится к сигналу QPushButton-а clicked чем к pressed. Имхо конечно, тут уже ты сам определяешь поведение.
- ну по стилю - старайся придерживаться однообразного названия классов, переменных и тд, а то у тебя то с большой буквы, то с маленькой.
Спасибо, что то понял, а что то нет, я слабо понимаю к чему коннектиться, потому что QHBoxLayout из widget недоступен в solutionwindow, поэтому я хз что тут приконнектить, чтобы оно передавало данные, сейчас попытаюсь детальнее разъяснить что должно получиться, во втором окне, мне нужно
расписать вот такое же решение https://electroandi.ru/toe/metod/metod-konturnykh-tokov-reshenie-zadach.html только с использованием чисел из первого окна, я сделал в функции нажатия кнопки весь расчёт, тоесть хочу передать рассчитанные данные и исходные во второе окно, чтобы просто оформить, но оно просто не выполняется, значит в connect я прописал некорректно, получается осталось разобраться что нужно коннектить чтобы данные передавались именно во второе окно.
vector < vector<pair<int,int>>
а не
< vector<pair<int,int>>
Так а что делать, если надо "не обычно" ?
на твоем уровне понимания можно просто перегрузить createShape
а вообще это требует виртуального конструктора, прямой поддержки которого в с++ нет и обычно реализуется через паттерн фабричный метод
Это и есть матрица смежности, просто ее разреженный вариант (sparse vs dense). Лучше экономией памяти, если у тебя граф большой и имеет мало связей, не нужно нули хранить.
Да что там писать-то? Винапи если знаешь нужные и ООП основы, то за 1 вечер написать можно. Хуй знает что ты там аж 3 дня собрался писать.
Я точно знаю, что ошибка в инициализации массива указателей на имена, только где эта ошибка хуй его знает. Сразу говорю, что только только вкатился в ООП, поэтому не шарю практически нихуя, начал изучать наследование.
https://pastebin.com/AedmXB9d
должно быть как минимум temp[j][0] < temp[min][0], потому что ты сравнивать должен первые символы, а не указатели на строки.
А так вам дали std::string, а вы ебетесь с указателями. Ну ебитесь
Я просто недавно выкатился с си, братан
По-моему там вообще указатели на объекты, не?
Кстате в ифе делал через ★temp[j]<★temp[min] что эквивалентно тому что ты написал, но тож не получалось
Вкатывайся в стандартную библиотеку, сортировка будет в одну строчку.
Все равно не работает, брат
Пробовал ещё просто в цикле в отдельном методе выводить имена, в итоге выводилось куча букв М и в конце первое имя и так на каждой строчке
город высасывает энергию
около природы жить идеально
Под "пулом" я понимаю fixed-size block allocator. Если пул не растущий и размер фиксирован, то за пару часов можно спокойно реализовать, если понимаешь принцип. Выделяешь память на N страниц, создаёшь где-то фри-лист (или в самих ячейках хранить, как емнип делает dlmalloc). new - снимаешь с листа, free - выдаёшь с листа. Всё, он даже уже почти thread-safe, раскидать атомиков только. Если растущий пул, то надо ещё логику управления выделенными страницами, не очень сложно.
Но вот если случайный размер (general purpose allocator), тогда дело сложное. В принципе можно просто добавить к предыдущей реализации слияние смежных блоков, чуть подкрутить того и сего, но если ты хочешь действительно хороший аллокатор, тебе предстоит веселиться с политикой нахождением блока (best fit, first fit, разделение на бины), фрагментацией и скоростью всего этого дела. Но его и не просят, так что не парься.
Быстрое гугление навело на Доббса, где приводится код growing fixed-size block allocator, где фри-лист хранится в самих ячейках. http://www.drdobbs.com/a-quick-and-simple-memory-allocator/184403440
одна из главных фич пулов памяти - это то, что его легко снести когда станет ненужным
такая модель хорошо ложится на некоторые типы задач, когда проэкт на сях написан
но я не понимаю как сделать полезным эту фичу в крестах
видимо, поэтому пулы памяти в крестах и не прижились
но это все мои догадки, тк на практике я их не делал и не применял
вот ты пишешь что сделал бы за 2 часа, а я, хотя и понимаю что надо делать, делал бы месяца 3, не меньше
плюс экономится размер памяти за счет того что внутренние обслуживающие структуры памяти меньше размера занимают (не надо размер блока помнить, он фиксированный)
>такая модель хорошо ложится на некоторые типы задач, когда проэкт на сях написан
>но я не понимаю как сделать полезным эту фичу в крестах
Какая разница, на чём написан проект? Пулы и аллокаторы используются всегда для одних и тех же целей: уменьшить число аллокаций, когда у тебя много мелких объектов одного типа постоянно приходит и уходит. Неважно, Си, Плюсы. Пулы объектов даже на джаве были (хотя с новыми JVM особо и не нужны они).
>вот ты пишешь что сделал бы за 2 часа, а я, хотя и понимаю что надо делать, делал бы месяца 3, не меньше
Ты три месяца будешь делать 1 (один) связный список?
Напиши оператор < и не ебя голову сравнивай ОБЪЕКТЫ
1) Как обстоят дела с вакансиями в вашем городе (не беру в расчет ДС/ДС2) для новчиков без опыта работы. Например, в моем городе (Ростов-на-Дону) таких вообще нет. Все в основном от мидла и выше. Так вот вопрос - как начинают свой путь программисты на C++? Неужели переходят с других языков? Хотя мне казалось, что его многие учат первым. Я, например, в универе его учил первым по программе.
2) Для программирования в никсах вообще стоит рассматривать C++ сейчас? Или же до сих пор все модули - это чистый C, в большинстве своем?
И вдогонку вопрос: какие целевые области применения для разработки на крестах вы видите на данный момент?
Значит ли это, что сейчас в кресты вкатываться не имеет смысла даже уже имея какое-то минимальное представление о программировании на них
>Так вот вопрос - как начинают свой путь программисты на C++
Несколько лет сосал хуйцы на госзаводе. И даже там я не был джуном. Со всеми проблемами ебался сам, на качество моего кода всем было похуй. Но я дохуя читал хороших книжек. А кто не читал до сих пор на этом заводе.
>Для программирования в никсах вообще стоит рассматривать C++ сейчас?
Ты про никсы или про ядро никсов? Потому что это две большие разницы
>>05034
Это примерно как пойти в макдак сейчас или поучиться и пойти в макдак стать специалистом. Кресты это высокий порог вхождения, со всеми достоинствами и недостатками. Работа будет.
Не вижу особого смысла. Очень несовременный язык, который применяется либо в легаси десктопе, который писали ещё тогда, когда кресты не проиграли эту нишу шарпу, либо в рокет саенс, где надо нереально въебывать и очень хорошо разбираться в математике или архитектуре пк. В первом случае зп нищенские, во втором на уровне джавистов, ненапряжно пишущих круд.
>джавистов, ненапряжно
Бабка на двое сказала.
Мне, например, общество математиков куда как более приятно.
Просто не всем приятно заниматься тяжёлым интеллектуальным трудом, а получать на уровне крудошлепа. Кресты это призвание.
>>05046
>Ты про никсы или про ядро никсов?
Да, я про ядро. Знаю, что в окружении, вроде как, и так часто qt и c++ используют
>>05113
>вкатываться в С++ смысла ровно 0, иди во фронтэнд
Мне уж ближе бэк тогда, я думаю. Правда вот PHP не особо близок. Но он вроде как и бэке и во фронте обязателен к изучению. Ну и еще сейчас есть вариант быстро перекатиться в iOS разработку, но вот как-то немного смущает узкая специализация свифта под продукты Apple (хотя и мак и айфон у меня для изучения есть).
https://pastebin.com/fVmkDcKj
У тебя A это объект типа Student i-ый, а не значение поля numb этого объекта.
Тебе надо обращаться через оператор точку к полям или стрелку, если через указатель.
Спасибо, бро
операторы >> и << лучше не трогать для начала. Когда про перегрузку операторов узнаешь, там понятно станет. Алсо, пока перегружать эмодзи нельзя, терпеть можно
Это значит что в каждом элементе вектора содержится вектор в котором содержится пара.
Я в курсе. Это же просто пример.
>Несколько лет сосал хуйцы на госзаводе
Анонче, нахожусь в такой ситуации - сосу хуйцы на госзаводе. По городу вакансий на плюсах нет, кроме как на мой завод. Дай советов мудрых как выкатится с этой безнадеги.
инб4 читать хорошие книжки.
while (scanf ("%d%d", &n, &m) == 2) {
for (int i = 1; i <= n; i++) {
int a;
assert (scanf ("%d", &a) == 1);
...
}
Причем тут кресты, это сишечка.
Первому сканфу кормишь два целых через пробел, второму просто целые.
Делает непонятно что.
Нет
Зачем в зависимостях таргета ставят "Makefile"? То есть,
>build/main.o: main.c Makefile
> $(CC) ....
Что тут делает "Makefile"? Всё работает и без него. Заггулить невозможно, все ответы просто о таргетах в makefile'ах, а не необорот.
Таки нагуглил, всем спасибо.
https://stackoverflow.com/questions/14601721/makefile-as-a-dependency-for-a-make-target
Перегрузку >> и << для I/O делали наркоманы, когда С++ был еще хипстерским андерграундом. Сейчас комитет такую хуйню никогда бы не пропустил. Сделали бы через функции get/set (in/out).
соответствующая глава во втором издании "шаблонов" вандервуда, если ты только начал разбираться
из классики - александреску
шалбонное метапрограммирование на крестах постоянно эволюционирует и видоизменяется, проще всего отслеживать это просматривая соответствующие доклады с конференций
https://www.youtube.com/watch?v=IF51Gsu3Cec
плюс смотришь как развиваются соответствующие библиотеки в boost:
https://www.boost.org/doc/libs/?view=category_metaprogramming
но дзен заключается в том, что шаблонное метапрограммирование ты изучаешь не более чем как для собственного развлечения, типа такое хобби, на практике ты его врят ли будешь применять
те нужно принять то что ты просто так развлекаешься и смириться
и типа она универсальная - обеспечивает метавычисления как на значениях так и на типах
glut\freeglut\flfw\sdl2 и тд и тп это библиотеки для создания контекста. То есть окошка и обработка сообщений от ОС: клавиатура\мышка\джойстик и тд.
Там, конечно, не только этот функционал. Разработчики добавляют что-то своё.
Glut\freeglut не рекомендуется использовать. Они устарели и давно не обновлялись.
Почему эти библиотеки во всех примерах сочетают (glad+glfw3, glad+sdl2, glut+glew и т.п.)?
glad и glew это библиотеки которые подгружают расширения для Opengl
Чтобы тебе каждую функцию писать вручную не пришлось.
Почитай основы: https://github.com/glcoder/gl33lessons
>, на практике ты его врят ли будешь применять
>те нужно принять то что ты просто так развлекаешься и смириться
Не проецируй=)
[code]
for(;;) {
static int c=0;
c++;
}
[/code]
Где этот статик вообще бля??
Пикрелейтед
>>06582
Выделяется при старте программы, освобождается при выходе
>>06588
Класс фигур с енумом в качестве типа фигуры чтобы можно было повышать пешки. Хранят также был ли первый ход, опять же для пешек.
Двумерный массив с указателями на фигуры в качестве доски.
Класс контроллер определяющий возможные ходы, хранящий была ли рокировка и ТП
Наверное ещё класс ход для визуализации, записи партий и отката ходов.
По идее это стек, но static используется, чтобы локальные переменные имели время жизни такое же, как глобальные переменные.
писать в структурном си стиле: только функции и базовые управляющие конструкции - циклы и ветвления
как то так
если ты способен применить техники шаблонного метапрограммирования на продакшене, четко осознавая что есть в этом необходимость, то за твой скилл и твое место работы можно только порадоваться-позавидовать
Нет, фигура отдельный абстрактный класс. А доска обьединяет в себе фигуры и клетки. Но изнутри фигуры мне нужно обьединить сигнал Qt-шный с слотом доски, и вызывать некоторые функции при построении вектора для хода/атаки фигуры. Вот недавно какой-то баг обнаружил, что фигура при инициализации делает какую-то хуйню с доской которую я передаю по указателю, в результате чего указатель не равен nullptr, но при этом данные его не валидны, и при попытке вызвать какой-то метод программа крашится с SEGFAULT. Потому и спрашиваю, как можно огранизовать иерархию классов, чтобы фигуры и клетки не могли навредить доске, но при этом имели доступ к ее методам. Книжку про паттерны я не читал
Я пока сам только осиливаю ООП, но попробовал бы так: есть класс клетки, который может быть черный/белый, пуст/занят, такой-то фигурой, если занят. А ещё лучше - внутри указатель на объект класса "фигура", в котором записана своя логика ходов и всего остального, если он nullptr - то клетка свободна.
А доска - это класс, наследующий от контейнера, содержащего объекты класса "клетки", т.е. вектор векторов клеток и доопределенные методы, чтобы объекты класса "игрок" дёргали свои фигуры.
Но я только учусь быдлокодер, потому эта схема вряд ли хороша.
> потому эта схема вряд ли хороша.
Да нормальна. Ни к чему все эти усложнения. Доска обычный массив структур. Структура (как ты и описал) имеет цвет, какой-нибудь внутренний индекс для расчёта ходов, указатель на фигуру.
Иерархия классов против SEGFAULT не поможет. Ты просто хуйню какую-то делал. Ограничивай количество действий которые можно сделать через публичный интерфейс. К примеру если тебе нужно чекать может ли какая-то фигура перейти на какую-то клетку, то ты вызываешь метод доски который это чекает. А не вытаскиваешь (через указатель на доску) кучу инфы (например о других фигурах) в метод фигуры и там ковыряешся потенциально что-то ломая. Можешь ограничивать доступные методы. Например, если твоей фигуре от доски нужены только методы "проверить возможность хода" и "переместить меня", то ты можешь создать абстрактный класс BoardDelegate (например) с двумя этими методами, доску отнаследовать от нее, а указатель на доску в классе фигуры объявить не как указатель на доску, а как указатель на BoardDelegate. И тогда твоя фигура сможет вызывать только этих два метода доски.
Какой путь лучше выбрать?
Использовать Vulkan (opengl, directx)?
Или же как-то сохранять в numpy массивы, а затем загружать в питон?
Или лучше сразу написать враппер моих классов для того же питона, и там уже сделать визуализацию?
Да баг с сегфолтом я уже нашел и пофиксил, просто после него задумался об проектировании, чтобы таких ошибок изначально не возникало. Про делегат спасибо, сейчас что-то такое попробую сделать
Увы, но вся суть лаб и ргз классы.
https://ravesli.com/uroki-cpp/
Читать и пробовать. Но за неделю ты много не изучишь. Готовься к пересдаче лучше.
> создать абстрактный класс BoardDelegate (например) с двумя этими методами, доску отнаследовать от нее
Где про подобное можно почитать по подробнее?
надо перевести терминал в какой-то там видеорежим, но это типа древняя хуйня, короче, можешь курить borland C через DOSBox,а можешь левую графическую либу юзать, но это не точно, сосите хуй, честь имею
А все же питон использовать есть резон? Данные потом хотел математически покрутить
дзен заключается в том что раньше (до новых стандартов) в метапрограммировании на шаблонах приходилось использовать техники функционального программирования, а конкретно:
метавычисления на типах вообще не могли изменять состояния своих сущьностей, которыми оперировали, тебе приходилось не изменять состояние, а производить новые состояния; метавычисления на значениях были оче ограничены и ты тоже мало мог че поделать, тоже приходилось не изменять, а порождать новые значения
вместо итерации приходилось использовать рекурсию
вместо условного оператора приходилось использовать по сути вариант патерн-матчинга в виде комбинации частичных специализаций и sfinae
в новых стандартах многие метавычисления (как на типах так и на значениях) уже можно делать императивным способом, так гораздо наглядней и понятней получается
это то что касается компайл-тайм
реал-тайм лень расписывать
ебанись, ни в одном вузе такой обскур тебе не будут рассказывать, студентосы просто вообще не врубят че это такое, нах
Хуйню какую-то написал. Есть сегмент данных, размер которого фиксирован, есть сегмент кучи, который идет за ним в адресном пространстве, и есть сегмент стека, который растет с верхних адресов вниз.
берешь boost.hana, разбираешься, смотришь зачем, смотришь как внутри сделано
понимаешь что это нахуй не нужно, а только поиграться
все
Можешь ещё в gnuplot перегонять данные
https://developercommunity.visualstudio.com/comments/583321/view.html
Ответы разрабов это вообще пиздец
Ответ от домохозяек для домохозяек. Ты хоть про какой формат исполняемых файлов, ос и рантайм говоришь?
>баг в студии
Причём тут иде вообще к языку? Я вообще иде не пользуюсь, build.sh в сосноли запускаю и всё.
Причём тут лабы, лол, я про рабочий проект. Ты может охуеешь, но для конпеляции не нужно вообще ничего, кроме конпелятора.
Вообще чего тебе такого даёт иде? Для редактирования есть тот же vs code, для отладки gdb. И смысл в иде?
К тому же там инклюды какие-то вонючие подключаются ( stdafx.h) и есть отличия от стандарта и баги как выше писали. Одни минусы и ноль полезности при злоебучей тяжеловесности. Такое говно. А ты говноед.
>отличия от стандарта
https://docs.microsoft.com/en-us/cpp/cpp/nonstandard-behavior?view=vs-2019
По сути пользуясь их иде ты пишешь на некотором диалекте плюсов, короче говно говно говно.
Насколько большой у тебя проект? Хотя бы LOC метрику приведи.
>>07093
> Вообще чего тебе такого даёт иде?
Конкретно студия - почти ничего. Но вместе с решарпером становится гораздо удобнее и быстрее кодировать.
> для отладки gdb.
Не удобно дебажить без контекста.
>>07094
> К тому же там инклюды какие-то вонючие подключаются ( stdafx.h)
Без комментариев. Почитай про precompiled headers.
>>07096
> По сути пользуясь их иде ты пишешь на некотором диалекте плюсов
Ну кто же виноват, что ты решил наговнокодить?
¯\_( ° ʖ °)_/¯
Может ещё gnu extensions вспомнить?
> stdafx.h
Это предкомпилированный заголовок, ты можешь туда всякие инклюды добавлять часто используемые, чтобы сохранить время.
И это кстати отключается одной галочкой, если не нужно.
>Насколько большой у тебя проект? Хотя бы LOC метрику приведи.
Огромная либа, сравнимая с STL по размеру.
>решарпер
Всё есть в вскоде том же.
>прекомпилед хедерс, можно отключить
Да какая разница, зачем вообще иде что-то добавляет отсебятину какую-то, если можно без этого?
>наговнокодить
Одно дело экстеншн, который добавляет новое, но со стандартом не расходится, другое это именно расхождение. Ну да пох, это уже не иде, а компилер, а в студию любой компилер можно вставить по идее.
В общем возвращаясь к началу, баг в студии никаким раком не относится к static, есть стандарт, который описывает как должно быть, а есть всякое мелкомягкое васянство, которое к делу не относится.
> не относится к static
Ну не относится к описанному в стандарте static. Мало ли чё они там заговнокодили у себя, их дело, всё равно нормальные люди их говно не юзают.
>ты можешь туда всякие инклюды добавлять часто используемые, чтобы сохранить время.
Бля, а сам я создать такой хедер с инклюдами типа не могу, религия не позволит или че? Нахуя мне это говно пихать, меня вот лично это бесит.
> Огромная либа, сравнимая с STL по размеру.
То есть у тебя хватает знаний, чтобы писать библиотеки, но ты не знаешь, что такое pch? Наркоман?
> vscode
Что есть? Зачем мне ещё один браузер на компьютере?
> Да какая разница, зачем вообще иде что-то добавляет отсебятину какую-то, если можно без этого?
Студия добавляет pch потому что ты забыл снять галочку при создании проекта.
> Одно дело экстеншн, который добавляет новое, но со стандартом не расходится, другое это именно расхождение.
Сколько раз из-за этого расхождения у тебя что-то не получалась / ломалось? Как думаешь, увеличится ли это число ближайшие десять лет?
> В общем возвращаясь к началу, баг в студии никаким раком не относится к static, есть стандарт, который описывает как должно быть
Кончено не относится. На то он и баг, а не "расхождение со стандартом".
>ты не знаешь, что такое pch
Где я такое говорил?
>Зачем мне ещё один браузер на компьютере?
Не понял, удобный текстовый редактор же.
> забыл снять галочку
Это они забыли её не делать поставленной по умолчанию, а не я забыл снять. В том же гцц всё намного лучше сделано, если тебе нужно прекомпилед хедер создаёшь хедер с инклюдами например и компилишь в .gch и никакого бугурта, а тут за тебя решили как тебе удобнее, меня такое отношение бесит, например.
>Сколько раз из-за этого расхождения у тебя что-то не получалась
Нисколько, я не юзаю микрософтовский компилер потому что.
>На то он и баг,
Не относится он потому что чувак спрашивал про С++, а С++ <=> стандарт, чем является ключевое слово статик в имплементации мелкомягких и где там у них баги дело десятое, понимаешь? А ты так написал(или не ты, тот анон в общем), будто плюсы равносильно визуал студии, на мой ответ с доходчивой табличкой со скоупами/временем жизни/линковкой ответ был мол скажи это студии, чего блядь, причём тут ИДЕ вообще? Я считаю, что у меня полыхнуло совершенно обоснованно.
Визуал студио пользуюсь и компилю там же. Не понимаю дебилов, которые сидят на clang'e на какой-нибудь пингвибунте и дрочат вим.
Ты бесплатную версию качал, community или как там она называется?
Устаю, дома не часто что-то пилю, но бывает нахлынет вдохновение допилить недопиленное, ну ты понел.
Помогите все разумные способы написания "Вuжуал Сtyдия" придумать, не могу автоскрытие настроить, то и дело какой-то ребенок со своим WinAPI прорывается, и из треда сразу выйти хочется еще на 20 реинкарнаций.
ВСтудия, КютКреатор с мингв и гцц, дома ничего не делаю.
а я понял, что бы эту переменную не зашкварили снаружи, на хуй так надо делать? Что-то вроде замыкания?
Это чтобы функция сохраняла значения каких то параметров от предыдущего вызова этой функции. Это еще в сишке сделали, например чтобы функция генерации псевдослучайных чисел использовала предыдущее значение для генерации следующего, и хранилось бы оно только в одном месте.
статик переменная даёт статическое время жизни, она создаётся в начале программы и живёт до самого конца программы
те везде, где тебе нужно такое поведение с долгоживущей переменной, юзаешь статик
брат, вот за такое я очень благодарен, охуенно, теперь понял зачем это нужно, брат, где ты такое прочитал? А то в большинстве учебников написано "что", а не "зачем".
"статическое время жизнь" - это блядь откуда такое? Я не выебываюсь, просто уточнить хочу.
>создаётся в начале программы
там вроде гарантируется только то, что будет создана до первого использования. Точный момент создания не регламентирован.
бамп
ну да, имеел ввиду, что с момента создания до конца программы, да, хуёво выразился
Так ты сразу выйди, и больше не заходи, в чем проблема то?
MSVC 2019 и на работе, и дома.
Компилирую MSVC под винду и gcc под юникс. Честно говоря, не вижу особой разницы, ибо весь проект симейком управляется. После генерации на любой ОС остается нажать одну кнопку для полного билда.
Смотря как оптимизатор отработал. У тебя там дамп или что? Если нет, то качай гидру
Свое приложение, а не чужое. Ты меня не правильно понял. Допустим, в дебаге весь жизненный цикл программы прокликал, все работает, а релиз версия крашится, где-то неопределенное поведение. Как дебажить?
Отправил прогу другу. Нормально компилится, но работает неправильно. Там вместо нормального числа образовался nan.
Дело в компиляторе? У меня линукс и дефолтный code bloks. У друга мак. Есть какие-то флаги, которые надо поставить перед компиляцией, чтобы прога нормально работала на любом железе?
Сам использую просто
// g++ -std=c++11 name.cpp
А ты не очень умный
Читать-прогонять полученный асм. Лично я такой баг однажды так и не нашёл после целого дня поиска. Отключил оптимизацию во всём файле, где была ошибка, и забил.
соричи, забыл про эту хуйню, файлы комментом там разделяются?
Шаблоны нельзя писать раздельно в хедере и файле реализации. Вся реализация должна быть в хедере.
в стандарте 98 были прописаны 2 способа - модель включения и экспорт шаблонов
но оказалось что экспорт шаблонов крайне сложно реализовать в компиляторе (пара реализаций все же была) и при этом их полезность оказывается сомнительной
об этом подробно писал саттер в "новых сложных задачах на c++"
>Тыкать пальцем в небо
ни один дебаггер тебе не скажет, что ты забыл обнулить структуру перед использованием. Попробуй мозгами пошевелить чтоле
Выглядит так:
qsort(&points[1], n - 1, sizeof(Point), compare);
Берёшь и сортируешь массив от &points[1] до &points[n-1] с помощью функции compare сам.
Если я правильно понял значения её аргументов то:
using std;
sort(++begin(points), --end(points), compare);
Ясно.
Короче я не послушал всех и сериализовал в бинарник, и выцепил в великолепном питоне через numpy. Потом может прикручу враппер, больно уж годная связка выходит
Визуальная студия, и qt с ней же. На шинде заметно шустрее мингв. Проект ща мсвцшный, но запараллелен с cmake, хоть в нем мне сложна.
Не ебу как это реализовать в "моей" программе
>распараллеливание
В 17х появилось ExecutionPolicy для многих алгоритмов, правда я нигде не видел, чтобы их кто-то использовал.
>векторизацию
Любой компилятор может только самую примитивную векторизацию сделать. Как говорится, _mm256_pishi_sam_pd();
>Я не хочу сам писать треды и обосанные мьютексы
Пиши CAS циклы и wait-free алгоритмы.
Потому, что STL инклудит очень много всякой хуйни. Теоретически - ты можешь "вычленить" нужные тебе контейнеры, практически - очень тяжело.
Мы написали свою строку, вектор, лист, хэш таблицу и всякие мутексы\локгварды.
Зато трайп-трейты в кернел просто копипастятся без проблема.
>>08324
> потому что шаблоны в ядре юзать совсем не комильфо
Кто тебе такую хуйню сказал?
http://cpp.sh/6skm7
93 строка
>Кто тебе такую хуйню сказал?
Хуйня - это когда говнокодеры тащат в ядро плюсы с stlями, эксепшенами и прочей ебалой, а адекватные будут писать на C.
не суди по себе, дружок. Мне клованов на работе хватает, которые свято верят в то, что 6-ая студия генерит самый быстрый код, а все что позже 8-й нахуй не надо. А тут еще ты со своими шаблонами в дровах.
Все хорошо, бро. Все крутые люди когда-то крутыми не были, погружайся в сабжекты, строй таски и улучшайся, не все же время uznay_ebal_li_ya_telku_s_takim_imenem.c компилить.
лучше кнута почитай или нейронку напиши
О, да. Скажи, когда на тебя лает собака на улице, ты становишься на четвереньки и лаешь ей в ответ?
>эти нелепые омежные оправдания
>эти риторические вопросы
Верный признак лоха по жизни, кстати.
Голодный пёсик, держи. Хочешь мы тебе родословную напишем?
Нифига ты тролль.
Но ведь как раз таки на си больше шансов допустить ошибку. Деструкторов нет и ты сам должен освобождать всю выделенную память -> большой шанс забыть про это и получить утечку.
Ты отвечаешь человеку который на вопрос про шаблоны пишет про эксепшоны. Следовательно он или тролль, или дебил, а ты дебил, что его коментишь.
int some_number = 5;
auto func = [&]() ->int
{
return some_number +=2;
};
some_number = func();
А при передаче этой лямбды в другую функцию требуется обертка в виде std::function, т.е. вот это не работает:
using func_ptr = int(звездочка)();
void test(func_ptr func)
{
func();
}
test(func); //ошибка компиляции
Что такого магического делает std::function, что заставляет это работать?
Внезапно, оборачивает лямбду.
Либо принимай std function, либо делай функтор шаблонным параметром
Лямбда это не функция, а функциональный АБ ЪЕКТ, логично, что твой указатель на функцию это вообще другой тип.
#include <iostream>
auto func = [](int& a)
{
return a +=2;
};
using func_ptr = int(*)(int&);
void test(func_ptr f, int& a)
{
f(a);
}
int main()
{
int a = 0;
test(func, a);
std::cout << a << std::endl;
}
Алсо если ты не капчуришь переменные извне, то у лямбды есть конверсия к функшн поинтеру, так что вот так сработает, например.
>a ->int
Явное указание выходного типа теперь избыточно.
>using func_ptr = int(звездочка)();
>void test(func_ptr func)
>{
>func();
>}
И вообще типы лучше нигде явно не указываться если это точно не требуется:
auto test = [](auto func) { func(); };
И кстати лямбда - это выражение языка, описывающее замыкание, а не само замыкание.
есть много способов выстрелить в ногу. Можно и в деструкторе что-то забыть
А какой типо тогда у этого объекта? Как мне кастануть к нему, сделать указатель на такой объект? При наведении курсора на него, показывает что-типо lambda []... , но к такому типу нельзя привести.
А почему то что я захватываю туда что-то вообще имеет значение? Оно туда при компиляции идёт как дополнительный аргумент или что?
Нет, ты вполне можешь использовать шаблоны без эксепшенов, что за дикие ассоциации?
Ну аргументы лямбды Я указываю т.к. если это объект то при попытке доступа к методам или полям этого объекта студия не показывает список со всеми этими свойствами и приходится их вручную самому писать, а не 2-3 первых буквы и дальше стрелочками.
>А какой типо тогда у этого объекта?
У каждого компилятора свое внутреннее представление о типе лямбды если интересно узнать какой именно тип, то читай Маейрса "Эффективный и современный С++", поэтому при присвоении лямбды переменной нужно писать auto или std::function (но в этом случае будет просто неявный каст, поэтому так делать нужно, если очень надо). А для твоего случая лучшим вариантом будет сделать через шаблон:
template<typename Functor>
void test(Functor func)
{
func();
}
И компилятор сам разберется, что ему подставлять.
Ну и что не так с экспепшенами? В ядре тоже обработка исключений. Даже несмотря на то, что их можно просто не использовать, разве нельзя приделать их поддержку?
SEH - это слегка другое, и он не сочается с С++, т.к. не может разматывать стэк, если присутствуют обьекты с деструкторами
Да можно. И эксепшены можно, и все вместе можно,оборачивая в многоуровневые try catch'и. Вопрос в том, как сделать проще и понятнее, с минимумом кода.
вроде в компиляторах крестов при реализации собственных исключений испльзуют seh (или его аналоги в юниксах), но не уверен, где то слышал или читал
нет, исключения из стандарта и SEH - это абсолютно разные вещи. SEH не рекомендуется использовать микрософтом вообще нигде, кроме драйверов, т.к. в драйверах SEH ловит кое-какие проблемы, которые вообще никак не поймать по-другому.
я в книжке рихтера читал что исключения с++ в компиляторе майкрософт используют seh
это было под винду и относительно давно
поэтому и спросил, вдруг кто лучше знает
Если вот эту хуйню на пикриле включить то и SEH исключения тоже ловятся в обычном try catch ведь, значит там где-то всеравно реализуются обработчики сеха.
>так гласит Стандарт
>The closure type for a non-generic lambda-expression with no lambda-capture whose constraints (if any)
are satisfied has a conversion function to pointer to function with C++ language linkage (10.5) having the
same parameter and return types as the closure type’s function call operator.
C++17 International Standard 8.4.5.1:7
>Имени у него нет, поэтому никак ты его не напишешь,
На сам деле можно, просто не нужно:
auto MyLambda = []{};
using MyLambdaType = decltype (MyLambda);
https://ideone.com/fork/ImVc2d
Сделал
while (i <= j) {
while (Comparator(a, v) == true)
++i;
while (Comparator(a, v) == false)
--i;
if (i >= j)
break;
swap(a[i++], a[j--]);
}
Теперь
Вернее как, написал decltype(func(0)), вернуло инт и я такой, ну да, деклтайп не поможет. Пхах, бывает.
Литералом норм получается, а переменной никак.
https://onlinegdb.com/HJe_DI-apN
>не жрать говно и использовать wstring?
Не могу, у меня WinApi головного мозга, там иначе никак
>memcpy?
Это значит, что через фигурные скобочки никак не получится? Только руками в каждый член присваивать?
>Это значит, что через фигурные скобочки никак не получится? Только руками в каждый член присваивать?
Пишешь конструктор и не ебешь мозг. И лучше использовать std::copy вместо memcpy.
Обычные массивы не присваиваются друг-другу. Используй конструктор присваивания, в котором вызывай спец. функцию для копирования.
Тупо сделай конструирующую функцию, например
wchar_t t1[] {L"213123"};
wchar_t t2[] {L"2126783"};
auto makeSample = [](bool fl, gsl::span<wchar_t> s)
{
Sample sam;
sam.flag = fl;
using namespace std;
copy(begin(s), end(s), begin(sam.caption));
return sam;
};
auto s1 = makeSample(true, t1);
auto s2 = makeSample(false, t2);
функцию напиши. В WinAPI жи есть CString, который под юникодом спокойно преобразуется в std::wstring в обе стороны
???
Причем тут С++? А так нормаль к кривой в данной точке это перпендикуляр к касательной в данной точке. А касательную уже легко найти, найдя производную. Но матанализ был 9 лет назад, поэтому могу наврать.
> А касательную уже легко найти, найдя производную.
Это я знаю. Но это работает, только если известна формула графика функции. А у рандомной нарисованной кривой формулы нет.
У тебя есть три точки. Точка через которую нужно провести нормаль и две соседних. Проводишь одну касательную черех центральную точку и соседнюю, и вторую касательную через центральную точку и второю соседнюю. Находишь среднюю между ними - от нее строишь перпендикуляр. По формулам - у тебя есть формула прямой проходящей через заданую точку. Все будет упираться в нахождение коэффициентов (наклона прямой) k. Находишь коэффициент первой касательной (по двум точкам - вычитаешь соотвествующие координаты друг из друга и делишь), находишь коэффициент второй касательной. Потом тебе нужно продумать как именно высчитать средний коэффициент. Потом делаешь над ним очевидные преобразования (чтобы получить перпендикуляр) и всьо.
Я чето не понял твоего поста. Так вайн - это и есть попытка сделать Win32 подсистему для гану-луникса
>у рандомной нарисованной кривой формулы нет
Дык у нее и производная не во всех точках может существовать => в какой-то точке может не быть нормали / быть больше одной нормали.
С другой стороны, в кампухтере все равно это скорее всего будет ебошится численными методами.
Но это эмулятор и не на уровне ядра.
Все правильно. В винде есть 2 типа обработчиков SEH и VEH. Почти везде используется SEH.
Мне вообще изначально похожий метод пришел в голову, но я покумекал насчет него, порисовал в тетрадке, и там хуйня получится скорее всего. Постарался нарисовать. В масштабе пикселей эти нормали будут хаотичными. А должно быть у них у всех направление, как на второй пикче белыми линиями.
Ну тогда тебе как-то сглаживать нужно. Можешь попробывать строить не по соседним точкам, а например через две. Или высчитывать несколько нормалей - одну по соседним точкам, вторую по удаленным и брать среднее. Если тебе именно плавность нужна, то тут наверное в сторону какой-то скользящей средней или чего-то подобного думать надо.
Я уже склоняюсь к тому, что нахрен эти нормали. Все равно для моей основной задачи это плохо подходит. Надо какое-то другое решение.
Но за ответ спасибо.
>два дебила тупят над школьной задачкой коллективно
>так нихуя и не решили
>нормально общаться.
О да.
>построить нормаль к линии на плоскости
>3-4 курс университета
Не знал что есть университеты для счастливых обладателей 47 хромосом (тебя)
косточка для хуесоса, что не так?
Почему auto g = foo.getter() выдаёт мне значение? Авто же вроде как парсит эту хуйню. Конструктор копирования удален.
> Авто же вроде как парсит эту хуйню
Авто выводит тип, а квалификаторы вроде так называются типа (указатель, ссылка, константа) не выводятся.
У рефференса есть незначительное отличие от указателя в том что указатель это (семантически) отдельная сущность (которую, к примеру, можно скопировать), тогда как рефференс (семантически) считается синонимом объекта. На низком уровне это естественно тоже отдельная сущность но на высоком (в тексте программы) когда ты каким-либо образом используешь рефференс считается что ты работаешь именно с самим объектом (на который указывает рефференс). Поэтому, к примеру, нельзя создать именно копию рефференса (естественно не занимаясь какой-то хуйней с reinterpret кастами или чем-то подобным). При
Foo& aaa = foo;
Foo& bbb = aaa;
у тебя во второй строчке не создается копия рефференса аaa, а объявляется новый рефференс bbb на объект foo потому что семантически вторая строчка равноценна Foo& bbb = foo; - потому что aaa это синоним foo а не настоящая самостоятельная сущность. Поэтому и foo.getter() парситься так как будто вместо него указан именно объект (на который указывает рефференс). Почему const пропадает я не могу объяснить, там есть какая-то дрисня с выводом типов (и параметров шаблонов) что иногда отбрасывается самый внешний const, но я так и не смог понять какого хуя. Каким отбразом конструируется новый объект с удаленным коструктором копирования тоже итересный вопрос. У тебя там могут быть неявные касты - полбъявляй остальные конструкторы как implicit. Или может дебагом посмотри каким именно конструктором строится объект и оттуда разбирайся.
Делаю игру. У игрока есть способности (реализованы просто калбеками). Например, создать какую-то сущность на карте или удалить её с карты.
Также имеются режимы игры (для каждого свой набор способностей).
Внутри каждого режима есть свои состояния: подготовка, игровой процесс, конец и тд.
Так вот, при переключении состояния должны, например, заспавнится определённые сущности, появится виджет на экране и тд.
Пока что это сделано теми же калбеками, только их вызывает игра сам игрок к ним доступа не имеет.
Но мне бы не хотелось смешивать это всё в одно.
Может через какой-то паттерн или какую-то йоба приём можно это сделать?
Типа, состояние переключается и посылает эвент, а обработчик на него реагирует в Вов сделано подобное, правда там не для игровой логики это сделано, а для интерфейса?
Ты вроде уже все описал, не? Делаешь машину состояний, задаешь действия при переходе от состояния к состоянию.
https://ru.wikipedia.org/wiki/Автоматное_программирование
> Делаешь машину состояний, задаешь действия при переходе от состояния к состоянию.
Так и сделал.
Там что-то вроде: actionManager.UseAction( "createMap" ); и тп.
Но посчитал что вместо прямого вызова можно сделать по другому.
Всё так у меня.
Сначала меняется состояние, а затем происходят действия (если нужно).
А я хочу чтобы вместо прямого вызова какой-то функции было что-то вроде посылки событий, но кроме обсервера какого-нибудь я ничего не придумал (и кроме того что есть сейчас).
Спасибо. А какой лучше юзать новичку? Чтоб поменьше ебаться и большой репозиторий.
Дайте ссылку на ресурс (сайт/книгу/статью), где можно почитать нахуя этот CMake нужон и как писать на плюсах имея только g++, vim и клавиатуру?
Только не надо затирать о boilerplate. Я хочу понять как работают плюсы.
Желательно чтоб не было заточено под Linux, на работе, к сожалению, винда.
Там просто уроки OpenGL. Мне не это нужно.
>нахуя этот CMake нужон и как писать на плюсах имея только g++, vim и клавиатуру?
Ну так используй Qt с его сигналами-слотами, ну или Boost.Signal, если впадлу заморачиваться с Qt с его moc.
Создаёшь пустой проект, включаешь нужные заголовки opengl, компонуешь с библиотеками opengl и всё.
Если бы всё было так просто и без ошибок, я бы не писал сюда. Я же сказал, ++ слабо знаю.
Забей. Ты вообще о другом.
> двач, как настроить проект на opengl
>> вот тебе инструкция
> нет, хочу сам всё сделать
>> ну тогда сделай то-то и то-то
> иди нахуй быдло у меня ошибки вылазят
Они оба довольно простые, но лучше Конан изучить, он пока что единственный кроссплатформенный.
>нахуя этот CMake нужон
Когда у тебя проект состоит из более чем одного файла laba.cpp, то удобнее использовать утилиты автоматизации сборки. Одной из популярных является make, который жрет Makefile и собирает проект, но из-за того, что язык мейкфайла пиздец какой кривой, то начали создавать генераторы этих мейкфайлов. CMake один из таких генераторов, еще есть qmake например (от Qt).
https://ru.wikipedia.org/wiki/Автоматизация_сборки
>как писать на плюсах имея только g++, vim и клавиатур
Ручками ебана. Пишешь свою ебу, например, в yoba.cpp. Далее в консоли: g++ yoba.cpp -o yoba (флаги компиляции сам посмотришь, какие нужны). Если проект из нескольких файлов, например yoba1.cpp и yoba2.cpp, то каждый
файл сначала компилишь в объектный файл, а потом собираешь вместе:
g++ yoba1.cpp -c yoba1.o
g++ yoba2.cpp -c yoba2.o
g++ yoba1.o yoba2.o -o yoba
Согласись, что писать это заебывает, а если нужно еще и библиотеку какую-нибудь, то легче застрелиться. Для облегчения всей этой ебли и нужен CMake.
Нихрена не понял. Запрос смены состояния это и есть посылка сообщения.
>>09836
Хуёвый ты тролль, если для тебя оскорбление - признак разрыва. Скорее всего, просто малолетний.
>>09844
Спасибо. Вот я как раз о второй части хочу почитать. Что если мне нужно подключать хучу библиотек, и у меня хуча файлов? В каком порядке это всё компилировать? Хочу весь процесс компиляции понять.
Я пролистал Страуструпа The C++ Programming Language по диагонали, но там, как я понял, компиляция не рассматривается?
Cmake ебаная параша. Учите meson.
Вот лекции этого товарища посмотри. В первой лекции довольно подробно про твои вопросы отвечает.
https://www.youtube.com/playlist?list=PLlb7e2G7aSpTFea2FYxp7mFfbZW-xavhL
Ну и полирни вот этим: https://habr.com/ru/post/150327/
В принципе для начала достаточно. Дальше уже сам поймешь, что и куда.
Спасибо! Схоронил.
Допустим есть у нас
template<class T>
struct A{
T value;
};
и есть у нас специализация
template<>
struct A<int>{
int value;
int another_value;
};
Как мне проверить, что у нас нет специализации для double, например?
Должно быть что-то вроде
static_assert(is_specialisation<A<double>>::value, "Not specialisation");
это должно падать а это
static_assert(is_specialisation<A<int>>::value, "Not specialisation");
должно проходить.
Чувак, ну ты серьёзно думаешь, что я первым делом на двач полез? Вариант через sizeof не работает, если базовая версия шаблона определена. Если бы было
template<class T>
struct A;
template<>
struct A<int>{}
Тогда другое дело. А так хуй, тот код выдаст тру на A<double>
> Чувак, ну ты серьёзно думаешь, что я первым делом на двач полез?
Ну, обычно так и происходит.
Онтоп - если метода с SO не сработала, то вообще хуй знает
>Ну, обычно так и происходит.
А, ну ладно тогда.
> то вообще хуй знает
Вот и я тоже хуй знает. Похоже, что никак.
SFINAE тебе в помощь. Я бы сделал так: https://onlinegdb.com/SJrprjJCE
Недостатком является то, что нужно писать в каждую специализацию typedef.
Хотя это тоже не обяхательно по идее, потом можно было бы class... Args написать или типа того, но для простоты пусть будет известно, что один параметр всего.
> Player не является именем класса или пространства имен
Всё ок должно быть, мб ты опечатался где-то, например файл player.h, а ты инклюдишь Player.h
This, компилятор будет игнорировать все, что выше.
Спасибо
Если сначала инициализировать переменную, то все работает, если пихать сразу в функцию, то хэш вычисляется в рантайме. Что за хуйня?
Как блядь, действительно.
std::is_same<double>(A::value).
Ты можешь явно проверить, какого типа переменная у объекта класса, если value будет из int специализации, то is_same вернёт false. Хоть почитал бы.
Если ты хочешь считать хэши в компайл тайме, то смотри в сторону std::array вроде как в 17 сделали так чтобы он работал в constexprt функциях
Зачем мне array? Просто хочу чтобы хэш вычислялся, когда его макросом в функцию пихаю.
> Hockeyteam.exe вызвал срабатывание точки останова.
В чем может быть проблема?
Сам твой массив выделен с помощью new? Если нет, то к нему delete [] применять нельзя. Во вторых, ты применяешь оператор delete, предназначенный для удаления одиночных объектов, а не массивов (нужно delete []).
Ну и еще вопрос, в чем принципиальная разница между 1 и 2 вариантами? Работает и тот и тот
>Можешь пояснить?
Если вкратце, то ты просто скопировал объект Player, выделенный с помощью new, в массив. И далее просто переписал указатель, соответственно память выделилась, но не удалилась. Вообще в современных крестах использовать "сырые" владеющие указатели - моветон. Для это есть std::unique_ptr и std::shared_ptr. Чем они различаются гугли сам.
Принципиальная разница в том, что в первом варианте 3 объекта создаются на стеке и автоматически уничтожаются, когда выходят из области видимости, а во втором все создается в куче и утекает. Но все равно в первом варианте 1 утечка есть, но еще есть также 3 вызова move конструктора и 3 вызова copy конструктора, что бестолково с т.з. расхода ресурсов.
Бамп вопросу. Хочу красиво все в одну строку вместить, а то у меня жопа горит с задефайненых макросом аргументов.
>Можешь пояснить?
Правило буравчика - каждому new должен быть свой (обычно единственный) delete. Каждому вызову malloc должен быть свой вызов free.
Мимо, я студентик до этого только си и питон нюхавший.
Буквально через 5 минут нашел решение, вот если кому интересно.
http://qaru.site/questions/451412/constexpr-function-parameters-as-template-arguments
Даже лучше, чем я хотел.
Ой, всё, идите нахуй. Поставил скобки и норм.
В частности беззнаковый char везде одинаково будет реагировать на отрицательные значения ну т. е. там, где ожидался знаковый char?
enable_if_t<is_same_v<_Tag, _Exact_args_t>, int> = 0>
что, конкретно, значит = 0 здесь? На SFINAE не похоже вроде.
Немножко обосрался со скобочками, вот полный вариант:
template<class _Tag,
class _This2,
class... _Rest2,
enable_if_t<is_same_v<_Tag, _Exact_args_t>, int> = 0>
Добавь typename перед std::vector<T>::iterator. А лучше не жрать говно и написать auto, ну или просто сделать метод шаблонным, если хочется больше читаемости.
Читаю книгу. При обращении к членам объекта до этого использовалась "." точка. Теперь какого то хуя появляется ->
>написать auto
Бля все время забываю, что так можно, спасибо.
Кстати поясните в чем разница между for (auto& i : array) и for (auto&& i : array)? И то и то по сути ведь по ссылке берется без копирования, просто некоторые почему то пишут там двойную ссылку.
спасибо
void foo(bool(*bar)(int, int)) {...}
Могу ли я передать в неё non-static member функцию? Например, эту:
class Hui {
...
bool pisos(int a, int b) { return true; }
...
}
Если не принципиально, куда вставляется, то std::map, std::set. Хранится уже в упорядоченном виде, вставка, удаление, поиск за логн.
Под упорядоченностью я подразумевал сохранение порядка при добавлении.
Мне нужно что-то похожее на std::deque, но с возможностью проверить в нём наличие элемента, как в std::set.
Если четко по стандарту, то в общем случае - UB. Есть несколько случаев, когда разрешено, читай здесь: https://en.cppreference.com/w/cpp/language/extending_std
Хз, можно обернуть map и deque, при добавлении добавляешь и туда и туда, если нужно найти ищешь в мапе и получаешь индекс за логн и по индексу за константу достаёшь из дека. Бредово немного, но по идее подскажет.
>It is undefined behavior to add declarations or definitions to namespace
>It is allowed to add template specializations for any standard library class (since C++20)template to the namespace std
>добавлять специализации существующих шаблонов классов/функций
Дык я про второе и спрашивал как раз. То, что новые функции и классы в стд добавлять нельзя я в курсе.
Первое lv ссылка, второе rv. Очень много почему так можно хотеть делать.
Чтобы иметь стабильное abi, может ещё чтобы не компилировать вагон зависимостей.
Минимизация зависимостей, ты можешь менять имплементацию, при этом апи не будет меняться и не нужно будет перекомпилять всё.
Есть такой фрагмент кода
Боже, не дай с разметкой проебаться
#include <QApplication>
#include <QPushButton>
int main(int argc, char argv)
{
QApplication app (argc, argv);
QPushButton button;
button.setText("My text");
button.setToolTip("A tooltip");
button.show();
return app.exec();
}
Вроде все просто если я правильно понял. Создается объект button класса QPushButton и вызываются его методы.
Потом используются указатели. Нахуя? Чем первый способ не подходит?
#include <QApplication>
#include <QPushButton>
int main(int argc, char argv)
{
QApplication app (argc, argv);
QWidget window;
window.setFixedSize(100, 50);
QPushButton *button = new QPushButton("Hello World", &window);
button->setGeometry(10, 10, 80, 30);
window.show();
return app.exec();
}
Есть такой фрагмент кода
Боже, не дай с разметкой проебаться
#include <QApplication>
#include <QPushButton>
int main(int argc, char argv)
{
QApplication app (argc, argv);
QPushButton button;
button.setText("My text");
button.setToolTip("A tooltip");
button.show();
return app.exec();
}
Вроде все просто если я правильно понял. Создается объект button класса QPushButton и вызываются его методы.
Потом используются указатели. Нахуя? Чем первый способ не подходит?
#include <QApplication>
#include <QPushButton>
int main(int argc, char argv)
{
QApplication app (argc, argv);
QWidget window;
window.setFixedSize(100, 50);
QPushButton *button = new QPushButton("Hello World", &window);
button->setGeometry(10, 10, 80, 30);
window.show();
return app.exec();
}
Ты не знаешь различие между объектом на стеке и на куче? Или не читал, как работает система parent-child в Qt?
И то и то. Спасибо. Пойду читать
Хули тебе не нравится? Зелень залетная.
начинал с плюсов своё вайтивайти. Уже 3 года макакоёбствую на Go.
Есть ли смысл учить плюсы и пишут ли какой- нибудь бекенд-хайлоад на плюсах ? Насколько долго затянется обучение ?
Есть ли смысл написать какой- нибудь пет со стеком C++/Mongo/какая- нибудь апишка ?
Без указателя/ссылки на класс никак ты свой non-static member function никак не вызовешь (если объект не в глобальной области видимости). Так что делай глобальной, либо static и передавай как &MyCls::MyFn, либо иди нахуй, токсик
Нестатические функции члены всегда скрыто принимают первым аргументом указатель на объект, из которого вызвана функция (this). Передать куда-либо можно с помощью std::bind с указанием этого объекта - bind(Class::func, &Object, std::placeholders::_1...). Без указания объекта никак. Короче, почитай про bind.
tme/dovaogedot
Слишком тупые вопросы, стыдно на людях.
Вот, например. Фунция возращает поломаные объекты шейдеров с пустыми source, но с правильными ID. На 146 строке шейдеры заполнены, на 147 source пропадает.
Указатели и ссылки я нигде не использую, разве функция не должна возвращать новую копию созданной на 146 строке ShaderProgram со своими копиями заполненых шейдеров, и удалить старую ShaderProgram по выходу? Почему эта функция возвращает ShaderProgram с шейдерами, у которых поля source превращаются в "", но ID остаётся?
Ну, это конечно, ты зря полез в графику без знания основ. Потоки ввода-вывода не копируются! Никакие!
Окей, как тогда правильно считать данные с файла, чтобы всё было как у других языков?
А ты не забываешь в конструкторах своих шейдеров вызывать конструктор базового шейдера типа vertexShader(string src):Shader(src){}. Если ты этого не делаешь, то часть базового класса сконструирована не будет.
Напиши явно деструктор и поставь в него точку остановки, посмотри, откуда вызывается
Не надо мудрить с какой-то иерархией классов.
Скомпилированный шейдер vertex + fragment это просто unsigned int
Его ты можешь просто копировать.
Хэдр https://pastebin.com/RiYGk1Gh
Срц https://pastebin.com/RNJFkMNU
Если там будет Cat и Dog, наследующиеся от Animal, будет проще? Проблема в стирании std::string, а не в компиляции шейдеров.
>>11719
Первый раз, как я понял, удаляются локальные копии параметров в конструкторе ShaderProgram. Второй раз они вызываются на 150 строке уже после создания ShaderProgram, перед выходом из getDefault(), уничтожая строки только что созданных шейдеров. Почему так происходит? Как быть?
И ещё третий раз деструкторы вызываются уже после вызова getDefault() из другой функции. Это я вообще не знаю зачем.
Собрал это, и никаких проблем не наблюдается. У тебя твои файлы с текстом не пустые? Лежат в папке рядом с проектом?
Проверь как у меня на втором скрине. У тебя к 152 строке твоя выделенная на стеке строка уже уничтожена после выполнения return.
Так, блять. Причину этой хуйни я нашёл. Я просто ShaderProgram* program = &ShaderProgram::getDefault() долбаёб.
Как в таком случае сделать красиво, по правилам? Я хочу чтобы у меня в классе Human был мембер ShaderProgram. Инициализировать его мне нужно после конструктора Human. Значит, этот мембер не может быть на стеке, так? Нужен указатель на него. Нормально ли будет, если getDefault() будет возвращать указатель на ShaderProgram? Как это с точки зрения управления памятью?
Ну я просто где-то читал, что типа объект, который создал указатель, должен сам за ним следить и удалять.
Умный указатель считается создателем указателя на кучу и освободит память в своем деструкторе, например, при выходе управления из блока кода, где он был создан. Они и были придуманы для решения проблемы частого забывания программистами добавить delete, где это нужно.
Прочитал. Не понял. Вот что произойдет если я буду объявлять объекты не через указатель?
Вот есть, к примеру, класс https://github.com/SFML/SFML/blob/master/include/SFML/Graphics/RectangleShape.hpp (в конце файла есть небольшой пример использования)
Он наследуется от класса Shape который, в свою очередь, наследуется от других.
Вот я объявляю переменную RectangleShape на стеке, так как же тогда вся эта йоба магия с виртуальными функциями будет работать?
На хабре от PVS Studio регулярно постят статьи на подобную тематику. Ну и на сайте самих PVS кой-чего есть.
Ты конечно можешь все виджеты создавать на стеке, но зачем? Рано или поздно отстрелишь себе хвост по самое ебало.
https://doc.qt.io/qt-5/objecttrees.html
> Вот я объявляю переменную RectangleShape на стеке, так как же тогда вся эта йоба магия с виртуальными функциями будет работать?
Такие вызовы разрешаются статически, никакой магии тут нет.
Все так и есть. Поэтому специально были созданы юник/шаредптры, дабы облегчить жизнь нюфаням всем.
Ссылку открыл. Если будут вопросы потом задам
Последнюю фразу не понимаю. Какой ущерб нанесен? Типо после удаления объекта по его адресу запишутся другие данные, а он пытаясь удалить себя второй раз сотрет их?
Удаление "удаленного" - undefined behavior. Если в деструкторе указателю бы присваивался nullptr после delete, то было бы все норм, но так никто делает, т.к. лишняя операция, которая замедляет производительность, ну и все-таки код на с++ должен писать не дебил.
Спасибо большое, анон. Что бы я без тебя делал?
То есть если я у производного класса и создам переменную этого типа напишу реализацию виртуальной функции, то вызывать будет именно она?
https://wandbox.org/permlink/HBzGnHgOXIGkroBA
Проверил. Так и есть.
Получается пользоваться указателями на базовый класс нужно когда есть чистые виртуальные функции или этот базовый класс используется как интерфейс?
Почему там говорится, что они могут с помощью new выделить буферы и они после выхода из scope сами уничтожатся? Как это работает?
Обосрался, RAII, конечно же. Вон на скрине написано даже. Ты прочитать не можешь что-ли?
Не знаю, какой ты смысл вкладывал в свои слова, но если бы работаешь только с наследником - принимай его по ссылке. Если хранишь - храни указатель (может даже unique_ptr). Если собираешься работать с объектами-наследниками базового класса через его интерфейс, то делай то же самое, но с указателем/ссылкой на базовый класс.
Вижу, конечно, только опять же, при чем тут raii, если это просто про расположение в конструкторе и деструкторе инициализации\удаления объекта. Тут непонятна магия с оператором new. Каким образом буферы int и float самоуничтожатся после выхода из локальной области видимости?
Это же книжка про игровые движки?
Там видимо переопределены аллокаторы памяти для int и float. Прога на старте хапает большой кусок из кучи и уже сама потом им манипулирует. В приведенном коде просто пример как это должно работать.
Не, ну, я не тупой, это-то я знаю. Я просто не понимаю, в чём профит от вектора векторов пар. Инт инт - это точка назначения и вес дуги?
Там же написано, после выхода из скопа вызовется деструктор, в нём popallocator.
>>Это же книжка про игровые движки?
Да, "Game Engine Architecture Third Edition Jason Gregory".
Вроде понял теперь. Т.е. работает это примерно так: переопределенный new сдвигает head стэкового аллокатора, а когда аллокатор уничтожается(когда выходим из scope), то head возвращается на старое значение?
Почитай про RAII, смысл такой, что вместо того, чтобы явно выделять и освобождать память ты создаёшь объект, в конструктор которого передаёшь new(или в твоём случае аналог на стеке, раз стековый аллокатор у тебя), а в деструкторе delete(у тебя popallocator) и когда время жизни у объекта кончится вызовется его деструктор, в котором освободится память. Это безопаснее, чем ручками это делать, потому что во-первых можно забыть, во-вторых если между твоим new и delete где-то кинулось исключение, то пизда, будет утечка, а в RAII случае RAIIobj(new int(5)); ... throw 2; ... у тебя после выброса исключения пойдёт stack unwinding, программа будет как бы откатываться до try, то есть у всех созданных объектов будет вызван деструктор, в том числе и у RAIIobj и поэтому память освободится и утечки не будет. Это оче норм тема и поэтому такой подход используют повсеместно.
GDI лучше.
Я могу выполнить действие используя событие (допустим нажатие кнопки). Но как выполнить действие без события? Запустил программу и сразу какая-нибудь функция заработала, как в консольных приложения. Тупо с первой строчки код выполняется.
Ну вызови вручную обработчик этого события, в чем проблема? Например, у QPushButton есть сигнал clicked(), если ты его подключил к своему OnClickMyButton(), то ничего тебе не мешает вызвать OnClickMyButton() самостоятельно.
Если ты не знаешь, где вызывать, то вызывай там, где создашёшь.
Код и так с первой строчки выполняется. Только при вызове exec() приложение входит в бесконечный цикл ожидая события.
Если у тебя есть ui, то я могу предположить, что это оконное приложение, и ты используешь дизайнер форм. Если это так, то ui - это член класса созданного окна. Присвоить текст лейблу можно в конструкторе, например, или прямо в дизайнере.
Если ты напишешь обычный цикл, то не увидишь, как буковки появляются. Скорее всего тебе нужен таймер. Читай про QTimer, там скорее всего будет в примерах, как сделать то, что тебе нужно.
бля. Я в каждом посте говорил "Допустим". мдаа
#include "Test.h"
Test::Test(QWidget *parent)
: QMainWindow(parent)
{
int i;
ui->setupUi(this);
ui->label->setText("YZYKEN");
for(i=0;i<10;i++) ui->label->setText(ui->label->text() + QString::number(i));
}
возник вопрос, уже как бы не актуально но для общей эрудиции вот есть std::map, я его заполнил и хочу перебрать все ключи и объединить с похожими, это реально сделать? Ибо у меня после удаления элемента в цикле for (auto i: mapA){for (auto j: mapA){;}} что то шло не так и все ломалось я так понял это как то связано с итераторами которыея удалял, а через цикл for(int i=mapA.begin; i<mapA.end;i++) я так понял достучаться до значения по итератору шансов нет? и итераторы чет не поддерживают "="? Короче эту задачу можно было как то решить через map? или надо было использовать другой контейнер?
В книге так написано (я про main). Другое дело, что та книга к qt отношения не имеет.
Хочешь Qt читай Макса Шлии
вот тут у меня непонятки, после erase() что происходит с итератором? если они последовательны(++it, myMap.begin <it< myMap.end) то после удаления он должен сместиться?
http://www.cplusplus.com/reference/map/map/erase/
Объекты в std::map лежат в каком-то порядке, не важно в каком. При удалении положение объектов относительно друг друга не меняется.
>Почему QT взлетел?
Потому что остальное для клепания формочек на крестах еще хуже. А здесь годная система сигналов-слотов, а не ебучих колбеков, как везде.
>Нарушает концепции самого С++.
Какие?
>Почему это говно юзают?
Не хочешь - не юзай, никто не заставляет.
Есть реализации основных протоколов под эмбедед + там говорят годный сейф рендер и красивые QML интерфейсы. Правда стоит это овердохуя.
потому что удобно и всё
Анон, а как сейчас программируют на C++?
Когда я работал программистом-формошлёпом на C++, всё собирали с помощью qmake и гуя QtCreator'a.
А как делать правильно? То есть, как делают в Big-N компаниях и всем таком?
Пишут мейкфайлы, как в 80-х? Используют CMake? Не используют C++?
где как. в крупных компаниях, где проекты большие, обычно пишут свой сборщик (ну или кастомизируют какую-нибудь систему автосборки под себя).
Понятия "как правильно" - нет, каждый собирает как хочет. У нас вот cmake был сначала, потом на него забили и написали свой билдер, так на нём и сидим до сих пор.
А где 88?
auto Pic = gcnew PictureBox(...);
...
litsPictureBoxes->Add(Pic);
litsPictureBoxes - заранее созданный контейнер в свойствах формы
лямбда неявно разворачивается грубо говоря в структуру с перегруженным оператором () и членами, который ты захватил. Без захвата - в указатель на функцию. Поэтому лучше юзать std::function<T>
Почему WinHttpSendRequest шлет лишь ебучий глагол?
Вот реально, вместо сервера запустил голую слушалку на winsock-ах, и прилетает только 4 байта "POST". Это пиздос, чините мой пердак, аноны!!!
Это копия, сохраненная 8 июля 2019 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.