Вы видите копию треда, сохраненную 18 февраля 2020 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
• https://github.com/sosachbot/cppthreadhat/wiki
Ответы на вопросы:
• https://en.cppreference.com/w/
• https://www.cplusplus.com/reference/
Прошлый тред:
• >>1526322 (OP) (OP)
> button1 = new QPushButton("Button", this);
Но проблема в том, что кнопка не активна. Хотя если создать кнопку отдельно
> QPushButton sd("df",&w);
Где w экземпляр класса, всё будет работать. Почему?
То есть мне писать десяток конструкторов со всем списком параметров, а потом через двоеточие еще раз делать это?
Где там наследование то? Явная инициализация базового класса с аргументами из конструктора класса-наследника
Ай блять я долбоеб слепошарый
> QObject::connect(&w, SIGNAL(changepos(int, int)), w.lble, SLOT(setNum(int)));
> QObject::connect(&w, SIGNAL(changepos(int, int)), w.lble, SLOT(resize(int, int)));
А вот Sockets не появились до сих пор.
Ебать! Это пиздец!
Если слот к сигналу не подключился, сообщение об этом выводится куда-то во время выполнения. Смотри вкладку Output внизу в Qt Creator или запускай в консоли (в настройках проекта, Settings слева, можно выбрать галочку запуск в терминале).
Огромный комбайн, который хуй пойми как ставить. Пока разберёшься, успеешь 10 раз написать свои строки.
boost::tokenizer, к примеру, header-only библиотечка из 3х файликов..
Помогите мне разобраться пожалуйста.Я устанавливал qt 5.14.0 для андроид на ubuntu 16.04 и использовал ndk r20. Я следовал инструкциям в этой статье
После того как я запустил ./configure вот какой мне вывел результат. Объясните пожалуйста, как обойти предупреждения насчет кросс-компиляции и насчет LLVM_INSTALL_DIR
Есть какая-то причина, по которой ты не используешь установщик, а собираешь из исходников? В установщике можно выбрать андроид платформы. https://www.qt.io/download внизу open source.
вроде как из-за того что в ndk 20 убрали поддержку gcc toolchain, надо компилить исходники с помощью кланга, насколько я понял из этой темы https://forum.qt.io/topic/95104/qt-creator-android-clang. Поэтому я думаю, лучше я скомпилю qt из исходников.
Я это понял так: надо использовать clang для сборки исходников, потому что больше нельзя собрать из исходников с помощью gcc. Но зачем тебе вообще собирать из исходников? Попробуй, в общем. Я собирал проект с ndk-20 без ручной сборки qt.
> то есть в ./configure нужно прописать -platform linux-clang?
Нет (не знаю), я к другому веду. На скрине обсуждается вопрос выбора компилятора для сборки qt, но если ставить qt через установщик, то такого вопроса даже не возникнет. А ты возможно подумал, что если gcc на clang сменился, то надо собирать из исходников. Проект последний раз пробовал собирать на qt 5.13.2, поставленный через установщик. Даже с ndk-r20b. https://github.com/th3or14/opencv-with-ffmpeg-on-qt-for-android
Таки split же подвезут в 20 стандарте.
Источник: лекции от PVS Studio, лекция про 20 стандарт.
Насколько легко?
vector<string> s = stringstream("abc def ghi").split(" ");
Справится хотя бы на таком уровне? Или нужно будет писать 20 строк и инклудить какие-то странные классы?
std::string text = "Let me split this into words";
std::istringstream iss(text);
std::vector<std::string> results(std::istream_iterator<std::string>{iss},
std::istream_iterator<std::string>());
Спасибо.
Почему раскрытие идёт корректно только внутри таких вот скобок, но не внутри std::invoke? Например, std::invoke(&f, std::forward<V>(v)..., cap) не сработает, потому что не сможет найти подходящий overload. Это потому, что не существует прототипа, который бы раскрывал variadic pack?
Проблема оказалась в том, что move не слот как я понял, при выпадении листа методов слоты имеют значек с зазубринами а просто методы прямоугольник
пытался батюшка
Знаешь как эта хуйня (...) работает? Она в данном случае указывает, какое именно выражение копипастится, т.е. раскрывается.
Вот смотри, если написать внутри инвока оно раскроется так.
(invoke(&vector::reserve, forward<V>(v)..., cap)) -> (invoke(&vector::reserve, a, b, c, cap))
, попытается вызвать vector::reserve(a, b, c, cap) и справедливо заметит, что такой перегрузки нет.
А если после инвока, то копипастится весь вызов и всё ок.
(invoke(&vector::reserve, forward<V>(v), cap), ...) -> (invoke(&vector::reserve, a, cap), invoke(&vector::reserve, b, cap), invoke(&vector::reserve, c, cap))
C++/CLI это альтернативный синтаксис для шарпа, несовместимый с экосистемой крестов.
Потому что WinAPI упорот.
А причём тут Qt?
Как говорит луркморье, на говне сметану не сделаешь.
Вероятно, это значит, что исключение выбрасывается внутри слота.
Условие: Записать элементы массива X[N] в массив Y[N], сдвинув элементы массива Х влево на 3 позиции. При этом 3 элемента из начала массива Х перемещаются в конец. В массиве Y[N] перед первым четным элементом добавить элемент со значением -1. Использовать операторы ввода-вывода printf-scanf.
#include <stdio.h>
#include <cstdlib>
#include <iostream>
int main(int argc, char argv)
{ unsigned int X[100], Y[100];
int i,N,i1;
printf ("\n N=");
scanf ("%d",&N);
for(i=0;i<N;i++)
{printf("X[%d]=",i);
scanf("%d",&X);
}
printf("\n");
for (i=0; i<N; i++)
{if (i<N-3) Y=X[i+3];
else Y=X[i-N+3];
}
i1=-1;
for (i=0;i<N;i++)
{printf("Y[%d]=%d\t",i,Y);
if(Y%2==0) i1=i;}
if(i1!=0)
{
printf("\n");
printf("Y[%d]=%d\n",i1,Y[i1]);
for(i=N;i>i1-1;i--)
Y=Y[i+1];
Y[i1]=-1;
N++;
for(i=0;i<N;i++)
printf("Y[%d]=%d\t",i,Y);
printf("\n");
}
else {printf("\n");
printf("There are not even elements \n");}
return 0;
}
Условие: Записать элементы массива X[N] в массив Y[N], сдвинув элементы массива Х влево на 3 позиции. При этом 3 элемента из начала массива Х перемещаются в конец. В массиве Y[N] перед первым четным элементом добавить элемент со значением -1. Использовать операторы ввода-вывода printf-scanf.
#include <stdio.h>
#include <cstdlib>
#include <iostream>
int main(int argc, char argv)
{ unsigned int X[100], Y[100];
int i,N,i1;
printf ("\n N=");
scanf ("%d",&N);
for(i=0;i<N;i++)
{printf("X[%d]=",i);
scanf("%d",&X);
}
printf("\n");
for (i=0; i<N; i++)
{if (i<N-3) Y=X[i+3];
else Y=X[i-N+3];
}
i1=-1;
for (i=0;i<N;i++)
{printf("Y[%d]=%d\t",i,Y);
if(Y%2==0) i1=i;}
if(i1!=0)
{
printf("\n");
printf("Y[%d]=%d\n",i1,Y[i1]);
for(i=N;i>i1-1;i--)
Y=Y[i+1];
Y[i1]=-1;
N++;
for(i=0;i<N;i++)
printf("Y[%d]=%d\t",i,Y);
printf("\n");
}
else {printf("\n");
printf("There are not even elements \n");}
return 0;
}
Как же, он ведь аж iostream заинклудил.
Message Box можно и с ассемблера вызывать.
ну кстати чел у тебя почти все правильно, надо только "if(i1!=0)" заменить на "if(i1!=-1)", "for(i=N;i>i1-1;i--)" на "for(i=N - 1;i>i1-1;i--)", а "Y[i_]=Y[i+1];" на "Y[i + 1]=Y[i_];"
Наследование квадратов от прямоугольников.
Что значит "атомарный класс"? Атомарными могут быть только операции. Добавь мютексы в свои методы
ну да, операция сложения строк. С мютексами насколько я понимаю будет долгая задержка, если операция длится долго.
Вот, к примеру, он выделяет память кусками.
А как быть есть подо "что-то" не хватит выделенного куска памяти. Например, текстура.
Как быть тогда? Выделять несколько чанков под неё?
Так эта твоя операция навряд ли будет длиться долго, но суть не в этом.
Покажи сигнатуру метода, потому что не совсем понятно, как класс должен строки складывать.
Сделай своё api для гуи. С кнопками, ползунками и надписями, чтобы все элементы интерфейса взаимодействовали друг с другом через виртуальные методы или ещё как и могли в нажатия мышкой, клавиш, колёсико.
У меня есть кнопка Х для выхода из лупа.
Можно ли как то выйти из лупа быстрее, чем происходит одна итерация (2 сек)?
Например, во вложенном цикле 20 раз спать по 100 мс и затем проверять нажатие.
Типа проверять 20 раз между каждым 100мс сном?
Ну будьте же людьми, напишите нормальный цикл обработки сообщений и ловите WM_KEYDOWN
ооп это парадигма для фабричного программирования, то есть бля берется проект в вакууме, описывается задание для старшего технаря, тот рисует облачки со стрелочками(ну вы знаете), отдает эти облачки со стрелочками младшим обезьянкам и следит за ними как они кодят.
все устроено так, что на каждом отдельном этапе ничего сложного нет и в общем то нехуй там дрочить.
сложность(ну я бы сказал дефект ооп) в том, что когда ты рисуешь облачки со стрелочками, ты не можешь прочувствовать каждый оператор в каждом методе, ну это просто невозможно. по этому всегда будут костыли из-за недостаточной глубины продумки проекта на ранних этапах. так же невозможно предсказать все будущие правки проекта.
например тут писали про квадраты из прямоугольников. ну да это очень простой и наглядный пример. но бля задать прямоугольник можно несколькими способами https://gamedev.ru/terms/AABB .
когда вы думаете о машине, вы можете регулировать в своих мыслях глубину детализации или абстракции, то есть можете думать о машине но на самом деле в мыслях вы будете видеть только кузов с колесами, через момент можете по желанию открыть капот и представить некоторые детали двигателя, еще спустя один миг вы уже представляете 2Д иконку из эмодзи с машиной. но мозг нормального человека не способен одномоментно осознать всю машину как она есть и все условия эксплуатации этой машины.
ооп говорит, что машина наследуется от транспортного средства и реализует интерфейсы кресло, руль, педали и тд, что бы человек сел в нее и поехал. ну да все логично - так думают наивные новички и у них даже получается делать свои первые проекты. они думают, эй я уже надрочился и могу декомпозировать целые проекты прямо в классы, эй объекты в моих мыслях прямо как объекты в ооп - нихуя подобного. все это хуйня для даунов. некоторые настолько влюбляются в заведомо дефективное ооп, в парадигму, где одно изменение в проекте может понести за собой каскад правок по всему коду, что у них даже начинается ну ебаный бред я не знаю, это я про фанатов фабрик фабрик итд.
я работал с таким идиотом, ну фанатом uml облачек и архитектуро бреда. я просто брал его классы, переписывал и они получались короче либо вообще исчезали, так как мне нужна была причина это делать, я еще сверху дописывал фичи или находил баги. даже ебаное ооп я понимал лучше него. но он отплясывал перед менеджерами и руководителями, которые в свою очередь с большой вероятностью идиоты тоже, так что учиться надо отплясывать в первую очередь, а код писать не сложно.
ооп это парадигма для фабричного программирования, то есть бля берется проект в вакууме, описывается задание для старшего технаря, тот рисует облачки со стрелочками(ну вы знаете), отдает эти облачки со стрелочками младшим обезьянкам и следит за ними как они кодят.
все устроено так, что на каждом отдельном этапе ничего сложного нет и в общем то нехуй там дрочить.
сложность(ну я бы сказал дефект ооп) в том, что когда ты рисуешь облачки со стрелочками, ты не можешь прочувствовать каждый оператор в каждом методе, ну это просто невозможно. по этому всегда будут костыли из-за недостаточной глубины продумки проекта на ранних этапах. так же невозможно предсказать все будущие правки проекта.
например тут писали про квадраты из прямоугольников. ну да это очень простой и наглядный пример. но бля задать прямоугольник можно несколькими способами https://gamedev.ru/terms/AABB .
когда вы думаете о машине, вы можете регулировать в своих мыслях глубину детализации или абстракции, то есть можете думать о машине но на самом деле в мыслях вы будете видеть только кузов с колесами, через момент можете по желанию открыть капот и представить некоторые детали двигателя, еще спустя один миг вы уже представляете 2Д иконку из эмодзи с машиной. но мозг нормального человека не способен одномоментно осознать всю машину как она есть и все условия эксплуатации этой машины.
ооп говорит, что машина наследуется от транспортного средства и реализует интерфейсы кресло, руль, педали и тд, что бы человек сел в нее и поехал. ну да все логично - так думают наивные новички и у них даже получается делать свои первые проекты. они думают, эй я уже надрочился и могу декомпозировать целые проекты прямо в классы, эй объекты в моих мыслях прямо как объекты в ооп - нихуя подобного. все это хуйня для даунов. некоторые настолько влюбляются в заведомо дефективное ооп, в парадигму, где одно изменение в проекте может понести за собой каскад правок по всему коду, что у них даже начинается ну ебаный бред я не знаю, это я про фанатов фабрик фабрик итд.
я работал с таким идиотом, ну фанатом uml облачек и архитектуро бреда. я просто брал его классы, переписывал и они получались короче либо вообще исчезали, так как мне нужна была причина это делать, я еще сверху дописывал фичи или находил баги. даже ебаное ооп я понимал лучше него. но он отплясывал перед менеджерами и руководителями, которые в свою очередь с большой вероятностью идиоты тоже, так что учиться надо отплясывать в первую очередь, а код писать не сложно.
>Сделай своё api для гуи.
Плохой вариант. Гуй на ООП не очень хорошо ложится. Компонентный подход гораздо удобнее.
>Возможно ли QTreeView сделать чтобы итем верхнего уровня имел 1 столбец, а его дети 2?
Можно сделать, чтобы он отрисовывался на два столбца. Но надо писать свою модель. Посмотри, как у них Property Browser сделан.
>Все GUI фреймворки построены с использованием ООП
Далеко не все, ImGui, например. А те, что написаны, начинали писаться в 90-е, когда ООП было модно. Например swing на джаве - образцовый пример, когда ООП только мешает. Там заебешься какую-нибудь кастомизацию делать, хотя ООП тут вроде должно помогать.
>напишите нормальный цикл.
>ловите WM_KEYDOWN.
И как это тебе поможет выйти из цикла, который с задержкой в 2 сек, быстрее ?
Зачем заморачиваться дополнительно ещё и ловлей из кучи совершенно не нужных сообщений нажатие на кнопку, с которым и так нету никаких проблем ?
От того, что ты будешь разгребать все сообщения, в поисках нажатия, вместо того, чтобы взять готовое - ничего не поменяется.
Вот это решение >>54308
скорее всего, оптимально.
Оказалось, что после того как я удалил присвоение указателя, действие с ним осталось. Странно что это даже не подсветилось.
Immediate Mode Gui (включая ImGui) фреймворки сделаны специально для игр и подобных им вещей, которые работают в непрерывном цикле "обновление состояния-отрисовка" (а не по типичной для десктопных приложений событийной модели). Они очень примитивные и ничего серьезного ты на них не сделаешь.
>Там заебешься какую-нибудь кастомизацию делать, хотя ООП тут вроде должно помогать.
Без ООП ты еще больше заебешься при попытке написать что-то мало-мальски сложное.
> Они очень примитивные и ничего серьезного ты на них не сделаешь.
Редактор Unity3d написан на immediate mode фреймворке. Это достаточно серьезно?
>Без ООП ты еще больше заебешься при попытке написать что-то мало-мальски сложное
Emacs, например, можно считать "мало-мальски сложным"? ООП там нет.
Я вообще не против ООП, тем более, если оно встроено в язык. Мне не нравятся практики из 90-х, когда в том же гуи все наследуется от супержирного базового виджета, а весь функционал приколочен гвоздями и инкапсулирован так, что поменять что-то можно только через систему костылей.
>Редактор Unity3d написан на immediate mode фреймворке. Это достаточно серьезно?
Я уверен, что они поверх него навертели ООП врапперов
>Emacs
У емакса считай что гуи вообще нет
>Мне не нравятся практики из 90-х, когда в том же гуи все наследуется от супержирного базового виджета, а весь функционал приколочен гвоздями и инкапсулирован так, что поменять что-то можно только через систему костылей.
Оно так неспроста и лучшего способа делать гуй пока не придумали
>я просто брал его классы, переписывал и они получались короче либо вообще исчезали.
В классе десять методов, а нужен только один - ну как не выкинуть девять не нужных, написав класс из одного метода ? - понимаю.
Или, так и хочется выкинуть весь класс, а нужный метод оформить в виде функции, да ?
Однако "оптимизацией" подобные выкидывания, переписывания и упрощения - не являются.
Оптимизация должна не укорачивать код, а делать его быстрее. От того, что программа даже, пускай, не будет иметь классов вообще, она быстрее сделается лишь не намного.
Недостатки :
Лишний в ней, "мёртвым грузом" заведомо не используемый код - не способен помешать, ведь он, тупо, не используется, а в адресное пространство программы загружаются только хотя бы однажды вызванные из класса функции - не используемые при работе программы функции так и пролежат на диске в её файле.
Да, размер файла программы они увеличивают, но это не сопоставимо с неуклонным ростом размера дисков.
Преимущество :
"Лишний" код в классах, включая сами лишние методы, не мешают разработке, так как они инкапсулированы в отдельный файл, а имена методов и свойств не пересекаются с именами функций и переменных кода, который пишет разработчик, так как находятся они в другом пространстве имён, начинающимся с имени класса.
Вопрос в том, далеко ли спрятан код класса от пакостливых рук - например, внутренние функции и операторы языка спрятаны достаточно далеко, чтобы разработчик не начал чего ни будь "улучшать" - няхай своё пишут, а не лезут с исправлениями.
Так же, контролы визуального интерфейса высокоуровневых языков надёжно спрятаны от любознательных охотников чего ни будь откромсать, переписать или выкинуть, такое желание закономерно и ожидаемо.
Оптимизация :
Если сравнить два варианта кода, делающих одно и то же, но один из которых использует класс, то такой код окажется, конечно, медленнее. Просто нужно делать классом что-то монументальное, редко, не в длинном цикле вызываемое, но они, собственно, для этого и делаются - одним вызовом метода совершить много работы.
Конечно, если делаешь критический код, там не должно быть никаких классов, но он и не будет слишком большим.
В остальном, как тут не отпинывайся от ООП, оно неизбежно : так же протестовали и против высокоуровневых языков - сейчас даже микроконтроллеры программируются на них, добрались, со всеми тяжкими, классами, скрытыми внутренними функциями языка и прочее.
>я просто брал его классы, переписывал и они получались короче либо вообще исчезали.
В классе десять методов, а нужен только один - ну как не выкинуть девять не нужных, написав класс из одного метода ? - понимаю.
Или, так и хочется выкинуть весь класс, а нужный метод оформить в виде функции, да ?
Однако "оптимизацией" подобные выкидывания, переписывания и упрощения - не являются.
Оптимизация должна не укорачивать код, а делать его быстрее. От того, что программа даже, пускай, не будет иметь классов вообще, она быстрее сделается лишь не намного.
Недостатки :
Лишний в ней, "мёртвым грузом" заведомо не используемый код - не способен помешать, ведь он, тупо, не используется, а в адресное пространство программы загружаются только хотя бы однажды вызванные из класса функции - не используемые при работе программы функции так и пролежат на диске в её файле.
Да, размер файла программы они увеличивают, но это не сопоставимо с неуклонным ростом размера дисков.
Преимущество :
"Лишний" код в классах, включая сами лишние методы, не мешают разработке, так как они инкапсулированы в отдельный файл, а имена методов и свойств не пересекаются с именами функций и переменных кода, который пишет разработчик, так как находятся они в другом пространстве имён, начинающимся с имени класса.
Вопрос в том, далеко ли спрятан код класса от пакостливых рук - например, внутренние функции и операторы языка спрятаны достаточно далеко, чтобы разработчик не начал чего ни будь "улучшать" - няхай своё пишут, а не лезут с исправлениями.
Так же, контролы визуального интерфейса высокоуровневых языков надёжно спрятаны от любознательных охотников чего ни будь откромсать, переписать или выкинуть, такое желание закономерно и ожидаемо.
Оптимизация :
Если сравнить два варианта кода, делающих одно и то же, но один из которых использует класс, то такой код окажется, конечно, медленнее. Просто нужно делать классом что-то монументальное, редко, не в длинном цикле вызываемое, но они, собственно, для этого и делаются - одним вызовом метода совершить много работы.
Конечно, если делаешь критический код, там не должно быть никаких классов, но он и не будет слишком большим.
В остальном, как тут не отпинывайся от ООП, оно неизбежно : так же протестовали и против высокоуровневых языков - сейчас даже микроконтроллеры программируются на них, добрались, со всеми тяжкими, классами, скрытыми внутренними функциями языка и прочее.
И как это применить ? - первое генерирует таймер, второе закрывает программу.
"Sleep(2000)" заморозила программу, может ты как-то хочешь дать ей отбой.
>Я уверен, что они поверх него навертели ООП врапперов
Не навертели.
>У емакса считай что гуи вообще нет
Наоборот, емакс - это одно сплошное гуи, пусть и текстовое (хотя графика там тоже есть). Еще как пример - чисто сишный блендер.
>Оно так неспроста и лучшего способа делать гуй пока не придумали
Давно придумали, просто вынуждены использовать легаси родом из 90-х вроде Qt.
>>ну как не выкинуть девять не нужных
когда там в С++ уже завезут =delete для своих методов а не только операторов и конструкторов/деструктора?
Чтобы я писал так:
class Foo
{
virtual void pina() {cout << "пора бухать";}
};
class Bar : public Foo
{
void pina() = delete;
};
Bar bar;
bar.pina(); <===== ERRROOOORRRR, НИЗЯ
Тогда всё ООП с полиморфизмом идёт нахуй. Класс должен расширять поведение базового, а не заменять его.В теории
не идет, так можно делать. Можно удалять делать недоступным базовый функционал
И если в гламурных С#/Java это пофиг, то уж в С++ который весь такой под оптимизации - уже давно пора сделать какой-то механизм для гарантированного удаления говна на уровне компилятора.
>когда там в С++ уже завезут =delete для своих методов а не только операторов и конструкторов/деструктора?
Retarded? Ещё в C++11 завезли. Даже для free functions можно, не только методов.https://wandbox.org/permlink/ooDbZbcgXdKwD8sD
Охуеть плюсы продвинулись. Может, ещё и рефлексию и lisp-стайл макросы добавили давно, просто никто не заметил?
>class Foo
>{
>virtual void pina() {cout << "пора бухать";}
>};
>
>class Bar : public Foo
>{
>void pina() = delete;
>};
>
>Bar bar;
>bar.pina(); <===== ERRROOOORRRR, НИЗЯ
И без `void pina() = delete;` будет ERRROOOORRRR, НИЗЯ
а еще я вносил серьезные правки в проект, и типа после моих правок одни баги исчезали и вероятно появлялись другие для меня не очевидные.
когда тебе приходится работать с тупым человеком, тебе приходится делать такую работу, которая обычно считается ненужной, а то и вредной. даже лично для тебя эта работа вредная, так как тебе приходиться объяснять, зачем ты переписал много кода, когда как тебе нужно было лишь добавить кнопочку.
но лично ты то видишь, что если ты просто добавишь кнопку, то в трех местах съедет верстка, в четвертом месте начнет вылетать, в пятом кнопка не добавится. пока ты читал код и думал че делать, ты нашел несколько багов сверху. в таких случаях некоторые принципы разработки идут нахуй.
а на счет лишнего мертвого кода - а нахуй он нужен, он же все равно будет в системе контроля версий, так что можно удалить и восстановить по желанию. я думаю так, удалять такой код можно, что бы глаза лишний раз не мозолил. но я говорил не про неиспользуемый код, а про используемый раздутый говнокод.
Рефлексия в С++26
Пытаюсь разобраться с реализацией очереди массивом..
Сап, плюсики, подскажите пожалуйста что на пикрил происходит. Она же всегда 0 дает. Тогда зачем ? Более полная часть кода тут https://rentry.co/sourcecode/raw
там какой-то код, который к С++ отношения не имеет. Или там пробелы пропущены в аргументах функций
там сыроватый код но логика определенная есть. под очередь выделяется память, допустим int[100]. изначально очередь пустая, по этому начало и конец очереди 0 0. добавляется элемент в очередь, конец становится 1. берется элемент из очереди и начало становится 1, как и конец.
после нескольких таких операций начало и/или конец могут выйти за границы куска памяти. код на пикриле как раз для защиты от этого.
допустим начало очереди на 98 элементе массива, я добавляю элемент и конец становится 99, я добавляю еще элемент и конец выходит за пределы массива, но память уже есть выделенная и можно просто начать залазить в начало массива. финт с остатком от деления общеизвестен, к n + 1 ты дописываешь (n + 1) % data.length и ты уже не выйдешь за пределы массива.
перепиши псевдокод for(i = 0, i < 100) { print(i % 10)} и посмотри что будет.
а то, 6 лет плюсов, но нихрена не понимаю, конкретны ответ таков: ты тупой, не лезь в кресты
>6 лет плюсов
пошли авторитетные аргументы
а у меня жопа толще, соси быдло.
Видел я вас таких, пиздят тудя сюда языком, а по-факту сами нихуя не понимают.
Алсо, я вообще мимиокрокодил.
проходи, не задерживайся, если ты нормально код запостить не можешь, что с тебя взять? ты задаешь вопросы, но задаешь из без уважения
>если ты нормально код запостить не можешь
Какой код, поехавший. Я мимошел и увидео твои охуенно ценные ответы уровня, "идите нахуй", надменность всегда отличает находящихся под эффектом Даннинга — Крюгера.
>ты задаешь вопросы
Пиздец, и вот это pr сегодня, не понимает даже как wakaba работает. Ебушка воробушка.
хуя, а юродивых на руси все еще любят
Вот, братишка понимает, что посты отсталых снижают общий уровень интересности тредов. Когда уже кресты (си с классами) перестанут преподавать в вузах? Дожить бы!
Возьми любой готовый генератор и сделай ему thread_local стейт
Тебе нужен генератор случайных чисел, где семя изменяется на 1 каждый шаг. Ты его перепиливаешь так, чтобы в для примерах трёх потоках семена были 0, 1, 2, и каждый шаг семя изменялись на 3, а не на 1.
Если на быстродействие более-менее плевать, ты делаешь 3 одинаковых генератора в одинаковом состоянии, второму и третьему проводишь 1 и 2 итерации. Потом при извлечении числа выполняешь итерацию 3 раза, и берёшь только последнее значение. Из плюсов - это сработает с любым генератором, даже где семя меняется непредсказуемым образом.
Не уверен что все генераторы сохранят свои свойства рандомности, равномерности распределений и всё в таком роде - нужно проверять.
>>54920
Угу, и это утонет, тому что он вместо 10 мс будет генерировать 10к значений в течении нескольких секунд.
Лучше тогда единый циклический массив создавать, и оттуда с помощью атомарного счётчика извлекать значения. Например, буфер на 256 значений. Метод атомарно увеличивает значение, забирает число, и потом генерирует новое (в массиве помимо числа хранятся состояния генератора и номер). Можно и стек какой-нибудь неблокирующий прикрутить, но что-то я больше в циклический массив вижу.
Ещё лайфхак: не читать посты, в которых есть буква Q. Моя жизнь действительно стала намного легче, когда я начал игнорировать qt-детей в этом итт треде.
То ли дело посты с буквой "w" от winapi-олдов.
Он говорит, что третий аргумента find'а должен быть типа std:;vector<int>, а не int.
у тебя вектор из векторов, только вместо вектора ты почему-то ищещь число.
Это как бы в ящике ящиков ты бы искал содержимое ящиков
1. Цитата: «В C++ неймспейс-скоуп — это такое глобальное состояние, которое можно менять (через инстанциирование шаблонных структур с функциями-друзьями), и которое можно считывать (через SFINAE, detector idiom и тому подобные трюки). Интересно, можно ли это считать ещё одним тьюринг-полным языком внутри C++?» [1]
Вопрос: Поясните, где там именно это «глобальное состояние»? Как оно меняется? Как его записывать? Как его считывать? Пока непонятно. По статье с Хабра: причем вообще здесь if constexpr(false) и template<typename> void foo() против void foo()?
2. Цитата: «This type loophole basically allows us to store some type into a "variable" and later read it back! It's very powerful» [2].
Вопрос: Так а type_list а-ля Александреску ведь то же самое делает. Разве нет?
Источники:
1. https://habr.com/ru/post/472780/
2. https://alexpolt.github.io/type-loophole.html
Ещё такая цитата есть: «Defining a friend function in a template, then referencing that function later provides a means of capturing and retrieving metaprogramming state».
> Поясните, где там именно это «глобальное состояние?
Очевидно, в компиляторе.
>Как оно меняется? Как его записывать? Как его считывать?
Так это же сабж статьи, состояние неожиданно поменялось. Записываешь определением функции, читаешь попыткой её вызова.
> По статье с Хабра: причем вообще здесь if constexpr(false) и template<typename> void foo() против void foo()?
В стандарте содержимое if constexpr (false) отбрасывается только в шаблонных функциях, поэтому в обычной функции ничего не отбросилось.
ебать там комментов насрано
но я, несмотря на то что и целиком книжку александреску читал (еще в нулевых) и "шаблоны с++" вандервурда тоже читал, те, в принципе, могу понять че там делают, НО нахуя?
зачем
>>55205
Ну и не забивай себе голову, там по ссылке
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2118
эту хуйню всё-равно собираются запретить
У меня есть луп1, он ожидает нажатия одной из двух клавиш (Х, SPACE) и выполняет действия, которые в конечном итоге ведут в луп2
Луп2 выполняется бесконечно до тех пор, пока не будет нажат Z, после чего будет осуществлен переход обратно в луп1.
Проблема в том, что если кнопка выхода из луп2 будет нажата еще до входа в сам луп - после входа луп2 выполнится один раз и тут же выйдет в луп1.
Как сделать так, что бы кнопка засчитывалась только тогда, когда выполняется участок кода который ее ждет? А то получается так, что я могу в самом начале прожать выход из лупа еще до того, как программа в него войдет.
Это побочный эффект этой функции. Тоже сталкивался с ним во время дельфиёбства. Я тогда каждый раз считывал все 255 клавиш, и уже потом проверял значение на равенство 0, залезть в описание мозгов не хватило.
Если с момента прошлого вызова клавиша была нажата, то функция выдаст не ноль, и уже только на второе считывание выдаст 0. Она же какие-то номера выдаёт - попробуй посмотри что эти номера означают, там должна быть эта информация.
Собственно, вот описание с первой же ссылке: "Если функция завершается успешно, возвращаемое значение устанавливает, была ли клавиша нажата начиная с последнего вызова функции GetAsyncKeyState, и является ли клавиша в настоящий момент отпущенной или нажатой. Если старший значащий бит установлен, клавиша находится в нажатом состоянии, а если самый младший значащий бит установлен, клавиша была нажата после предыдущего вызова GetAsyncKeyState. Однако, вам не следует полагаются на это последний характер изменения; для получения дополнительной информации, см. раздел Замечания."
А вообще используй хуки лучше. Зачем гонять цикл непонятный, если можно каллбек засунуть.
> содержимое if constexpr (false) отбрасывается только в шаблонных функциях
В Шланге и ГЦЦ сейчас баг.
Сейчас, если get пределён как get(type<tag>), то они НЕ отбрасывают (НЕкорректное поведение).
Пример: https://wandbox.org/permlink/oLLKYqbl4QFxIddO
Если заменить определение get:
- было: get(T)
- стало: get(type<tag>)
то:
- Шланг: отбрасывает (корректное поведение)
- ГЦЦ: НЕ отбрасывает (НЕкорректное поведение)
Пример: https://wandbox.org/permlink/DysX56FrbZ899H6F
МСВЦ отбрасывает (корректное поведение) и при get(T), и при get(type<tag>).
>НО нахуя?
Тоже не понимаю. Если уж оч. нужно работать в компайл-тайме (вычисления/рефлексия), то «вбилдили» бы в С++ норм. язык для компайл-тайма (например, CCL -- С++ Compile-Time Language), кот. исп. привычный синтаксис С++, и код на кот. помещается внутри конструкции __ccl { code }.
А сейчас порнография а-ля «в 2 часа ночи случайно нашёл новый сайд эффект в шаблонном С++ коде, сразу же пролил (от радости и от ужаса) чай и уже утром (пока соображал) вместо того, чтобы тихо зарепортить на http://www.open-std.org/jtc1/sc22/wg21, написал сокрушительный пост в бложек «The New Great С++ Type Loophole», выступил на конференции -- код растащили в продакшн (несмотря на "Верещагин, уходи с баркаса!!!")».
ну лично я поклонник умеренного использования фич языка, без фанатизма
вот, к примеру, в chrono ты можешь время записать в удобной для тебя форме, а оно при компиляции уже посчитается в удобную для машины форму, окей, это удобно
вроде как и компай-тайм, но, такой, лайтовый
ну а вообще вот то что ты сказал, комитет именно это и делает в новых стандартах
раньше для вычислений компайл-тайм приходилось использовать некий набор трюков связанных с шаблонами (лень перечислять, кто незнает, может тупо открыть древнюю книжку александреску и почитать)
а щас у тебя все то же самое можно делать итеративненько (и до неприятного понятно, ибо магия пропадает) в constexpr функциях
Stateful TMP через friend injection это же рваный бойан.
Да, отбрасывание происходит в foo.
get тут притом, что по факту в разных компиляторах отбрасывание (в foo) происходит / не происходит в зав-ти от определения ф-ции get:
- если тип её аргумента НЕ явл. аргументом шаблона класса, то компиляторы ведут себя одним образом (в основном НЕверным), - если тип её аргумента явл. аргументом шаблона класса, то другим (в основном верным).
как боженька пояснил!
Вот, наверное, ставший уже классическим, тривиальный пример stateful template metaprogramming для 2-х состояний (false / true) [1].
Операции с состояниями:
- Запись состояния: 1-й вызов int f () => 1-й вызов оператора noexcept (flag (0)) => так как на данный момент friend-ф-ция int flag (int) еще не определена, то noexcept (flag (0)) вернет false => 1-й вызов int f () вернет false.
- Изменение состояния: 1-й вызов ф-ции int f () => инстанцирование шаблонной структуры struct writer => определение friend-ф-ции int flag (int).
- Чтение состояния: 2-й вызов int f () => 2-й вызов оператора noexcept (flag (0)) => так как на данный момент friend-ф-ция int flag (int) уже определена, то noexcept (flag (0)) вернет true => 2-й вызов int f () вернет true.
В русскояз. пространстве есть два названия такого приёма:
1. (офиц.) «программирование на шаблонах с сохранением состояния»
2. (народн.) «протаскивание» состояния через повторные вызовы constexpr-функций» [2].
Основной принцип таких приёмов заключается в том, что инстанцирование шаблонных структур/классов в разных частях кода ведёт к определениям friend-ф-ций (доступных через ADL в глоб. простр. имен), что приводит к изменению состояния, читаемого в данном примере через вызов оператора noexcept (flag (0)).
В заключение стоит отметить, что С++ в его нынешнем виде -- это ветеран, который весь «латаный-перелатаный», весь «чиненый-перечиненый», весь «заплата на заплате», который медленно (но уверенно), через годы, через труд, пот, боль и кровь приближал (как мог) победу в ожесточённой битве за (среди прочих) производительность и zero-cost abstractions, при этом неся на себе тяжелый груз обратной совместимости с пред. С++ стандартами.
Ссылки:
1. http://b.atch.se/posts/non-constant-constant-expressions
2. https://2ch.hk/pr/arch/2018-08-16/res/1196791.html#1196926 (М)
все у тебя нормально? мать не сдохла? скажи кто тебя гото научил, я его пиздану
Это не лаба, я вообще пытаюсь учить плюсы только пять дней по вечерам после работы.
>>55687
>скажи кто тебя гото научил
Вот тут пример посмотрел. Единственная отговорка почему его "нельзя" использовать заключалась в том, что это якобы усложняет чтение программы и можно запутаться в порядке выполнения кода. Хотя, мне показалось, что это наоборот облегчает переход из одного участка кода в другой, так как не нужно создавать 99999 булианов и проверять их значения. И как выпрыгивать из многоуровневых циклов без готу я вообще не представляю.
https://ravesli.com/urok-66-operator-goto/
>почему его "нельзя" использовать
На практике goto используют только новички, или деды с седыми яйцами. Если у деда ещё не начался маразм, то ему можно, потому что он наверняка знает что делает и в конкретном случае этот goto имеет смысл.
Goto затрудняет понимание кода, рекомендуют избегать это. Из цикла всегда один выход, можно еще через break дополнительно делать, если требуется.
Кстати почему такой бугурт с ЛАБ? Вы думаете дохуя в универах объясняют и типа если возникают трудности/вопросы, то человек не учится?
Лично я ещё с начальным уровнем знаний научился гуглить и думать, а не ныть, что "это мы не проходили". А по постам большинства тех, кто идёт сюда с лабами, сразу видно, что думать они не хотят.
без гото инструкции выполняются последовательно и даже циклы и операторы ветвления работают в определенных рамках. в этом вся суть, глаза знают куда прыгать при чтении кода. гото же позволяет делать неведомую хуйню
давай чуть попозже мне станет скучно и я тебе распишу че ты хочешь там с кнопками сделать, если успею
>На практике goto используют только новички
Я новичок и просто не могу представить как можно делать эту логику перепрыгивания в нужные мне участки кода по другому, у меня не хватает знаний. Узнал об операторе, нашел пример его использования, он мне показался подходящим.
>>55777
Это не лаба, я закончил университет год назад (могу пруфануть). Хотя лучше бы это была лаба, в таком случае у меня был бы преподаватель объясняющий хоть что-то. Но я совсем один, у меня нет ни знакомых ни друзей программистов. Все что я могу - это гуглить и собирать информацию по крупицам. Вот я насобирал и написал этот говнокод, я же не знал, что так нельзя. Теперь знаю. Спасибо.
>скажи кто тебя гото научил, я его пиздану
Макконел описывал одну ситуацию кстати, когда гото может облегчать код.
Я научил, но как ты узнал?
>Кстати почему такой бугурт с ЛАБ?
Я самоучка, и потратив смешное время ещё в школе на кодинг своего платформера на gdi+ просто по фану без какой-либо цели, все эти лабы стали очень простыми. Если человек спрашивает что-то уровня лаб, то это выглядит так, как будто он просто не удосужился 30 минут посидеть и разобраться. Потому и некоторое презрение иногда проскакивает - как будто человеку этот код не интересен, а он хочет сделать конкретное задание и забить. Даже если я сознательно понимаю что это не так, отделаться от общего негативного впечатления не всегда получается.
Те ребята которые гонят на гото мне тоже не нравятся. Концепция очень хорошая и отражает то что действительно происходит на процессоре. Если поймёшь гото - то поймёшь всё остальную логику с условными переходами в любых рекурсиях и циклах.
Использовать его не стоит в чём-то сложнее кода в один файл или выхода из двойного цикла (где goto полностью эквивалентро return-у в функциях, который никого особенно не смущает почему-то), но разобраться он как работает и какие побочные эффекты вызывает - очень хорошая идея.
Странно ненавидеть Goto. Но хуёво использовать его не к месту.
Это си, гений. И там это используется а-ля try\finally очистка ресурсов.
И вообще, goto очень серьезно ломает всю систему жизни обьектов в С++, там ехал UB через UB, если не знать точно, что ты делаешь, что не является случаем студентиков.
Короче - goto нахуй и впизду.
И что что Си? На крестах без ООП ты как будешь ресурсы очищать? try\finally платформозависимый код и не везде может применяться, да и вообще эта конструкция еще опаснее и сложнее, чем goto. Goto позволяет улучшить качество кода и сократить его.
Подскажите какие-то книги или другие ресурсы по изучению плюсов.
Я не нуб, знаю JS на высоком уровне и основы плюсов (йобаное ООП, перегрузку функций, указатели и т.д.).
Хотелось бы освоить тонкости самого языка, все эти инлайновые операторы, библиотеку Windows.h, её аналог под nix'ы, tcp/http на плюсах.
Пробовал msdn, но это пиздец, по сравнению с mdn - кусок дерьма, но если ничего другого не найду, придеться сидеть на нём =(
Не обязательно писать while(variable == true), эта запись эквивалентна while(variable)
Tour of C++ страуструпа. А дальше уже нужные тебе области отдельно.
По самому язык бери любую книгу из шапки.
По "Windows.h" копай в сторону WinAPI. На эту тему есть отдельная литература. Однозначного аналога для Unix нет, он не такой монолитный, как винда. Тут и POSIX API, и вещи, типа dbus/xcb/etc. В общем, много всего.
Хипстерский сайтик, где всё это было бы в удобном формате в одном месте, ты вряд ли найдёшь. Придётся копать кучу литературы.
А нахуя мне это делать, ебаклак? Мы в С++ треде. Может мне еще гитару без струн сделать? Телевизор без экрана? Что еще придумаешь охуенного?
Все топовые крестовики мира пишут про RAII, но сегодня мы узнали от эксперта с двача, который знает, про что С++, что все эти эксперты ошибались. Что же делать. Как быть.
Хотя если у тебя есть желание продолжить меня смешить - можешь рассказать нам, про что С++ по твоему авторитетному мнению.
>библиотеку Windows.h
Освой создание простых (без кастомных контролов и GDI) GUI на чистом WinAPI. Освой многопоточность через processthreadsapi.h. Освой получение данных о железе через WMI.
>tcp
Winsocks
>http
WinHTTP. Есть ещё WinINet, но я не юзал его.
так то raii щас нужен когда нужно управлять другими ресурсами, а не памятью
для памяти есть умные указатели (и в стандарте тоже), которые и реализуют из коробки идеому raii
также семантика перемещения вообще позволяет реализовать интересный подход, когда отказываются от выделения чего-то на куче, а делают все на стеке
Спасибо за то, что решил таки продолжить меня смешить, тебе это удается. На всякий случай - ООП это парадигма, а не использование слова class в нужных местах.
И да, ты прав в том, что язык действительно мультипарадигменный, и за счет этого он позволяет в нужных местах использовать наиболее подходящие инструменты, а не тупо забивать гвозди ломом, при этом вопя что ООП ПРОШЛЫЙ ВЕК ДЖАВА ГАВНО НАСЛЕДОВАНИЕ АХАХА ДЕДУЛЬ
В линуксе вместо винсока дефолтные BSD сокета. Собстно, винсок - это калька с них. Вместо WinHTTP там дефолтный libcurl, кстати, настоятельно и под виндой рекомендую его использовать. А еще лучше - обертки, типа curlpp были, которые сишный ад превращают в читаемое C++ API.
Смешишь тут только ты, обосравшись несколько раз в терминологии и наглядно показав свою некомпетентность.
Где вас, таких конченых идиотов берут, и что вы забыли в С++ треде? Вот вопрос, который меня очень интересует. С GOTO, с тем, что RAII это ООП, а ООП уже никто не использует, и с прочим кретинизмом человека, который не написал ни одной строки в прод, но почему-то считает, что знает С++.
qt для серьезного UI, для самодельной херни и простоты - imgui или nanogui
Понял, спасибо.
Мань, я вижу ты любишь высасывать аргументы из своего ануса и придумывать на ходу. Чем тебе Goto не угодил? Ты на сях судя по всему и хеллоу ворлда не писал и что-то кукарекаешь за прод еще.
> что RAII это ООП
Где я это писал? Еще какую-то хуйню в предыдущем посте про классы придумал. Совсем сказать нечего по делу.
>Топовые крестовики похоронили ООП еще в 2015-2017.
что это за чушь?
с++ остается ооп языком
мы все также пишем классы, определяем члены-функции в них, задаем кострукторы-деструкторы, задаем операторы преобразования и конструкторы преобразования (те мы конструируем пользовательские типы данных, определяем операции, доступные над этими типами данных и операции регулирующие жизненный цикл переменной этого типа данных, так же мы задаем и отношения между типами данных)
все так же мы используем наследование между классами, проектируем гомоморфные иерархии классов (те мы задаем отношения между типами данных), другое дело что сейчас есть альтернативный подход через шаблоны - а именно классы считаются объединенными в семейство классов если удовлетворяют параметру шаблона (плюс в языке есть уже развитая экосистема для этого - а именно type traits и другие средства, в с++20 будут концепты)
мы все также используем полиморфизм (базовую концепцию опп, вообще то), другое дело что там где возможно, динамический полиморфизм посредством виртуальных функций заменяется на статический полиморфизм, реализуемый через шаблоны, либо на ad-hoc полиморфизм перегруженных функций
можно говорить, что ооп в с++ изменяется, но он ооп остается ключевой идеологией языка
> Resource acquisition is initialization (RAII)[1] is a programming idiom[2] used in several object-oriented languages to describe a particular language behavior. In RAII, holding a resource is a class invariant, and is tied to object lifetime: resource allocation (or acquisition) is done during object creation (specifically initialization), by the constructor, while resource deallocation (release) is done during object destruction (specifically finalization), by the destructor. In other words, resource acquisition must succeed for initialization to succeed.
>Мань, я вижу ты любишь высасывать аргументы из своего ануса и придумывать на ходу. Чем тебе Goto не угодил? Ты на сях судя по всему и хеллоу ворлда не писал и что-то кукарекаешь за прод еще.
Ох, эти проекции сбрендившего студентика.
>>55916 - вот тут ты эту хуйню высрал. Но продолжай маневрировать.
Свой гуй можно поверх хоть голого опенгл сделать, Но это не делает опенгл библиотекой для гуя.
Тогда qt или GTK+ (gtkmm). Под винду WinAPI, но он может быть сложноват, да и в Linux работать только через WINE будет.
забавно то, что когда ты пишешь гуй на qt внезапно обнаруживаешь что ты пишешь гуй на js, лол
точно так же и гуй на gtk удобней писать на vala..
MFC, без шуток
Коряво, но работает, не требует сторонних библиотек и твой проект прекрасно соберется даже через 20 лет.
одна из забавных оптимизаций, работающих и в настоящее время.. из-за лучшего предсказания переходов..
положим, если в каком нибудь интерпретаторе можно переписать основной луп со свитчей на goto то можно получить нихуевый буст к скорости..
В студию пример с goto, который работает на 10-15% аналогичного свитча, и методику тестирования, по которой это было замерено.
из-за чего кстати, первые проги на си проигрывали фортрану в производительности..
Объектно-ориентированных подходов много, конкретно тот самый ООП мертв.
>>55975
Что-то я не вижу там этого. И да, вон выше вырезка из вики для тебя. В ООП владение ресурсом реализуются через RAII идиому. С чем ты не согласен то? И так давай подведем итоги:
1. Ты не умеешь пользоваться оператором goto, как следствие яро утверждаешь что он не нужен, что говорит о низком скиле
2. Обосрался в терминологии RAII, не до конца осознаешь что такое объектно-ориентированный подход в программировании, как он может быть реализован
3. Додумываешь какую-то хуйню у себя в голове из-за низкого уровня знаний и некомпетентности, каши в голове и выдаешь это за мои слова или свою истину.
4. Список маневров:
> Ох, эти проекции сбрендившего студентика.
> Но продолжай маневрировать. О да это же самый базовый метод маняврирования - уличить оппонента в маняврировании
> Где вас, таких конченых идиотов берут, и что вы забыли в С++ треде?
> Спасибо за то, что решил таки продолжить меня смешить, тебе это удается.
> Все топовые крестовики мира пишут про RAII, но сегодня мы узнали от эксперта с двача, который знает, про что С++, что все эти эксперты ошибались. Что же делать. Как быть.
Хотя если у тебя есть желание продолжить меня смешить - можешь рассказать нам, про что С++ по твоему авторитетному мнению.
В принципе все твои посты это флуд и маневры, по делу нуль полный.
> 1. Ты не умеешь пользоваться оператором goto, как следствие яро утверждаешь что он не нужен, что говорит о низком скил
Тут я закончил читать, сорри.
Сказал долбоеб с полными штанами говна, который отправил за упоминание RAII в С# тред, потому-что ООП мертво.
У тебя проблемы с мышлением, логикой, да и с бошкой скорее всего в целом. Подлечись что ли, таких в люди страшно выпускать.
Опять проецируешь, да сколько можно же.
Насрал в штаны - признай это. Нет, опять какую-то хуйню несет. ООП у него в C#, навыки пользования оператором goto у него показатель скилла, и прочая хуйня.
> ООП у него в C#
Скажешь нет? Штирлиц никогда не был так близко к провалу. Спасибо за эти кривляния, забавно выглядит.
Я ничего тебе больше не буду говорить, тут понятно, что между нашими скиллами разницы миры, и ты даже понять не можешь, что я тебе пишу.
Когда устроишься на первую работу - попробуй нахуярить GOTO в проде, расскажи всем, что классы устарели, ведь это ООП, и доставь кулстори о результатах.
Вытекаешь уже из треда.
- гото действительно можно использовать для лаконичности кода долбоебы в общем то и без гото нахуярят говна
- ооп это блять простой подход для распределенной работы над проектом нескольких человек, я же расписывал недавно
- студенты хуесосы и идут нахуй. раньше я на них тоже бугуртил "иди погугли даун первая ссылка", а за это модераторы хуесосили на форумах. потом я понял, что если все таки решать их глупые задачи, то они так и останутся долбоебами, а это хорошо. зачем продолжать плодить вкатывальщиков?
а оно провалилось?
Я не в теме вообще, на QT не пишу, но мне казалось, что кутишники очень много сил и ресурсов вложили в QML
Со студией все отлично, с проектом, который никто не обновлял с 2010 все очень плохо обычно.
>очень много сил и ресурсов вложили в QML
Провели большую работу, изобретя колесо. Квадратное.
>И вообще, goto очень серьезно ломает всю систему жизни обьектов в С++, там ехал UB через UB
Ты с setjmp/longjmp не путаешь?
Покажи код.
ООП это грамотная организация кода, которая позволит тебе в будущем и настоящем его улучшать, либо использовать в других программах. Не следовать его принципам можно только если ты любишь поковырятся в собственном дерьме/не планируешь использовать исходный код, в том числе изменять его/любишь изобретать велосипеды.
Сап, хочу несколько тупых вопросов задать.
1. Что мне мешает на любую околоматематическую функцию вешать constexpr, вдруг где-то внутри сконстантится?
2. Что мне мешает на любую работу с фиксированными векторами, типа элементы вектора A возвести в квадрат и передать в B вешать (если работаем в цикле) #omp parallel for и радоваться ez параллелльности?
3. Если для случая выше применить std::transform, может ли оно когда-то где-то само соптимизироваться в параллельность?
>1. Что мне мешает на любую околоматематическую функцию вешать constexpr
То, что околоматематические функции лезут в глобальное состояние.
подход, когда к ооп относятся как к одному из вариантов реализации пользовательских типов данных и задания отношений между ними, мне ближе, тк позволяют дать более формальное (близкое к математическому) определение
в с++ класс - это пользовательский тип; доступные операции над типом задаются через определение членов-функций; переменная типа - это объект; способ создания объекта задается парой конструктор-деструктор; отношения между типами задается посредством наследования классов, посредством членов-функций преобразования и конструктора преобразования; динамический полиморфизм взаимосвязанных типов реализауется через механизм виртуальных функций; и далее по списку..
в других языках существуют другие способы реализовывать пользовательские типы, вообще работать с типами
но в с++ все же основной подход остается через ооп
помогите мне пожалуйста. Я пытаюсь собрать проект на qt 5.13.0 с использованием grpc под андроид с abi armeabi-v7a , ndk r18b. На десктопе все работает. Но когда я пытаюсь собрать проект под андроид, проект компилится но во время линковки у меня выводится ошибка, что-то вроде
>grpc++: incompatible target
то есть мои либы grpc для архитектуры мобильника не подходят как я погуглил. Я пытался компилить grpc с помощью ndk вот по этому скрипту https://github.com/grpc/grpc/issues/19794#issuecomment-516588669
но когда я проверил скомпиленные таким образом статические либы с помощью команд ar и потом file, то оказалось что они скомпилены под архитектуру x86_64 а не под arm.
Но я еще я нашел скрипт для protobuf под андроид и по этому скрипту https://developers.google.com/cardboard/develop/c/protobuf когда я скомпилил либу и посмотрел для какой архитектуры она сделана, то было написано что для арм.
Может кто-нибудь собирал проект на qt с grpc под андроид и собирал grpc с ndk? Подскажите пожалуйста скрипт.
И вот надо что-то дописать, а как при декодировании это пропустить?
Вся идея хаффмана, что ты пишешь кашу из битов. Не надо ничего дополнять куда-либо.
грамотно организовать код можно и без ооп. повторно использовать код можно и без ооп. ковыряться в дерьме и клепать велосипеды можно и с ооп.
давай подробно разберем повторное использование кода, для примера. как ооп помогает в этом? то есть ты предлагаешь просто взять и скопировать нужные классы в другой проект? допустим даже код без багов, а если в другом проекте не будут нужны все поля из первого проекта, или некоторых будет нехватать? а в третьем тебе одна функция нужна, ты серьезно это пишешь дебил бля ебаный? пошел нахуй школьник
Но ведь он не говорил ни про какой диплом?
> Или раньше деды прям ассемблер вставки делали?
Только если совсем упоротые. Для людей есть интринсики.
> то оказалось что они скомпилены под архитектуру x86_64 а не под arm.
Я вижу, что там проверяется ANDROID_TARGET_ARCH в скрипте и согласно ему qt подключает нужную сборку. Во-первых, посмотри, есть ли $$PWD/android/lib/libgrpc++.a вообще после запуска скрипта. Во-вторых, qt под какую архитектуру собирает у тебя? В qt creator в открытом проекте в левом нижнем углу кнопка типа build, там должна отображаться архитектура.
сука гото сектант ебаный, говори адрес я тебе очко раздеру
>>55220
чел чел чел я тебе обещал расписать что там. в общем я понял что ты хочешь, и это все хуйня что ты написал.
решается это все одним флагом. если флаг true, то ты проверяешь кнопку z, если флаг false, то ты проверяешь кнопки z и space. все в одном цикле. все очень просто.
вот псевдокод
bool flag = false;
while(1) {
if (!flag && (getkeystate(x) || getkeystate(space))) {
flag = true;
// ... действите которое ты хочешь совершить при нажатии на x или space
}
if (flag && getkeystate(z)) {
flag = false;
// ... действите которое ты хочешь совершить при нажатии на z
}
sleep(10);
}
Нельзя записать 43 бита. Можно 5 байт, можно 6, но 5.375 байта нельзя, и поэтому приходится округлять
Так действия на 'Х' и действие на Space разные, но оба действия в конечном итоге ведут в один и тот же луп, выход из которого по кнопке Z.
А ты объединил их в одно.
>Я вижу, что там проверяется ANDROID_TARGET_ARCH в скрипте
я не понимаю, в каком скрипте?
>Во-первых, посмотри, есть ли $$PWD/android/lib/libgrpc++.a вообще после запуска скрипт
я вручную скопировал все либы из grpc/cmake/build в android/lib/ моего проекта, но когда я проверял, скомпилены ли они под armeabi-v7a командой file x libgrpc++.a и потом file *.o, то все файлики то вывод был что все скомпилено под архитектуру ubuntu x_64, то есть как мне кажется, я как-то не так компилю grpc, поскольку когда я попробовал использовать скрипт https://developers.google.com/cardboard/develop/c/protobuf для протобафа и потом проверил скомпиленную либу ar и file, то показало что скомпилено под arm.
> Во-вторых, qt под какую архитектуру собирает у тебя
под armeabi-v7a. Мой проект без grpc нормально собирается под андроид
у тебя проблемы с этим?
bool flag = false;
while(1) {
auto xstate = getkeystate(x);
auto spacestate = getkeystate(space);
if (!flag && (xstate || spacestate )) {
flag = true;
if (xstate) {
// действие на x
} else if (spacestate) {
действие на space
}
}
if (flag && getkeystate(z)) {
flag = false;
// ... действите которое ты хочешь совершить при нажатии на z
}
sleep(10);
}
goto сектант - это другой обоссаный челик
> я не понимаю, в каком скрипте?
В этом. https://github.com/grpc/grpc/issues/19794#issuecomment-516588669 тот коммент, ссылку на который дал
Там сборка под каждую архитектуру в свою подпапку, потом инструкции для qmake, для .pro файла, видимо.
> cmake --build .
Или в том и проблема, что не в подпапку, а в текущую папку перезаписывает каждый раз для каждой архитектуры, а последняя архитектура там как раз x86_64.
поскольку мне надо проект собрать под armeabi-v7a, то я юзаю только первые 4 команды cmake, но после первых 2 команд создается 9 либ, которые я копирую в свой проект, но когда я их проверяю командами ar и file, они все равно для x86_64. И после еще 2 команд создаются все библиотеки, grpc++_unsecure и прочие и тоже для x86_64.
Понял, тогда у меня больше нет вариантов, где ошибка.
Чего? Это не я писал. Не забывай, что ты на борде. А тот студентик да, пусть нахуй идет. С его слов си дайз не ООП язык. Мне даже интересно, что этот обезумевший первокур в треде забыл, лабу бы пилил шел.
В каком смысле складывать? Что это означает и какой результат должно выдавать?
Если это математические функции, ты можешь написать новую являющуюся суммой двух предыдущих, если у них типы и всё остальное такое же.
А если у тебя одна функция копирует массив байт, а вторая сортирует записи в файле, то суммой этих функций будет являться что?
Я точно не уверен, но результатом будет, что-то вроде
функция В = функция А + функция Б. И когда я вызываю функцию В, то первой будет вызвана функция А, а потом функция Б. Обе функции принимают параметры, которые передаются функции В
Короче.
Если тебе надо F(u) = f(x) + g(y), где u = x + y, то ничего путного ты не нагуглишь, так как это интуитивно понятная вещь, сложение результатов функции. Как если ты результат вызова каждой сохранишь в переменную и потом сложишь.
А если тебе надо F(x) = f(g(x)) или, что вернее, F(x) = f(x) g(x) - то это композиция и просто результат функции g передается в функцию f. Что тоже интуитивно понимается и можно так же через дополнительную переменную сделать.
ага
в стандартной библиотеке есть набор стандартных функциональных объектов, адапторов, привязок, при помощи которых ты можешь комбинировать функторы, свободные функции, функции-члены классов, лямбда-функции между собой, порождая новые функторы, ну а дальше передавая их в стандартные алгоритмы, например
Вакаба съела кружочек, да и полностью верная формула выглядит по-другому немного.
Можно, если ты хочешь обращаться функциональщиной.
А можно сделать функцию F, которая внутри себя складывает результат вызова f1 и f2.
И передавать в нее x и указатели на эти две функции. Либо std::function вместо указателей, если плюсовым способом, а не сишным.
Или захардкодить вызов этих функций внутри F.
Надумал проблему. Просто берешь и вызываешь по-очереди А и Б внутри В. Можешь заинлайнить их если очень хочется.
Постите смешное сами.
это нужно, к примеру, чтобы сконструировать функциональный объект из существующих по месту и сразу же передать в использование (в стандартный алгоритм, в частности)
щас правда удобней стало лямбдами пользоваться
вообще смысл в том что ты создаешь новый функтор посредством комбинирования других функторов, а не его определением посредством написания кода вручную
Если меня не обманули в инета, то все пользовательские манипуляторы работают только когда их вызвали, а вот мне нужно подобие работы манипулятора hex. Один раз вызвал и потом все целые числа отображаются в шестнадцатеричном виде. Только в моём случае вызов манипулятора запускает подсчет выводов в поток
>Никто из школьников-хейтеров goto итт его никогда не использовал
Использовал в дипломной работе для выхода из вложенного цикла. Брат жив, зависимость есть.
Где-то у Страуструпа есть телега, где он пишет, что в этом случае goto самый простой, а потому самый лучший способ.
В качестве альтернативы некоторые предлагают использовать исключения. Уёбки.
Быстрофикс: вылеты происходят, когда я пытаюсь выделить память на новую матрицу (адрес сохраняю в тот же указатель), и только в том случае, когда новая матрица больше по размеру.
То есть ты спрашиваешь, почему у тебя падает код, который ты не запостил. Умно, умно
На пикриле эквивалентный код. Может я неясно выразился, но я спрашиваю, правильно ли освобождать память так.
какой хороший студентик
возможно ты еще и устроишься дальше по жизни в темлом офисе, а не здохнешь под забором
У меня тоже такая проблема была, я просто делал проверку на изменение матрицы и запрещал удаление, если она менялась.
В сторону api твоей операционной системы.
Конечно не жаловались, потому что те, кто бы жаловался, не будь у них выбора, перешли на нормальные языки.
Я новичек в теме, могу глупостей написать, так что соре
Есть вопрос: Совместима ли библиотека json-c и c++, и если да, где найти гайды по работе с ней ?
Почти все сишные библиотеки могут работать с С++. Конкретно json-c у нас где-то есть в проде, работает норм.
Но я бы строжайше не рекомендовал использовать сишное говно в крестокоде - посмотри на самую правильную JSON либу существующую - https://github.com/nlohmann/json
Мамой клянусь, усё сделаю.
>>58244
10 лет бд, формошлёпства и петов, всякая низкоуровневая поебота уровня ардуин. В общем не блидинг едж, всякую вычурную плюсовую пургу не вкуриваю, но задачи выполняю. Не задрот, проще говоря.
>>58266
Это понятно что зависит. А как сориентироваться то?
>>58235
Вообще я так понял нужно что-то более адекватное чем плюсы искать? Что посоветуешь для беспроблемного трудоустройства?
>нужно что-то более адекватное чем плюсы искать?
Если есть опыт разработки бэкендов высоконагруженных, обработки видео-аудио, блокчейны, компьютерного зрения и машинного обучения (тут хорошо бы еще питон знать), и т.п., то прекрасно устроишься и тебя всячески ублажать будут.
А просто так С++ кому особо нужен? Это же не джава, на хороших плюсовых вакансиях он обычно идет плюсом к серьёзным задачам.
Ну можно еще на какое-нить формошлептство на Qt и прошивку микросхем устроиться, но там зп микроскопическая обычно, сам же знаешь.
https://ideone.com/1C87pk
Нормальные люди запихивают свои формочки в *.ui и добавляют uic в pre-build step. В конструкторе у них остаётся
m_ui = std::make_unique<Ui::MoyaForma1>();
m_ui->setupUI(this);
Ого, стоило одному шизику подавиться мацой - сразу же подъехал второй.
В том то и дело что не знаю, какой расклад. Ну теперь понятнее стало. До этого фрилансил на другом языке и вообще трудоустроен был чисто формально. Вот думаю вкатиться в С++ или другой язык уже искать, посмотрел стату по зарплатам, вроде примерно одинаково все получают, а в случае с С++ предположу это будет поддержка говна мамонта. Высоконагруженный бек осилю, но опыта мало.
Любой кьют бесплатен, всё равно никто не узнает.
Пиздец, а как по-твоему работать без проекта?
Если ты очень ебанутый, можешь всё в одном проекте писать, но с разными конфигурациями, исключая при этом ненужные файлы из сборки
Можно. Использовать gcc в консоли.
Можно объединить несколько проектов .vcproj в одно решение .sln.
Внутри вектора такое же говно на указателях, но вектор нихуя не зеро кост. Как минимум пуш бек каждый раз выполняет лишнюю проверку. Вот я зарезервил 1 млн элементов, пушбекаю, и у меня 999999 раз пройдет бесполезная проверка на сайз != капасити.
Хуя ты экономист.
Ты на IBM 5100 пишешь?
Бтв проблема push_back не в проверке size != capacity.
Судя по большинству постов здесь, плюсовики вообще пишут исключительно уберхайлоад и исключительно для уберслабого железа. Поэтому язык и уходит из прикладухи, что вся эта перформансопетушня отпугивает новичков.
Я про то, что плюсы пропагандируют "не платишь то что не используешь", и при этом у нас до сих пор нет метода unsafe_push_back
Так-то благодаря предсказанию переходов и какому-нибудь if [[__builtin_unlikely]] (size_ == capacity_), эта хуйня почти не будет влиять на скорость. Да и не так страшен пушбэк, как сортировка пузырьком после него..
Крестослесаря прост, шараги где учат крестослесарей. Специфика пахомии. Так-то видел вакансии в самых разных сферах, буквально вчера кресты шли в дополнение к аналитике с биг датами с окладом 400k в месяц на руки.
Разве этот класс-член не будет уникальным для каждого типа шаблона? В гугле пишут, что нужно наследоваться от класса со статическим членом.
Чето я не видел такого, скинь вакансии.
Ну и говнище эти кресты, пиздец. Попытался повторить описанное, и при компиляции ругнулся даже не компилятор, а линкер нахуй.
https://ideone.com/cINLKC
Нешаблонный базовый класс, например
>линкер нахуй.
Дык очевидно: статическая переменная должна где-то жить. То, что в классе - это объявление, но она также должна быть определена в какой-нибудь единице трансляции. Также не забываем, что каждое инстанцирование шаблона - это отдельный тип.
А теперь попробуй не внутри класса определить класс со статической переменной, а снаружи, внутри инициализировав его экземпляр.
Теперь любой инстанс твоего шаблонного класса будут обращаться к классу снаружи с - о, чудо! - статическим членом.
Ты не просто не понял, как работает генерация кода в этой ситуации.
>>59671
Как вариант. Родитель - обычный класс, наследник - шаблонный.
Ещё можно внутрь класса положить указатель на глобальную переменную, но это пахнет плохо совсем.
Нихуя не понял, тащи код. Так как это правильно делается по итогу? Проблема то реальная.
Вот это истории. Если ты не понял, то
>Лабы идут нахуй
А если ты где-то работаешь - надеюсь, тебя нахуй уволят.
Понятно все с тобой, хуйни насоветовал которая не работает, глобальные переменные блять, так еще и выебывается.
Да кто ж тебе виноват, что ты слеп, глуп и не можешь погуглить и подумать? Конечно, анон с двача.
static inline в твоем кейсе
тогда вместо reserve и push_back ты можешь использовать resize и [], но тут надо смотреть какой вариант по итогу будет быстрее
в любом случае современный способ поднять производительность в новых плюсах - это использовать механику перемещения, а еще лучше в комбинации с in-place размещением (move-конструктор и emplace_back)
Плюсы и кьюти это два разных языка. Не соглашайся на формошлепство, анон.
не, ну "по месту" ты его и так не сконструируешь, тк resize заполняет контейнер с использованием конструктора по умолчанию
но, если у тебя в классе элемента контейнера написан move оператор присвоения, то присвоение rvalue временного объекта через [] произойдет при помощи механики перемещения
p.s. тебе не кажется что использовать сажу с твоими текущими знаниями выглядит несколько высокомерно?
да, есть вариант конкретно задротить qt (посредством прочтения пары книг по qt и запиливанием пет-проекта)
ну и аплаится конкретно на вакансии связанные с qt, в этом случае почти наверняка устроишься, даже будучи без коммерческого опыта за спиной
но стоит учитывать что зп будет одной из самых низких в отрасли - тысяч 80 в дс, тысяч 60 в дс2
>resize
Кто сказал что я ресайз использую? Речь по моему шла о reserve. В принципе нормальный ответ мне уже выше дали, к чему тут костыли с рвалью? Да и мув без исключений сейчас пишут редко, разве что дефолтный поставить и надеятся что компилятор разберется.
к чему вообще был доеб до сажи я тоже не понял, она тред не топит и автоматом стоит
Главное забыл добавить, при резерве operator[] к обьекту, у которого не начался лайфтайм - уб, ты либо теряешь в производительности в любом случае
ладно, давай, студентик
пили дальше свою матрицу на голых указателях
уже неплохо что ты начал пилить диплом до нового года, прямо подвиг
повторюсь, вместо того чтобы делать reserve и push_back, делают resize и [], это и позволяет не делать bound checking (о чем ты слезно и ныл, что мол это "медленно" и поэтому стандартный вектор - говно)
А я ещё в техникуме свой диплом сделал за неделю на основе диплома из интернета по аналогичной теме, который мне дал куратор моего диплома.
такое имеет смысл делать если хранятся в контейнере не объекты а указатели (умные указатели) на объекты
ну либо если хранятся примитивные типы в контейнере
но, да, скорей всего и в этом варианте будет не быстрей
в любом случае ты зря доебался до того что выполняется bound checking при push_back, там же эта проверка быстрая, по сути там идет не проверка больше/меньше, а проверка на неравенство указателей, те программиский прием guard-значения
bool _Has_unused_capacity() const noexcept
{// micro-optimization for capacity() != size()
return (this->_Myend() != this->_Mylast());
}
Перечитай мой первый пост. Я жалуюсь на то, что плюсы пропагандируют зеро кост, и при этом в одном из самых популярных контейнеров стандартной либы нет возможности сделать пуш_бек без проверок, что как-бы с зеро-кост слабо сочетается. А как там внутри реализовано это от компиля к компилю варьируется
я тебе показал как делать вставку без bound checking в стандартный контейнер
обычными средствами контейнера, между прочим
никаких трюков
>Аноны, буду очень благодарен, если вы подскажите, что и где надо статически слинковать, чтобы приложение qt не требовало дллок.
В арчике для mingw есть qt5-base-static, в msys2 тоже готовый пакет идет. Под студию сам пердолься, собирай (но будь готов к тому, что какой-нибудь плагин неправильно скомпилируется, и придется вилкой чистить). В 5.13 статически слинкованое окошко с формочкой около 17 мегабайт, 8 после upx.
А зачем они тебе? Используй просто пуш_бэк.
System::Collections::Generic::Stack<int> stk;
System::String^ str = System::Convert::ToString(this->txtIn->Text);
str+= " ";
int X, at, pos = 0;
at = str->IndexOf(" ");
while(at != -1){
System::String^ str1 = str->Substring(pos, at-pos);
pos = at+1;
bool res = Int32::TryParse(str1, X);
stk.Push(X);
at = str->IndexOf(" ", pos);
}
System::Collections::Generic::Stack<int> buf;
System::String^ str2 = "";
while(stk.Count){
buf.Push(stk.Peek());
str2+=System::Convert::ToString(stk.Peek()) + " ";
stk.Pop();
}
while (buf.Count){
stk.Push(buf.Peek());
buf.Pop();
}
this->txtOut->Text=str2;
}
System::Collections::Generic::Stack<int> stk;
System::String^ str = System::Convert::ToString(this->txtIn->Text);
str+= " ";
int X, at, pos = 0;
at = str->IndexOf(" ");
while(at != -1){
System::String^ str1 = str->Substring(pos, at-pos);
pos = at+1;
bool res = Int32::TryParse(str1, X);
stk.Push(X);
at = str->IndexOf(" ", pos);
}
System::Collections::Generic::Stack<int> buf;
System::String^ str2 = "";
while(stk.Count){
buf.Push(stk.Peek());
str2+=System::Convert::ToString(stk.Peek()) + " ";
stk.Pop();
}
while (buf.Count){
stk.Push(buf.Peek());
buf.Pop();
}
this->txtOut->Text=str2;
}
>но числа выводятся В ОБРАТНОМ ПОРЯДКЕ
Ты представляешь что такое стек, да? Это яма. Ты засунул 1, засунул 2, засунул 3. Пока не достанешь 3, извлечь 2 или тем более 1 тебе не получится.
Тебе нужна очередь, а не стек.
Я понимаю, что в данном случае очередь больше подходит, но в задании написано стек использовать.
А, да, тебе достаточно заменить [str2=str2+System::Convert::ToString(stk.Peek()) + " "] на [str2=System::Convert::ToString(stk.Peek()) + " "+str2]. Или сделать то же самое на стадии считывания.
Просто конструировать строчку таким образом очень неэффективно, а использование очереди во много раз разумнее и это мне показалось более важной проблемой, чем твоё нарисованное ограничение.
Через указатели на первый элемент и на вершину и с помощью них уже выводи. Ну а так, правильно написали для этого очередь используют.
Лабы идут нахуй.
>[str2=System::Convert::ToString(stk.Peek()) + " "+str2]
Спасибо, теперь всё как надо.
>ачем тут нужен стек или очередь - не понятно. Просто так для галочки, записать в него, а потом считать из него
Для этого и нужен, для галочки.
да вы заебали, добавьте в шапку гайд постить код на pastebin, в посте кидать ссылку на код и прикреплять скриншот кода
петухи бля
Ммм обожаю запах свежего убца по утрам
>Несколько быстро работают регулярки в плюсах?
скорее всего с производительностью, сравнимой с реализациями тех же самых регулярок в других языках программирования.. потому что регулярки ведь старая технология уже, как их оптимально реализовывать уже известно..
те не полноценно распарсить а выдрать данные..
не надо подключать тяжелые библиотеки, тащить их в проэкт и все такое..
You can't parse [X]HTML with regex. Because HTML can't be parsed by regex. Regex is not a tool that can be used to correctly parse HTML. As I have answered in HTML-and-regex questions here so many times before, the use of regex will not allow you to consume HTML. Regular expressions are a tool that is insufficiently sophisticated to understand the constructs employed by HTML. HTML is not a regular language and hence cannot be parsed by regular expressions. Regex queries are not equipped to break down HTML into its meaningful parts. so many times but it is not getting to me. Even enhanced irregular regular expressions as used by Perl are not up to the task of parsing HTML. You will never make me crack. HTML is a language of sufficient complexity that it cannot be parsed by regular expressions. Even Jon Skeet cannot parse HTML using regular expressions. Every time you attempt to parse HTML with regular expressions, the unholy child weeps the blood of virgins, and Russian hackers pwn your webapp. Parsing HTML with regex summons tainted souls into the realm of the living. HTML and regex go together like love, marriage, and ritual infanticide. The <center> cannot hold it is too late. The force of regex and HTML together in the same conceptual space will destroy your mind like so much watery putty. If you parse HTML with regex you are giving in to Them and their blasphemous ways which doom us all to inhuman toil for the One whose Name cannot be expressed in the Basic Multilingual Plane, he comes. HTML-plus-regexp will liquify the nerves of the sentient whilst you observe, your psyche withering in the onslaught of horror. Regex-based HTML parsers are the cancer that is killing StackOverflow it is too late it is too late we cannot be saved the trangession of a child ensures regex will consume all living tissue (except for HTML which it cannot, as previously prophesied) dear lord help us how can anyone survive this scourge using regex to parse HTML has doomed humanity to an eternity of dread torture and security holes using regex as a tool to process HTML establishes a breach between this world and the dread realm of corrupt entities (like SGML entities, but more corrupt) a mere glimpse of the world of regex parsers for HTML will instantly transport a programmer's consciousness into a world of ceaseless screaming, he comes, the pestilent slithy regex-infection will devour your HTML parser, application and existence for all time like Visual Basic only worse he comes he comes do not fight he comes, his unholy radiance destro҉ying all enlightenment, HTML tags leaking from your eyes like liquid pain, the song of regular expression parsing will extinguish the voices of mortal man from the sphere I can see it can you see it it is beautiful the final snuffing of the lies of Man ALL IS LOST ALL IS LOST the pony he comes he comes he comes the ichor permeates all MY FACE MY FACE ᵒh god no NO NOOOO NΘ stop the an*gles are not real ZALGΌ IS҉ TOƝȳ THE PONY HE COMES
You can't parse [X]HTML with regex. Because HTML can't be parsed by regex. Regex is not a tool that can be used to correctly parse HTML. As I have answered in HTML-and-regex questions here so many times before, the use of regex will not allow you to consume HTML. Regular expressions are a tool that is insufficiently sophisticated to understand the constructs employed by HTML. HTML is not a regular language and hence cannot be parsed by regular expressions. Regex queries are not equipped to break down HTML into its meaningful parts. so many times but it is not getting to me. Even enhanced irregular regular expressions as used by Perl are not up to the task of parsing HTML. You will never make me crack. HTML is a language of sufficient complexity that it cannot be parsed by regular expressions. Even Jon Skeet cannot parse HTML using regular expressions. Every time you attempt to parse HTML with regular expressions, the unholy child weeps the blood of virgins, and Russian hackers pwn your webapp. Parsing HTML with regex summons tainted souls into the realm of the living. HTML and regex go together like love, marriage, and ritual infanticide. The <center> cannot hold it is too late. The force of regex and HTML together in the same conceptual space will destroy your mind like so much watery putty. If you parse HTML with regex you are giving in to Them and their blasphemous ways which doom us all to inhuman toil for the One whose Name cannot be expressed in the Basic Multilingual Plane, he comes. HTML-plus-regexp will liquify the nerves of the sentient whilst you observe, your psyche withering in the onslaught of horror. Regex-based HTML parsers are the cancer that is killing StackOverflow it is too late it is too late we cannot be saved the trangession of a child ensures regex will consume all living tissue (except for HTML which it cannot, as previously prophesied) dear lord help us how can anyone survive this scourge using regex to parse HTML has doomed humanity to an eternity of dread torture and security holes using regex as a tool to process HTML establishes a breach between this world and the dread realm of corrupt entities (like SGML entities, but more corrupt) a mere glimpse of the world of regex parsers for HTML will instantly transport a programmer's consciousness into a world of ceaseless screaming, he comes, the pestilent slithy regex-infection will devour your HTML parser, application and existence for all time like Visual Basic only worse he comes he comes do not fight he comes, his unholy radiance destro҉ying all enlightenment, HTML tags leaking from your eyes like liquid pain, the song of regular expression parsing will extinguish the voices of mortal man from the sphere I can see it can you see it it is beautiful the final snuffing of the lies of Man ALL IS LOST ALL IS LOST the pony he comes he comes he comes the ichor permeates all MY FACE MY FACE ᵒh god no NO NOOOO NΘ stop the an*gles are not real ZALGΌ IS҉ TOƝȳ THE PONY HE COMES
Реализовать паттерн наблюдатель для событий в программе, но чтобы у каждого коллбека была своя сигнатура.
Как такое провернуть? Gизъёбываться с шаблонами и тюплами?
Не изобретать велосипед и брать кют. Там уже рефлексия во все поля, можешь узнавать имя метода или объекта который тебя вызывает например.
Зачем такое может быть нужно? Разве ты не явно контролируешь, где и чем эти калбеки будут вызваны? Багор какой-то.
Разные события и с ними идут свои параметры (или их может не быть вообще) поэтому сигнатура не всегда одинаковая.
Короче, пока решил сделать так: класс Event, в нём массив\вектор из строк, затем они будут преобразовываться в нужный тип (вроде int, float и тп).
>>61507
А хер их знает. Думал может быть как-то можно хранить и передавать тюплы.
Что за бред? Сделай объект, который будет состоять из маркера и каллбека и оперируй им.
> Сделай объект, который будет состоять из маркера и каллбека и оперируй им.
Разверни свою мысль
Qt всем нужно
Мне нужно это сделать с классами, а не как в Си.
Драйвер свой напиши. Примеры драйверов мыши и клавы есть были в ресурс ките. Драйверы работают с другим API, займёт время разобраться. Х.з. какие у тебя задачи. Я вкорячивал в свой драйвер скрипт-энджин, которому подсавывал свои скриптики в рантайме.
А драйвер этот, он же должен быть вшит в микроконтроллер? Т.е. мне надо еще покупать саму деталь, паять схемы какие-то? Свою клавиатуру я вряд ли рискну портить своими "драйверами". Мог сейчас хуйню написать, просто я вообще не имел с этим дела и имею 0 представления об этом всем. Но с классическим программированием я знаком и с/с++ владею.
И еще, что за ресурс кит? Ничего не могу нагуглить, кроме каких-то утилит, которые входили в какой-то пакет мелкософта в 2003 году.
Что за игра? Возможно сработает метод с очисткой флага эмуляции. Для этого потребуется зарегистрировать свой глобальный хук. В ином случае придется писать драйвер, а это задача не для ньюфага. Еще можно взять готовый драйвер, который предоставляет подобный функционал, такие тоже существуют.
Vjoy не работает? У меня он во всех играх работал без подводных.
Можешь взять и перелопатить драйвер для планшетов ещё: https://github.com/hawku/TabletDriver - наверное там есть все нужные тебе куски кода.
Хуйню изобрел. Джаваскрипт какой-то. Если у тебя несколько событий, о которых нужно уведомлять наблюдателей, сделай несколько сигнатур колбэков - по одной на каждый тип событий.
тебе в /re/
Аллоды онлайн. С хуками дела тоже не имел. Это что-то на уровне демонов? Насчет драйверов я вообще сомневаюсь, я не знаю как это все устроено и работает, соответственно и нагуглить вряд ли смогу. Я вчера пробовал искать туториалы по написанию драйверов и даже понять не смог, то ли я вообще нашел.
>>62258
Не пробовал, но пробовал около десятка других, ни один не работал. Только AutoHotKey кое как брыкался. Пару раз кнопка сработает и все. Пробовал обманывать, менять частоту случайным образом между нажатием - не помогло. Заметил только, если самому нажимать любую клавишу вручную, то тот скрипт снова пару раз отрабатывал и глушился. Явно защита какая-то в самой игре. Сейчас попробую с vjoy.
Что это за vjoy вообще? Это какой-то эмулятор клавиатуры для геймпадов/джойтиков типа xpadder? Мне-то автокликер нужен был.
Эмулятор джостика-мышки-клавы. Грубо говоря, если ты собрал на условной ардуине свой кастомный джостик для вертолёта и не хочешь писать к нему сложный драйвер с вниканием в winapi, то ты можешь за несколько строчек написать всё что тебе нужно через vjoy, и игра сможет понимать твой джостик.
Никто не мешает тебе использовать его без джостика для автокликера и вряд ли много какая игра специально блочит vjoy.
>Явно защита какая-то в самой игре.
Я бы смотрел одинаковая ли задержка между нажатиями, и чтобы между событием нажатия и отпускания было адекватное время, если бы делал защиту.
Вот мой простой скрипт для нажатия клавиши z для autohotkey.
Loop
{
Random, sleepHold, 153, 257
Random, sleepWait, 1153, 5059
Send, {z down}
Sleep, sleepHold
Send, {z up}
Sleep, sleepWait
}
Значения, вроде, адекватные, но работать стабильно не хотят. А насчет vjoy, я мало что понимаю. Открыл конфигуратор, ничего полезного не нашел для себя. Потом еще погуглил, я правильно понимаю, что мне нужно написать некий "feeder", который надо будет каким-то образом скомпилировать и запустить средствами vjoy? Насчет документации, нашел только какой-то мануал в sdk, который не уверен, что вообще нужен мне. Речь, ведь, шла о просто vjoy, как о самостоятельной утилите, а сейчас выясняется, что, похоже, еще и какие-то пакеты/библиотеки надо докачивать. Я не жалуюсь, просто я не понимаю: в том ли я вообще направлении двигаюсь.
пчел, в некоторых играх скрипты запрещены, так что ты либо пишешь свой драйвер, либо идешь нахуй из треда
мимокрок
>мимокрок
>идешь нахуй из треда
это еще че такое
если ты не заметил, то рандомные вейты там это как раз способ обойти некоторые "запреты на скрепты", работающие на детектировании одинаковых задержек, так что ты либо вникаешь в цепочку постов, либо идешь нахуй из треда
мимокрок
Так я и не против. Вы мне импульс хотя бы дайте какой-то. Я никогда не писал драйверов и слету вот так понять не получается. Я даже не понимаю то ли я гуглю... Вот, мне про vjoy написали, это не скрипт, насколько я понял. Но на мои вопросы, касаемо него, пока еще не ответили.
>>62388
У меня она геймерская, но макросы не поддерживает. Хотя... Мб где-то в закромах древнюю х7 можно поискать...
обезьяна, ты не понял. он либо обдрачивается сями и пишет свой драйвер по хардкору, если уж он хочет нечестно играть против обычных игроков, либо идет нахуй со своими шизофреническими проблемами с автохоткеем, потому что это оффтоп и щитпостинг.
>>62391
>Я никогда не писал драйверов и слету вот так понять не получается
в программерс тредах такой обсурд писать да ты совсем охуел
>если уж он хочет нечестно играть против обычных игроков
Ой, блядь, началось... Я никак не связан с игроками и на их процесс игры вообще никак не влияю этими действиями. Ты какой-то обиженный, я смотрю. Не хочу с тобой общаться.
>Нужен автокликер для одной игры
>>62399
>Я никак не связан с игроками
панимаешь, чмоха, просто так в игры не добавляют защиту от скриптов, ее вообще почти никогда не добавляют, значит скорее всего ты играешь в какую то онлайн дрочильню, где макросы создают такое преимущество, с которым разрабам приходится бороться. следовательно я делаю вывод, что ты пиздабол ебаный и идешь нахуй, даже не сказал какая игра, такая ты гнилая паскуда
>>62410
Ну и мерзкий же ты, а еще ты слепой.
>перезаписать драйвер микроконтроллера клавиатуры
ты либо пишешь драйвер для своего кумпуктера и пользуешься им и не трогаешь устройство, либо делаешь эмулятор на хуярдуине и не трограешь драйвер. у тебя два выбора потому что свою клавиатуру за сотку ты перепрошить в этой вселенной точно не сможешь.
Посмотреть Антона Полухина или другие лекции по словам "контрибученье в буст". Но наверняка ты это уже делал, раз "готов".
Открываешь гитхаб, выбираешь проект, чё-то пишешь, делаешь пулл-реквест и засовываешь его себе в задницу
Я конечно не эксперт по драйверам, но..
на фоне этого треда ещё какой - написал аж целый один, хоть это и был курсач на втором курсе
Короче, есть стэк драйверов. В винде они ещё делятся на фильтрующие, генерирующие, и какие-то там ещё, похуй. Между ними определены интерфейсы, нижние драйвера принимают хуйню, что-то с ней делают (в основном преобразуют для соответствия интерфейсу), и передают верхним.
По идее, тебе нужно написать драйвер и подсунуть его куда-то в стек клавиатуры (желательно в конец, но опять же похуй). Он будет просто пропускать сообщения, но иногда по внешнему сигналу будет создавать свои.
Выглядит не так уж сложно, может даже получится отмахаться одним UMDF. А общение себя с драйвером для начала лучше организовать через файл, иначе заебёшься. И лучше заниматься всем этим в виртуальной машине, потому что на синие экраны ещё насмотришься.
Почитать про всё можно например здесь
https://docs.microsoft.com/en-us/windows-hardware/drivers/gettingstarted/device-nodes-and-device-stacks
https://github.com/microsoft/Windows-driver-samples
В любом случае, это развлечение как минимум на неделю, так что лучше поищи человеческое решение.
Какой еще жиденький метод инпута? Все эти программы как раз и используют винапи. Только что в макс пейне проверил, там все работает, ибо защиты там никакой нет. А в том дерьме от мейлсру оно есть, внезапно. Не будет винапи работать, я в этом уверен.
>>62527
>>62510
Я знаю. Я и сам особо не хочу сейчас ебаться с этими драйверами, ибо мне нужно побыстрее получить результат. Потом уже, для себя, можно было бы попробовать, в принципе, давно уже хотел попробовать, но руки не доходят. Про vjoy мне выше писали. Попробую пока его покурить. Хз что выйдет из этого. Если ничего не выйдет за несколько дней, то пойду спаяю какой-нибудь простенький генератор импульсов, который будет дрочить реле, лол. Надо было его, наверное, сразу собрать.
Такой еще жиденький метод инпута, открой доки ахк и посмотри. Не те апи он использует, вместо эмуляции нажатия кнопки, посылает сообщение игре, которое игра не обрабатывает. SendInput будет работать, ставлю жопу. Если нет, то как я уже писал выше, игра скорее всего регистрирует свой глобальный обработчик, который обходится регистрацией своего обработчика поверх этого.
в обратную сторону ксеришь.
(x+a1) xor (x+a2) xor (x+a3) ... xor (x+an)= b
x = (((((b xor (x+an)) ...) xor (x+a3)) xor (x+a2)) xor (x+a1)) - a1
Спасибо
В смысле как? Дебагер в руки и искать, думать, тесты писать на простые и сложные случаи. Профайлеры, асаны, детектеры утечек, тысячи их.
>алгоритм как по мне оптимальный
Ну а как оно по оценке О(...) по времени и по памяти, можешь примерно почувствовать? Или хотя бы подрочи тесты разного размера, чтобы узнать с какого начинает таймаутить.
берёш дебаггер
@
ставиш брейкпоитны в интересных местах
@
запускаеш
@
смотриш значения переменных
Судя по вопросу, это какое-то олимпиадное дрочево. Странно что вас там не учат отладчиком пользоваться. Полезно еще ассертов насовать везде.
> Судя по вопросу, это какое-то олимпиадное дрочево.
В точку
> Странно что вас там не учат отладчиком пользоваться. Полезно еще ассертов насовать везде.
У меня с компом последнее время проблемы и кучу времени приходиться тратить просто на компиляцию и приходится испольщовать онлайн компилятор. Видимо придется. Спасибо.
Если не хочешь ебаться с 20-гиговой M$V$, накати по-быстрому code::blocks. Лучшее в чем можно строчить однофайловые задачки.
Дебаггер там тоже хорош хотя уже 10 лет не могут сделать нормальное отображение stl
> Дебаггер там тоже хорош хотя уже 10 лет не могут сделать нормальное отображение stl
Проиграл
Я тоже. При помощи нечеловеческой ебли с питоном и подстановкой левого компилятора мне однажды удалось это починить. Но затем там ещё что-то поломалось.
Хуле делать - добавляем в watches v.data() как массив.
Про 10 лет, кстати, не шутка. Проигрывал еще с бугуртов на ихнем форуме
>Sigh ... do you need any more explanation why M$'s comm. ed. is so popular?
>Do you want my opinion about a development chain where nothing fits together, and debugging vector[1] is impossible?...
но вообще в своё время я пилил олимпиады на чистом С, как деды воевали, и на эти крестопроблемы мне было поебать.
Меня тоже не учили им пользоваться, но я сам придумал везде вставлять printf, а потом и cout. Оказывается, смекалочка уже и тогда работала. Надо было вместо вузика сразу ентерпрайз свой запускать...
И нахуя ты посоветовал ему какое-то дерьмо динозавров? Почему сразу devcpp какой-нибудь не посоветовал? Или вполне себе годный vscode?
Борланд С++ надо было советовать
Пиши руками сериализацию какую-то. Ничто тебе не поможет.
Вообще нихуя не понял. Шизло какое-то. Нахуя тебе их сохранять, блядь? Запускай бинарник заново.
Подожди, я тебе щас своей дискетой на лоб твой нажму, только вытащу
Делай мапку указатель-объект, при сохранении так и записывай указатель, при чтении достаешь реальный объект из мапки и обновляешь значение указателя
тебе нужно сделать сериализацию
как минимум нужно сначала будет выбрать формат хранения - бинарный, текстовый, в базе данных, десятки вариантов
потом надо еще учесть ты будешь писать свой велосипед или использовать готовые библиотеки.. выбор всего этого зависит от того что за софт ты пишешь..
в бусте есть библиотека для этого, она так и называетсы boost serialization, но за ее удобство ничего сказать не могу
Показал бы код, чтобы понять какого рода ошибки там могут быть и в какую сторону думать - вдруг ты там вовсе расстояния вместо квадратов расстояния сравниваешь, а при проходе по двумерному циклу используешь / и %, вместо двойного цикла. Без кода никто кроме тебя не скажет в чём проблема и что фиксить.
Не работает sendinput, только что проверил. Код https://pastebin.com/rCcWQqgh
>который обходится регистрацией своего обработчика поверх этого.
Можно поподробней? Что значит регистрирует обработчик? И что значит обойти обработчик? Если это как-то связано с дизассемблированием, то я не думаю, что справлюсь. Я могу только ипконфиг прописать для взлома... Похоже, на реле собирать ключ для замыкания кнопки куда проще...
а не, порядок важен..
Какой там античит? Твое не работает очень информативно. Отладь программу и посмотри почему не работает, для начала получи статус возврата и загугли его значение.
https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setwindowshookexw WH_KEYBOARD_LL, WH_MOUSE_LL, очистить поле flags в соответствующих структурах.
QtCreator или CLion если студент
Попробуй тогда вынести b в начало. Сделай там reserve(n), а в цикле resize(). Чтоб не дрочил память туда-сюда.
Хорошо. Это действительно даст ощутимый прирост? Я конечно сделаю так, поскольку выбора нет, но спрашиваю ради интереса
И почему resize тем более несколько. У меня же размер b меняется быстрее выделения. Мне казалось ресайз просто создает еще один вектор на n элементов и переносит n элементов из массива с k элементами, а потом удаляет массив с k элементами
Блядь, не работает. Ты понимаешь это слово? В этой игре, блядь, не работает! Везде работает, в играх/блокнотах/хуетах, но в этой игре НЕ РАБОТАЕТ. А знаешь почему? Потому что там ебучая защита, сука, и винапишное говно там детектится! Я тебе еще сразу об этом сказал.
>>62868
Да, так и хотел, wVk установлен на z.
И что это за ссылка? Это и есть "регистрация обработчика"? На первый взгляд показалось, что это просто способ для общения с определенным окном без фокуса на нем.
Я ебу что там в игре у тебя? Выясни для начала какая там защита, а потом уже думай, как ее обходить. Нет, блядь, буду пальцем в небо тыкать.
>>62955
> Installs an application-defined hook procedure into a hook chain. You would install a hook procedure to monitor the system for certain types of events
Ты вообще читал или это тролинг тупостью?
Я ведь тебе сразу сказал, что нужно делать >>62257 , а ты тут срешь уже второй день и копротивляешься.
Я читал, но нахуя отвечать не в свою цепочку постов? Я еще вчера тебе написал, ты ничего не сказал/не ответил. Потом ты пишешь от лица анона, который советовал регистрировать какие-то обработчики. Вопрос с дровами уже закрыт, я не стану их писать и тратить на них сейчас свое время. Я вообще пока ничем особо не занимался эти дни. Нет возможности пока сесть и дрочить доки да и вряд ли будет. Уже реально скорее соберу на ne555 какой-нибудь таймер и подпаяюсь к кнопке. Я не ебу какой в игре античит, я вообще сомневаюсь, что можно где-то найти эту инфу на это говно в которое играет 500 человек. А даже если и можно, то что это даст? Один хуй исходников нет и что там происходит на самом деле в коде не известно.
Насчет хуков эти хз, не особо пока понятно зачем это и как работает/что дает. Немного позже почитаю про них, попробую. Вон, вчера один тоже доказывал, что sendinput будет работать, с чем я был не согласен. И что в итоге? Тоже самое и хуков касается, если я вообще смогу разобраться и что-то внятное с ними написать.
Это я тебе и писал, просто ты тупой как пробка. Если не хочешь ни в чем разбираться, то берешь вот этот готовый драйвер и внимательно читаешь его документацию. https://github.com/oblitum/Interception
constexpr char null_char = '\0';
есть token.h и token.cpp, в которых используется null_char. Если я пишу в token.h
extern char null_char;
main.cpp(8,16): error C2373: 'null_char': redefinition; different type modifiers
если ничего не пишу в token.h
token.h(22,16): error C2065: 'null_char': undeclared identifier
token.h(22,16): error C2065: 'null_char': undeclared identifier
token.cpp(11,12): error C2065: 'null_char': undeclared identifier
Как сделать, чтобы одно и то же constexpr использовать в разных файлах?
MS Visual Studio 2019 Community
Во-первых, extern const.
Во-вторых, проверь вот это, хотя для новых проектов должно быть включено по умолчанию.
https://docs.microsoft.com/en-us/cpp/build/reference/zc-externconstexpr?view=vs-2017
В третьих, inline constexpr прямо в заголовке, компилятор сам позаботится, чтобы ты odr не нарушил
>Во-первых, extern const.
Не пашет. Вернее, работает, но как константа. Т.е. внутри switch нельзя запихнуть в case:
>Add /Zc:externConstexpr or /Zc:externConstexpr- to the Additional options: pane.
Не помогло.
>В третьих, inline constexpr прямо в заголовке, компилятор сам позаботится, чтобы ты odr не нарушил
Не понял. Что куда? Что писать в main.cpp, что писать в token.cpp, что писать в token.h? Могу сделать main.h, если надо, и его включать всюду.
> Не понял. Что куда
В хедер, в cpp'шник ничего писать не надо, только использовать. Только не забудь С++17 включить.
Давай на простом примере. main.cpp:
#include "token.h"
int main() { char ch; std::cin.get(ch); switch(ch) { case '0': std::cout << "zero\n"; break; case null_char: std::cout << "no\n"; break; default: std::cout << "yes\n"; } return 0; }
token.h:
#include <iostream>
token.cpp:
#include "token.h"
void f() { char ch; std::cin.get(ch); switch(ch) { case '0': std::cout << "ZERO\n"; break; case null_char: std::cout << "NO\n"; break; default: std::cout << "YES\n"; } }
куда писать constexpr char null_char = '\0';
или inline constexpr char null_char = '\0';
что ещё куда писать
Ты чего ругаешься? Кроме емакса с вимом разных вкусов толком то и нет ничего. Электронопомойки же фуфуфу
Тогда надо менять работу на ту, где не надо собирать на всратом тостере.
Ладно. Как это сделать? Компилятор ругается, если я пытаюсь присвоить значение какой-то области памяти, на который указывает указатель, если в этой ячейке памяти не объявлена переменная. Как ещё можно сделать лист без библиотеки list, если не так?
Берешь и без задней мысли делаешь:
template<typename T>
struct ListElement
{
T data;
ListElement element;
};
template<typename T>
class List
{
private:
ListElement<T> head;
};
>Какой блять вим
Соснольный или гуёвый.
>какой емакс
Соснольный, обычный ванильный саморучно напердоленный, spacemacs, doom emacs.
Выбирай.
С такой записью можно создать список из неопределённого заранее количества элементов? Как это работает? Уже встречал такой такое без шаблонов, но самого разбора работы такого кода так и не увидел.
И да, у тебя звёздочки вакаба сожрала.
Погугли же епт. Туториалы, тысячи их
тут вот на смартпойнтерах к примеру https://solarianprogrammer.com/2019/02/22/cpp-17-implementing-singly-linked-list-smart-pointers/
тут попроще https://towardsdatascience.com/linked-list-implementation-guide-16ed67be18e4 но с малоками ебучими. хоть new бы
Хранишь указатели на предыдущий и следующий, или только следующий элемент. При вставке алоцируешь память и прицепляешь куда надо (в хвост, в голову).
Кстати std::forward_list так и сделан https://github.com/microsoft/STL/blob/master/stl/inc/forward_list
Есть
constexpr char null_char = '\0’;
Его надо использовать в разных файлах: main.cpp, token.h, token.cpp. Причём его надо использовать именно как известное на этапе компиляции выражение, чтобы его можно было использовать как case в switch, причём во всех файлах.
Как это сделать?
Мне сложно придумать ситуацию, когда придется собирать на всратом тостере, кроме разве что совсем экстремальных ситуаций, когда рабочий комп сгорел нахуй, а времени позаимствовать у кого-нибудь лишний ствол ноутбук нет, нужно собрать здесь и сейчас. Правда встает вопрос, откуда у вас тогда взялся всратый тостер.
Олсо, вимом и имаксом удобно пользоваться, когда нужно отредачить пару-тройку строк где-то на удаленной машине, но если строк много, то проще перекинуть файл на рабочий комп, отредачить и перекинуть обратно.
Разобрался. Я включал хэдер, в котором constexpr, в другой хэдер.
Переформулирую вопрос более глобально: хэдеры в хэдеры включать плохая практика? Я совсем начинающий.
На работе легаси-говно, там хэдеры включаются и в сорсы, и внутрь других хэдеров.
Потому что вылезла вот эта проблема с constexpr, что их инклюдить можно только в .cpp . Иначе не компилируется.
> На работе легаси-говно, там хэдеры включаются и в сорсы, и внутрь других хэдеров.
Блядь, а как ты хотел? Пиздец, мой ор наверное весь офис через океан услышал
Наверняка в бусте/Qt есть.
Блядь, я удивляюсь терпению анона, который тебе все эти ссылки дал.
Неужели так сложно написать в ебучий гугл "реализация односвязного списка c++" и нужно ебать мозги другим анонам своей тупостью?
Как раз повод выучить.
> Например в питоне легко переводить число в строку и обратно.
Ты думаешь это так просто? Если не нужно учитывать локаль - тогда да, просто. std::to_chars, std::from_chars.
> Есть срезы строк
Посмотри, что там c++20 предлагает
Python
Спасибо
Это немного не то. Для него 1, 2, 3 и 2, 3, 1 разные последовательности. Но это одно и то же сочетание. Мне нужно именно сочетания. K из n вот это вот все. Например сочетания из 4 по 2 это
1, 2
1,3
1,4
2, 3
2,4
3,4
. А next permutation вернет и 1, 2 и 2,1 как разные последовательности
Тебе быстро ннада?
Если нет - то применяй next_permutation к вектору и копируй его содержимое в мапу с ключом-сетом.
То есть у тебя сначала вставится сет (1, 2), потом ты скопируешь вектор (2, 1) в сет, там он отсортируется и станет сетом (1, 2) и при вставке в мапу дубля не будет.
Говно, но быстро и на коленке.
Бтв, господа, вы щупали уже модули от майкрософта?
Я смог скомпилить со стандартными, но свои даже по туториалу не робють. И интеллисенс умирает после первого же #import.
Или пока нет смысла это трогать?
to charts и from chars выглядят очень удобно, жаль половина компиляторов не поддерживает это. Вот чем меня раздражает c++, то это раздутость. Куча функций и хз что использовать. Берешь одну, потом оказывается что она параметр string не принимает и приходится переводить в c_string(). Пиздец какой то
Спасибо
Хотя сет сетов лучше будет.
Единственный момент - я не помню, может ли быть map<set<int>, smt_other> или set<set<int>>, там же отношение порядка требуется, вроде как.
Спасибо большое
Ради таких мометнов и стоит читать тред..
Хоспади, блять, помоги. Ору так, что мать скорую вызвала. А на strlen(b.c_str()), да еще в цикле, вообще чуть от ифаркта не откинуся.
Штош ты делаешь, содомит. скорей бы тебя отчислили
Это же ещё сишный прикол.
Чтобы из символа цифры получить инт - нужно код нуля вычесть из нее и привести к инту.
Можно статик каст опустить, будет неявное приведение все равно.
А вообще atoi просто принимает не символ, а строку, поэтому у тебя ошибка. Да и лучше тогда std::stoi использовать, он прям с std::string работает и с разными базами, хоть из троичной переводи в инт.
Разве что она бросает исключение и во второй аргумент записывает позицию, в которой случился косяк.
Бля, а я даже не заметил, это же охуенно.
Напиши хоть, что сделать-то просят в задании на лабу.
По скрину непонятно нихуя, кроме любви к постоянным вызовам to_string от одного значения.
цикл по i не в том направлении
sum +=(int)(*(b.c_str()+j) - '0');
Благодаря быстрому интернету я не имею возможности поставить VS 2017 или 2019 для компилирования swift shader. Раздобыл четвёртую версию, она работает, но вот беда, мамин прогер почему-то поставил потолок для ядер всего шестнадцать, хотя для приличия надо 65536 минимум.
Есть тут сверхчеловек, который его поменяет, скомпилирует и кинет готовые дллки сюда?
Ссылка на исходник
https://github.com/google/swiftshader
На картинке то, что нужно изменить, возможно, где-то ещё, но я не нашёл, для начал этого достаточно будет.
Блядь, там ещё в сравнении забыл 16 на 65536 поменять. Вобщем на картинке то, что должно быть после замены
Возможно, я cmake на вынь 10 попробвовал поставить и тут меня ждало поражение, ведь даже ему нужны какие-то куски от 2017 и 2019 ВС.
Блин, точно. Странно было бы не реализовать такую базовую вещь. Пойду почитаю побольше.
> Бтв, господа, вы щупали уже модули от майкрософта?
Вообще, там странно всё. Cppreference говорит, что в msvc нет модулей, хотя они там очевидно есть.
В тред призывается нвидия-кун
Официально нет, это экспериментальная фича, как asan.
Но на msdn тутор есть, хотя у меня не удалось. Но это и я могу быть дебил, а не у них что-то не так.
Да вроде по тутору они роблять вполне, с /experimental:modules. Мило выглядит. А чо у тебя не так?
Вот я это сделал все, если импортил std.core - то тоже мило выглядело и компилилось, но сразу ломался интеллисенс.
А свои модули делать вообще не получалось, хотя все по тутору организовал и с расширением .ixx(вроде такое, не помню точно).
моча, ты совсем охуел? Где я спамлю или вайплю?
Может быть просто "nd = new Node"? Ты не можешь два раза написать "Node *nd".
>в nd записывается НОВЫЙ адрес?
Да.
>может ли он случайно повториться?
Только если предварительно освободишь старый.
>Может быть просто "nd = new Node"? Ты не можешь два раза написать "Node *nd".
Эта строка в классе, класс циклически вызывается в маин.
Жаль, подсветка кода и подсказки - хорошая и удобная вещь.
Модули официально не поддерживаются. Все остальное нерелевантно
всмысле так?
for (...)
{
MyClass();
...
}
или так
for (...)
{
MyClass с;
...
}
Тогда если ты не делаешь delete nd в деструкторе а я на 80% уверен что не делаешь, то у тебя течет память.
По ляжкам у тебя течет
Unsigned Int x = (unsigned int) & (arr[50]);
Кто нибудь может подсказать что происходит во второй строке кода?
Тебе зачем это знать?
Проверить не быстрее, чем спрашивать?
Интерпретируешь указатель на 50 ячейку, как на unsigned (50-53 ячейки) (почему они у тебя с большой буквы?).
вообще-то ничего там не интерпретируют, а просто небезопасно усекают адрес в формате ptr64 в uint
Там же две звёздочки затёрлись из-за того что борда уже пять лет не может позаимствовать обособление через `` из дискорда.
Если на коленке, то отсортируй и найди set_difference
Да не важно где придумали, как будто это как-то меняет что-то.
KOGDA уже двач переедет на пхпбб???
Речь о qt если что. Вообще, при нажатии на кнопку, мне нужно чтобы она вызывала сигнал передавая в него свои координаты.
Устроили блять джаваскрипт.
Тогда уж сразу вектор из void* делай, чтобы наверняка выстрелить себе в ногу.
Без задней мысли подключаешься, qt сам всё сделает. Сигналы посылай как обычно
emit somethingChanged(newPt);
В смысле блять? Вот есть класс mainwindow, он у меня содержит вектор векторов содержащих указатели на кнопки. При нажатии другой кнопки этот веутор векторов заполняется динамически созданными кнопками. И где мне взять сигналы и слоты этих кнопок?
# define public public:
# define private private:
class MyAwesomeClass {
public int a;
public int b;
private int x;
private int y;
};
Сишарп тред два блока вниз
Короче, время появилось, решил попробовать с хуками ебаться. Первое с чем столкнулся. SetWindowsHookExW возвращает 0, погуглил и понял, что надо получить дескриптор к пути dll, где эта функция описана, как-то так
>HINSTANCE dDLL = LoadLibrary(TEXT("c:\\path\\something.dll"));
Но в msdn сказано, что LowLevelKeyboardProc находится в windows.h
Вот текущий код регистрации хука
>HHOOK dProc = SetWindowsHookExW(WH_KEYBOARD_LL, LowLevelKeyboardProc, NULL(тут dDLL нужен, по идее), processId);
Какую dll загружать тогда?
Убрал конкретный PID, путь к адресу функции указал в текущем модуле, теперь SetWindowsHookExW возвращает отличное от нуля значение. Код https://pastebin.com/npprysU8
Не понимаю. Разве не должна колбек функция вызываться при нажатии кнопки в любом процессе и выводить на экран консоли процесса, который этот хук запустил "!!"?
Пошел нахуй токсик тупорылый.
Спрашиваю у нормальных анонов. Один и тот же хелло-ворлд, но msvc каждый проект компилит по разному. В настройках все одинаковое, вообще ВСЕ одинаковое. Почему так?
Ну скинь тогда файлики своих проектов
>Кто нибудь может подсказать что происходит во второй строке кода?
Нарушение т.н. strict aliasing rules.
Не работает
df.push_back(new QPushButton("f",this));
df[j]->setGeometry(50i,50j,50,50);
df[j]->show();
connect(df[j], &QPushButton::click, [=](){QLabel lbl; lbl.setNum(i*j); lbl.show();});
Пишет QObject::connect: signal not found in QPushButton
> Пишет QObject::connect: signal not found in QPushButton
А ты не очень умный, раз не понял, что click - это не сигнал
Проблема оказалась в этом
> QObject *senderObj = sender();
> lbl = new QLabel("f");
> lbl->setText(senderObj->objectName());
> lbl->show();
Если убрать предпоследнюю строку, все работает и лейбл выводится. Почему не ясно.
Ты parent лейблу установил?
вообще, не еби мозг, создай сразу всё, а в рантайме меняй видимость
Нет, не установил, да и думаю не в этом проблема. Сейчас интереса ради сделал такое
> QObject *senderObj = sender();
> senderObj->setObjectName("ef");
И тоже не работает.
> вообще, не еби мозг, создай сразу всё, а в рантайме меняй видимость
Не особо понимаю как мне это поможет на самом деле, создавать то все равно придется в цикле.
Вот тут ещё более непонятно, тебе ведь размеры поля известны. Закинь на ideone свой код
Было бы что кидать, я ведь только начал делать
https://ideone.com/187xKb
А размер поля может ведь задаваться пользовательский
Лучше создай в своём окошке qgridlayout, ему установи размеры и в него запихивай кнопки, тогда можно избавиться от setGeometry и show
Это в планах. Сейчас все же хотелось бы разобраться с сигналами.
На текущий момент написал глобальный хук, который обрабатывает нажатие клавиши в любой программе, просто информируя об этом в консоль.
Вот код (1 вариант): https://pastebin.com/47cPEVHy
В чем была твоя основная идея? Я пробовал использовать SendInput в этом обработчике, чтобы зациклить нажатие, но игра все равно не воспринимает его. Я мог не правильно понять тебя, поэтому уточняю.
Вот (2 вариант): https://pastebin.com/YGnQYCHx
Или мне надо было переопределить эту функцию LowLevelKeyboardProc из какой-то системной библиотеки, указав третий параметр функции SetWindowsHookEx?
Короче, сейчас переписал без хука (хотя, и с ним тоже работало), используя только цикл с sendinput, но отправляю не виртуальные коды клавиш, а скан-коды. Игра обрабатывает только пару таких sendinput'ов и перестает обрабатывать остальные, пока я сам не нажму любые клавиши на клавиатуре, после чего все повторяется снова. Текущий код: https://pastebin.com/MzzFXeZm
Для начала пронумеруй все глобальные обработчики и посмотри устанавливает ли игра свой. Может они вообще драйвером блокируют инпут, я не знаю. Скажи какой там античит. Я тебе уже сказал про железобетонный способ с использованием готового драйвера. Качаешь, устанавливаешь и шлешь запросы этому драйверу, он их обрабатывает и нажимает кнопки.
Потому что у языка такие правила, блеать. Не нравится - пили обёртку над указателями со своей собственной арифметикой, раз так хочется выстрелить себе в ногу.
Я не знаю какой там античит. Гугл не блещет точной информацией. Могу только предположить, что там какой-то lifeguard. Но и могу предположить, что он был когда-то в игре, а сейчас его нет, ибо их сайт куда-то там переехал и, вроде как, не занимается защитой игр, судя по этой инфе https://liveguard-security.com/allods-online/?_vlg=1 Короче, хз.
>Для начала пронумеруй все глобальные обработчики и посмотри устанавливает ли игра свой.
Т.е.? Как их пронумеровать и определить что там игра регистрирует/не регистрирует?
Насчет драйвера, этот? https://github.com/oblitum/Interception Я бегло проглядел, мне не понравились картинки и я решил начать с хуков. Не хочу мешать все в кучу, ибо и с тем-и тем я дел не имел. Но попробую...
Ну, вроде, поставил драйвер. Как с ним теперь связаться? Документации никакой не нашел, а та что на гитхабе, там просто какое-то лицензионное соглашение. Никаких других "геттинг стартед" не могу найти в гугле.
У меня сначала в программу отсылается имя файла, а затем сам файл, но слот не понимает, как их обрабатывать
Файл передаётся частями, т.е несколько раз срабатывает readyread
Как разграничить загрузку файла и получение имени файла?
Помогите, пожалуйста
А, т.е. мне надо interception.h подключить и используя его функционал, методом тыка написать свое, скомпилировать и запустить?
Вот мой код: https://pastebin.com/2zQtLemp
Вот сам хидер interception.h: https://pastebin.com/NN4Bdefj
Папка с проектом:
>пик
Компиляция с порта mingw:
>g++ main.cpp -LC:\\Users\\Vladislav\\Desktop\\driver\\interception.lib -o d
Результат компиляции:
>C:\Users\VLADIS~1\AppData\Local\Temp\cc8oTiHO.o:main.cpp:(.text+0xe): undefined reference to `interception_create_context'
>C:\Users\VLADIS~1\AppData\Local\Temp\cc8oTiHO.o:main.cpp:(.text+0x1e): undefined reference to `interception_destroy_context'
>collect2.exe: error: ld returned 1 exit status
Засунул .lib и .dll сюда:
>C:\Program Files\mingw-w64\x86_64-8.1.0-win32-seh-rt_v6-rev0\mingw64\lib
Скомпилировал:
>g++ main.cpp -o d -linterception
Вроде, скомпилировалось все, но при попытке запуска d.exe появляется пик. Хз, либо я пишу хуйню (хотя, я и не писал особо ничего да и хз что писать, ибо документации никакой не могу найти), либо драйвер не может интерпретировать этот код. Хотя, когда качал драйвер, в папке samples все примеры работали. Правда, до сих пор мой капс сломан и я не могу его вернуть после запуска caps2esc.exe
Сейчас наткнулся на то, что опытные программисты используют вместо этого if (!!pX). Прочитал, что это тоже самое, что и pX != nullptr. Т.е. вроде как и !pX и !!pX означают одно и то же. Зачем два восклицательных знака?
О, моя любимая ошибка номер "ноль хуй соси пять нулей семь блядей"
https://www.youtube.com/watch?v=4E-hv74reEM
>>66534
Написал что смог понять, возможно, там вообще бред, но я хз как можно вслепую писать, не имея базы знаний в этой области/опыта. Документации найти не смог.
Код с монологом о размышлениях: https://pastebin.com/yjs61ES4
Требуется помощь.
Бля, я слепой. Нашел документацию http://www.oblita.com/interception Но один хер, нахуя так прятать? В readme было сложно добавить ссылку? Завтра уже почитаю.
Что-то проще совсем не стало... Документация крайне нулевая, инфы мало. Вообще не понимаю как зациклить нажатие клавиши... Вот, как я понимаю, в цикле while мы блочим проверку условия строчкой
>device = interception_wait(context)
, пока по заданным фильтрам не придет нужное состояние
>INTERCEPTION_FILTER_KEY_DOWN | INTERCEPTION_FILTER_KEY_UP
Допустим, я нажимаю кнопку, срабатывает KEY_DOWN, функция interception_receive что-то там возвращает > 0, после чего оказываемся в теле цикла, где устанавливаем нужную клавишу и посылаем ее драйверу. Перед отправкой у клавиши всегда состояниеDOWN или UP, что по идее должно триггерить функцию interception_receive автоматически, зацикливая, но этого не происходит. А так же не понятно, что делают остальные фильтры
INTERCEPTION_FILTER_KEY_NONE,
INTERCEPTION_FILTER_KEY_ALL,
INTERCEPTION_FILTER_KEY_E0,
INTERCEPTION_FILTER_KEY_E1,
INTERCEPTION_FILTER_KEY_TERMSRV_SET_LED,
INTERCEPTION_FILTER_KEY_TERMSRV_SHADOW,
INTERCEPTION_FILTER_KEY_TERMSRV_VKPACKET
Но я и с ними пробовал, не работает. Работал с кодом из примера https://pastebin.com/WjjhERiS
Я правильно понимаю, что Application::StartupPath появляется генерируется уже на этапе выполнения и мне в строку подключения к бд соответственно надо задавать в обработчике Form1Load?
Программа находит бд и работает, а конструктор ругается на исключение, когда я пытаюсь исправить строку подключения oledb внутри метода InitializeComponent формы.
В книжке нет полного кода, но как я понял, он задает статический путь в свойствах компонента на форме, а в коде уже в обработчике меняет строку подключения.
Пользователь наследуется от него (класс Fu)
При этом мне неизвестно количество и тип аргументов в конструкторе пользовательского класса Fu. То есть я не могу написать базовый констуктор в MySubsystem на все случаи жизни.
Теперь что я хочу. Я хочу запретить прямой вызов констуктора Fu f(10), потому что оно ведет к ошибкам.
Как сделать?
Чтобы можно было производный от MySubsystem класс вызывать только так Fu::Create(10), независимо от того как описан констуктор в производном классе
Да, можно в классе Fu - Fu(int ni) сделать приватным, но это плохое решение, потому что этот Fu будет писать другой человек, а значит он конечно же забудет об этом нюансе и сделает его публичным
p.s. констуктор Fu(int ni) нельзя сделать приватным - быстрофикс
если написать так:
protected: MySubsystem() = default;
то это ничего не даст, потому что у Fu свой констуктор (Fu(int)).
И нельзя написать protected: MySubsystem(int) = default;
потому что MySubsystem не должен знать какие аргументы будут у пользовательского класса. Там может быть int/string или стопятсот классов - вся фишка тут именно в том что у Fu может быть любые аргументы
Добавь проверку в конструкторе, если один аргумент и он равен 10, то возвращай пустой класс.
мимо диванный
> И нельзя написать protected: MySubsystem(int) = default;
На самом деле ты можешь написать шаблонный конструктор, по аналогии с методом Create.
А вообще, подумай хорошенько, потому что выглядит как очередной велосипед. Что сделать-то хочешь?
>>На самом деле ты можешь написать шаблонный конструктор
нет. потому что повторю - MySubsystem не должен знать о количестве аргументов его наследников. И у каждого наследника своя логика в конструкторе
>>что выглядит как очередной велосипед
Велосипед чего?
>>Что сделать-то хочешь?
Вот больше кода https://ideone.com/dTXvd9
В чем фишка? В коде есть основные системы которые за что-то отвечают - менеджеры(Foo1, Foo2, Foo3). В этом примере эти системы создаются в одном экземпляре - похоже на синглтон (но в реальном проекте Subsystem подключается к Context, и этих контекстов может быть также много, так что ни синглтон, ни тем более глобальные переменные тут не подойдут)
Далее я хочу получать доступ к этим системам через GetSubsystem(). (GetSubsystem<Foo1>())
GetSubsystem() должен выдавать мне объект класса из текущего контекста.
Subsystem - это просто базовый интерфейс который задает базовое поведение системы и ее привязку к контексту. Чтобы не копипасить кучу кода инициализации.
При этом - этот код - библиотечный, то есть я не знаю сколько будет этих классов Foo. Какие у этих классов будут аргументы и т.д.
Код уже работает, но есть архитектурные проблемы:
- пользователь этого кода может не читать документацию и вызвать коструктор вручную (а не через Create()) - это ошибка.
- (хотелось бы что-то сделать чтобы не писать вручную все эти Destroy() - но идей пока нет)
Еще раз повторю - почему не сделать тупо все это в конструкторах - потому что слишком дохрена копипасты, и потом - этот констуктор надо где-то вызвать, то есть надо где-то создать переменную, как-то ее привязать к текущему контексту чтобы память не потекла... короче такое решение хреновое.
ну или так постараюсь объяснить:
- есть контексты (context). в любой момент времени активен только один контекст (но он может передать активность другому)
- к этим контекстам привязаны подсистемы (subsystem)
- подсистемы должны быть правильно инициализованы. Отложенная инициализация по вызову не пойдет - подсистемы должны инициализироваться при старте, а не при первом вызове (потому что там тяжелый код чтобы его во время основной работы вызывать)
- и да, подсистемы могут не проинициализоваться - но это не является ошибкой (и тем более не исключение) - то есть даже при неиницилизированной одной системе всё остальное должно работать (кроме доступа к этой системе)
- в любом месте кода должен быть доступ к нужной подсистеме активного контекста (GetSubsystem())... При этом я должен получить доступ только к самой подсистеме, а не всем системам что есть (это уже будет узел в лапше - не надо такого)
- должна быть возможность добавлять произвольное количество подсистем. Интерфейс подсистемы по всем законам ООП не должен знать ничего о том кем будут его наследники.
GetSubsystem<Foo1>().Bar();
Сложно запретить пользователю создавать объект, если он конструктор объявил public.
Можно попробовать передавать первым параметром в конструктор Subsystem какой-нибудь объект-пустышку, которую пользователь не может создать, но тогда ему нужно будет прописывать в конструктор какой-то левый параметр, иначе сам не сможешь создать.
Проще писать в доках, чтобы руками не создавали или делали конструктор protected
Используй динамический полиморфизм, зачем тебе весь этот шаблонный пердолинг?
Кто тут объяснит, по какой такой причине методы, определённые внутри тела класса автоматически становятся inline?
Моя версия: чтобы не было их потенциальных переопределений в разных транслейт-юнитах. Насколько я прав по 10-ибальной шкале?
Тут есть нюанс: не обязательно эти методы будут встраиваться. Это будет зависеть от настроек компилятора. На этапе линковки уже может либо произойти встраивание, либо просто линкер выкинет все определения этого метода из единиц трансляции, оставив только одно.
Если обобщать то для членов-функций действуют те же правила, что и для свободных функций. Ты можешь в .h файле разместить определение свободной функции, пометив его inline. В зависимости от настроек компилятора будет сделано либо встраивание этой функции, либо на этапе линковки выкинутся все определения за исключением одного единственного.
"срезы" строк -
std::string имеет доступ по индексу и функцию-член substr
но вообще то std::string - контейнер, предполагается работа с ним через итераторы и алгоритмы стандартной библиотеки шаблонов
да
учи английский, только так
До него 2 часа езды из города.
Надо везде писать какое кресты сложное говно и продвигать для обучения в вузах питон. Меньше крестовиков - больше спрос - больше зп.
> Надо везде писать какое кресты сложное говно и продвигать для обучения в вузах питон. Меньше крестовиков - больше спрос - больше зп.
Больше вкатывальщиков в говноязыки - меньше ЗП в говноязыках - больше специалистов с опытом перекатываются в плюсы - меньше ЗП у существующих специалистов
А так хотелось. Спасибо
Я просто в инете почти не нашел инфы по этому поводу. Меня главным образом волнует как получать информацию о модельках и как их отрисовывать
Наверное тебе в ПТУ сказали, что сложение указателя с числом это прибавление к адресу числа*(размер указываемого типа), поэтому ты думаешь что разность между указателями должна быть определена как разность между адресами.
Но в ПТУ тебе напиздели про то, что такое сложение указателя с числом.
Он сработает если в игре есть игра по локальной сети. В моем случае в игре мультмплеера нет ни в каком виде.
Сложно и трудоёмко. Проблема в том, что надо как-то портировать логику сингловой игры на сервак. Обычно юзают один из трех подходов:
1. тупая трансляция, либо вообще p2p - клиенты договариваются между собой, вся логика работает на них самих. Открывает путь читерству, но работы намного меньше.
2. (частично) эмулировать логику клиентов на серваке - трудоемко, надо много реверсить и отлаживать. Будет много багов и несоответствий.
3. Гонять несколько клиентов на серваке/серваках, по одному на одного игрока в матче. Работы меньше, эмулировать ничего не надо, читерить сложней, но мощностей надо дохуя.
Общий принцип такой
1. реверсишь игру, находишь что надо хукать и дёргать, чтоб ей управлять
2. пишешь клиентскую часть, которая берет под полный контроль процесс игры и коммуницирует с сервером
3. пишешь серверную часть, одним из трех подходов выше.
еще p2p это привет рассинхроны. Нирикамендую в общем. В целом и 3 вариант от них не спасет.
Можешь считать, что это невозможно. Настолько, что будет проще ремейк игры написать, мне кажется, если это старая стратегия.
Двачую блядь. Ещё если png битый, boost Gil до 1.72 крашит программу нахуй
Спасибо за ответ. Мне кажется напиание сервера не самая сложная задача. Для меня сейчас выглядит непонятным как, например отрисовать человека. Вот я получил от клиента сообщение о том, что он хочет заспавнить на таком месте такого юнита. Как мне это сделать? Потом же эти юниты должны взаимодействовать с моими. По сути клиент берет на себя задачи, которые обычно делает бот. Похоже на модоелсто. Где взять инфу по этому поводу? Хотелось бы на примере увидеть работу
>Мне кажется напиание сервера не самая сложная задача.
Как раз написание сервера и реверсинг игры это самая трудоёмкая задача. Хукать игру много ума не надо.
>Вот я получил от клиента сообщение о том, что он хочет заспавнить на таком месте такого юнита. Как мне это сделать?
Надо пользоваться логикой самой игры и дёргать её когда тебе надо. Отреверсить игру (читэнжином, отладчиком, дизассемблером и т.п., туториалов миллион, в основном на читерских сайтах, как правило динамический анализ и проход по структурам будет быстрей дизассемблинга), и найти внутри неё стабильный адрес (или сигнатуру) функции спавна юнита. Это делается сложнее чем кажется, ибо надо 100% убедиться что это именно функция спавна юнита, это может быть совсем не очевидно. Затем внедрить код клиента внутрь процесса игры (техник миллион), и вызывать эту функцию когда тебе надо. Это уже дело техники. На самом деле всё зависит от устройства конкретной игры, там может быть не функция спавна, а надо произвести кучу действий, или еще что-то сделать. Также можешь зайти в asm-тред.
В дополнение к написанному
>Хотелось бы на примере увидеть работу
Посмотри код MTA:SA, например.
по началу хотел сделать, чтобы мины генерировались так, чтобы не было возможности зайти в тупик, но это слишком сложно
Когда я пишу
cout << "huj";
, компилятор автоматически создаёт массив, в котором последовательно содержатся коды символов h, u и j? Или нет?
Когда я пишут cout << this << "huj";
, компилятор выводит адрес самого первого символа строки?
Адрес чего выводится, когда я пишу
cout << this;
?
а что тебе ответить, когда ты вообще полную абсолютную хуйню несешь? Тебе надо не вопросы задавать, а книги читать.
Сам и читай, а потом расскажешь, как там случай на картинке объясняется, у тебя же дохуя свободного времени. А я чисто поинтересоваться зашёл, а не книги твои дурацкие читать.
Фигня в кавычках - строковый литерал. Это область памяти только для чтения, считай, что это тип const char*.
>cout << this << "huj";
Оно выведет адрес объекта, в методе которого написано такое (в виде 0x1234) и после него допишет huj.
>cout << this;
>адрес объекта, в методе которого написано такое
Совет про книгу хороший. Проблема не в том, что ты не понимаешь конкретно этого, а в отсутствии общего понимания что тут происходит - по крайне мере так оно выглядит судя по вопросу. С сотворением общей картины поможет только книга, а ответы на вырванные из контекста вопросы тут лишь навредят.
Ты не понял, мне вообще эти твои книжки не нужны. Когда каникулы закончатся и пройдёт сессия, я просто спрошу у препода, который мне всё это разжуёт и в рот положит. Если, конечно, мне тут то же самое не сделают раньше того времени. Вопрос этот для меня не столь критичный, так что отвечать или нет — твоя воля.
>Анон, у меня к тебе сейчас три очень серьёзных вопроса:
>Вопрос этот для меня не столь критичный
Мне это просто внезапно стало интересно, но незнание всего этого мне прямо сейчас никак не помешает. Хотя хотелось бы, чтобы анон просто по-человечески по каждому пункту ответил хотя бы парой слов по теме, а не ссылался на какие-то там книги. Это же тред для обсуждения языка, а не тред ссылания на литературу по каждому вопросу. Ну неужели там так долго надо объяснять?
Да, блядь, это фундаментальные особенности языка.
Если ты не хочешь это понимать и читать книгу - то съёбывай из своей шараги в поварское училище и пеки кексы.
Хотя там тоже желательно книги с рецептами читать.
У меня душа лежит к выпеканию аж пиздец, только после нового года дважды выпекал охуенные овсяные печеньки, которые похвалила вся моя родня и какой-то знакомый моей мамки. Но в наше городское поварское училище был конкурс из дохуя двоечников на одно место, так что чтобы дома как сыч не сидеть и не сойти с ума от одиночества, пришлось поступить в универ учиться печь говнокод. Ты прям пиздец угадал мои основные интересы.
Зато смотри какой я умненький пекарь оказался, всего за один вечер вникнув в суть только лишь односвязных списков, забил на чтение кода двусвязного списка тут
https://pro-prof.com/forums/topic/реализация-связных-списков-на-с
и запилил свой собственный двусвязный список. И это работает!
https://ideone.com/xGYgo4
Оценишь? Мне не помешает мнение более опытного проградриста.
И да, конечно же я попросил сравнить мой код с кодом с сайта, чтобы увидеть здесь в мой адрес что-то вроде "малаца, хорошо сделал" и потешить своё ЧСВ.
Теперь поменяй int на какой-нибудь char[8192], сделай функцию, которая внутри себя создаёт список из миллиона-двух элементов и вызови ее несколько раз.
А потом расскажешь, что нагуглил, чтобы исправить.
Ебать как я люблю названия переменных.
Не, я не настолько ебанутый. Не.
Да ладно нормальные названия. Даже с префиксами по кодстайлу, кек.
Нормальная лаба, я бы сказал. Ни к чему не приебаться, кроме того что память течет.
нахуй ты в ideone джаву выбрал-то? Main.java:1: error: illegal character: '#' #include <iostream>
Сигнатура одна - передавать базовый Event. Потом двойным диспачингом находишь правильный обработчик своего эвента.
Да, я нашел один, правда так и не пробовал. Ещё есть либа DevIL, вроде неплохая. Но я в итоге сделал через виндовское апи
https://docs.microsoft.com/en-us/windows/win32/wic/png-format-overview
Самое простое: в тот момент, когда тебе нужно что-то сделать хитрое, подумай: "а нет ли этого в STL?" и иди курить cppreference.com или cplusplus.com.
Скорее всего ты найдешь там ответ на свой вопрос.
А так - можешь cookbook от Яна Галовица прочесть. Там не всё разобрано, конечно же, но примеры полезные есть.
Например, что мне доставило, перенаправление cout в файл в нужной области видимости.
хуяси. Я думал win32 изкоробки только bmp умеет.
Почитай за деструкторы, там найдешь объяснение, почему может течь память и как это исправить.
Хочу сделать массив с состояниями кнопок.
Пишу что то типа
buttonsState->append(&button->checked)
а он мне говорит, что у button нет свойства checked.
Ты хочешь хранить у себя указатели/ссылки на свойство, чтобы потом его можно было читать/менять?
Они же для того и придумывались, чтобы ты этого сделать не мог.
Если уж так хочется, храни коллбеки на метод isChecked...
Можно конечно, но не так, как ты это хочешь делать.
Есть методы is и set, вот их и дёргай, иначе всё сломается к хуям
Спасибо за инфу. Я нашел способ получше. Оказывается в Qt есть специальный класс QButtonsGroup, сунул кнопки туда, все работает.
Что по-твоему сложного в вызове компилятора для каждого из файлов?
> как-то так у них получается не нарушать поля видимости.
За этим должен следить ты, а не компилятор
Это всего навсего ваше личное мнение.
https://ideone.com/FoO2OY
Проверишь? Это линейный двусвязный список.
Девочки, читаем шапочку <3<3<3<3
Таки при завершении времени жизни самого списка его узлы не удаляются. Надо в деструктор запилить цикл для очистки.
~spisok()
{
while (u_golova)
{
uzel* u = u_golova;
u_golova = u_golova->u_sled;
delete u;
}
}
Потому что это тред про C++ и вопросы/ответы по нему, а ты тут только про хуи пишешь.
Я читал где-то, что если деструктор пустой, то компилятор сам разберётся, что там удалять/освобождать. Это не так?
Complex operator + (Complex const &obj);
и
Complex operator + (const Complex &obj);?
Если есть, то какая
спасибо
Т.е. деструктор это просто функция по сути, реализовывать тебе ее самому чтобы очистить память, если сам выделял, так?
Да, это функция, которая будет вызываться при выходе из области видимости(можно и руками, но я не знаю, когда это в самом деле может потребоваться).
То есть для
class C
{
C() = default;
~C()
{
std::cout << "\ndtor";
}
};
int main()
{
{
C c;
//Тут будет вызван деструктор
}
std::cout << "\nend";
return 0;
}
Вывод будет
dtor
end
Хотя деструктор ты руками не звал.
И да, если ты для переменной внутри класса выделил память через new - то ее нужно освободить через delete.
Все, я понял, спасибо. Так-то я читал о деструкторах, но не помню, чтобы именно эту особенность упоминали, а она ведь ключевая.
На cppquiz много вопросов, каким-либо образом связанных с деструкторами.
Да и вообще полезная штука, мне помогло в какой-то момент.
Мне тоже нравится этот сайт, но мои знания пока хромают, если говорить откровенно.
Есть одна йоба, с большим количеством пф алгоритмов и им подобных. И в определенных ситуациях она подлагивает пк, а точнее инпут - мышь подвисает, что сразу чувствуется. Как это работает? Почему? Общая нагрузка на цпу низкая, сторонние процессы вроде браузера, звука не виснут, лагает именно мышь.
А это как с билетами ГИБДД.
Сначала отвечаешь неправильно на 80%, читаешь верные ответы и через некоторое время уже проходишь на 100% все тесты.
https://ideone.com/0lsJfF
Вот есть условный класс, я описал там какие-то конструкторы и операторы присваивания и хочу перегрузить операцию сложения.
Но вместо того, чтобы работать эквивалентно функции add, перегрузка создаёт временный A по адресу +28 (и соответственно память выделяется под 4 объекта вместо трёх) и вызывает оператор присваивания.
Рука тянется написать, A& operator+(...), но я не могу написать в теле функции A temp, а потом прописать return temp для такого случая. И я не могу писать this->arr=... ; return *this; - потому что такое изменит одно из слагаемых.
Работает как функция add, только если написать сразу A a=b+c, но такое не подходит, если у меня уже есть три объекта с выделенной памятью.
Я полистал книжки, но там обычно лишь вскользь упоминают перегрузки, мол работает, а то что создаётся лишний временный объект волновать меня не должно.
>>71321
Чтобы был одинаковый интерфейс для векторов, списков и деревьев, которые не умеют в обход через номера элементов, ежжи?
Ньюфаг
Тащемта operator+ надо делать через временный объект и operator+=, внутри которого ты будешь изменять объект класса, от которого вызываешь метод.
А operator+ и должен возвращать временный объект.
Об этом есть глава целая в "Объектно-ориентированное программирование на C++".
С запасом.
>и должен возвращать временный объект
Зачем такое нужно тогда, если оно просто ради красивого внешнего вида создаёт временные объекты, когда мне нужно всего лишь a=b+c поменять на add(a,b,c).
Я более-менее понимаю почему так сделано, но это тупо что ли как-то, хотелось бы немного другого. Угу, можно написать a=b;a+=c; - в таком случае временный объект не создаётся, но зато вызывается оператор присваивания и это выглядит намного паршивее, чем a=b+c и даже чем add(a,b,c).
И ещё при a=b;a+=с; Ячейки по два раза перезаписываются - add(a,b,c) выполняется за 103.2, a=b+c с четвёртым объектом за 164.0, а a=b;a+=c; за 153.9, лишь немного лучше временного объекта. Числа плавают лишь на +-5 при множественных проходах. Красивая запись явно не стоит увеличения времени выполнения на 50% с -O3 на первом попавшемся примере.
Угу, прочитаю твою главу, но пока что пролистал и нужного мне синтаксического сахара там не обнаружено.
>>71344
Зачем там noexcept, если я не использую нигде исключения, и не использую стандартную библиотеку или ещё что-то?
https://ideone.com/71jojy - так лучше, теперь доволен? Я даже мейну поставил noexcept.
Пиздец это исключения и то что мне ко всем функциям надо noexcept прописывать, хотя должно было быть наоборот, то что к функциям с исключением нужно прописывать except, а все остальные по умолчанию считаются noexcept. Больные ублюдки.
У тебя оператор присваивания вызывается и в случае a = b + c, и в случае a = b; a+=c.
>Зачем временный объект
А как ты себе представляешь колбасу из a = b + c + d + e + f?
Ты уверен, что во всех абсолютно случаях разница во времени будет такая же? Это у тебя такой класс, в случае другого класса значения могут совсем по-другому отличаться.
Ты в дебаге проверяешь время работы? Если да - то молодец, ага.
>noexcept
Затем. Компилятор для реализации перемещения должен быть уверен, что конструктор не выкинет исключение. А если ты не указываешь это явно, проверять он не обязан.
>Наоборот
Ты оптимистичен, компилятор и комитет - пессимистичен. Тебя потом набутылят за ущерб компании в случае багованного кода, а им спасибо скажут: "ух как предусмотрели, мы это ещё на стадии компила/тестирования отловили!"
Да и слово except в C++20 вроде как deprecated будет.
Ну если тебе не надо читать переменные-члены класса - то пожалуйста, не делай для них геттеры.
>как ты себе представляешь колбасу
И то верно. Сказать как особый случай, особую оптимизацию для случая из двух слагаемых язык не поворачивается. Ну и ладно, не очень то и хотелось.
Написал же, что с -O3.
Лучше бы слово try deprecated стало - бесполезная концепция и вроде как не только я её избегаю.
Да, ты прав. Я проебал момент, что либы не используются, тогда -O3 в дебаге будут те же, что в релизе, сорян.
>try
Ну хуй знает, кто-то активно обрабатывает так исключения, кто-то нет.
>я её избегаю
Ну и напрасно. Если эксепшенами не пользоваться, то можно сразу половину языка депрекейтить. C++ без них вообще слабо раскрывается.
В том, что это гораздо более мощная концепция, чем какой то номер элемента. На какой номер элемента по твоему указывает итератор создаваемый back_inserter ом?
back_inserter наряду с хуевой тучей других inserter-ов - просто костыли для обхода соглашения, что алгоритмы из стандартной либы не могут изменять размер контейнера. Соглашения, которое сделал сам комитет, а потом такой "бля а как нормально коллекции тогда юзать? На нах вам инсертеры", и это все при том, что в ассоциативных контейнерах число элементов уже может изменяться.
Весело пиздец, хочу чтобы стратусрус стал моим дилером
У тебя очень поверхностное мышление. Итераторы вообще не обязаны быть связаны с контейнерами.
Зато я в мамашу твою глубоко проник))))) Приводи примеры, аут, а не губошлепь понапрасну
Вот теперь точно не буду, папа.
Расскажи подробнее.
http://rosettacode.org/wiki/Combinations#C
откапал такое решение. Оно точно самое оптимальное?
>Итераторы вообще не обязаны быть связаны с контейнерами.
итераторы ввода-вывода
итераторы регулярок и итераторы токенов регуляров
еще что-то?
Короче придумал. Не надо уже
Я хочу передать в функцию не весь массив, а только указатель на него. В аргументе я должен указать тот же тип, что и a, ведь a не сам массив, а только указатель на него и в любом случае передается указатель. Верно?
Почему ты пишешь way->, если way не указатель?
И почему твоя среда не исправляет это? У меня сама (по нажатию какой-то клавиши) исправляет точки на -> и наоборот, если я опечатался.
Но в первом же случае way указатель. Ошибки те же
Я не знаю, наверное потому что у тебя мусор вместо ide.
У меня работают оба варианта, если указать корректную ./-> и корректный тип в push_back.
Но это не ответ же.
Код бы весь показал, вдруг у тебя на первой строчке что-то не то написано. Он у тебя жалуется на ошибку в пятой строчке, но это же дичь какая-то? Если бы там не было using namespace, то он всё-равно должен был бы другую ошибку указать. И даже если бы ты переопределил тип vector - даже тогда он жалуется на то что это не шаблонный тип, а не на < и >.
Угу, ну ты и тип, лол. До переноса оно писало: no template named 'vector'
После переноса остаётся только предупреждение, что FindInTree не возвращает return.
Еще вопрос. Не могу передать graph в функцию. Говорит чтение из недоступной памяти. Заранее большое спасибо
Сука какой же я еблан. Забыл выделить память.
А массив твой типа можно? Используй вектор тогда.
span - это обёртка над указателем, почитай cpp core guidelines
> А массив твой типа можно?
Почему нет?
> Используй вектор тогда.
Использую почти всегда, но тут мне кажетсч будет быстрее массив, тк очень много обращений к его элементам
> span - это обёртка над указателем, почитай cpp core guidelines
Прочту
>будет быстрее массив, тк очень много обращений к его элементам
А есть разница какая-то с вектором? В обоих случаях ты прибавляешь смещение и обращаешься по указателю.
У тебя там int✲✲ ? Лучшее что можно сделать, это заменить его на int✲, и обращаться как a[y✲dx+x], чтобы было только одно разыменование (и чтобы все данные лежали в одном месте и хорошо умещались в кеш), но это работает только в случае прямоугольных массивов, естественно.
>>72532
>В аргументе я должен указать тот же тип, что и a
Конечно, int✲✲.
> Использую почти всегда, но тут мне кажетсч будет быстрее массив, тк очень много обращений к его элементам
Твоё "кажется" ничего не стоит, пока сам не проверишь. От результатов можно охуеть, даже если написать так, как анон выше (через одномерный массив). Советую посмотреть доклад Александреску, вроде называется "speed is found in minds of people"
>span - это обёртка над указателе
На массивом же, чтобы знать его размер и например делать рейндж фор
Решить задачу для динамического массива, не используя
индексацию. Найти сумму нечетных элементов, стоящих на
нечетных местах (то есть имеющих нечетные номера). Вывести
адрес максимального элемента исходного массива.
Максимально не понял это задание. На вас вся надежда
>не используя индексацию
Я тоже не понял что это значит. Использовать *(a+i) вместо a, лол? Но это же смешно просто. Я бы написал с индексацией, так бы принёс и потом спросил бы что тут подразумевалось.
Вместо a{i} - квадратные скобочки съело.
Если это глупое задание от консервативного дядьки, то я бы вот такую дичь нахуевертил бы, пусть подавится: https://ideone.com/PySw0c
бамп
https://www.udemy.com/course/beginning-c-plus-plus-programming/
А ну да, ты писал
Можно прояснить вот этот момент?
То есть вот в этом коде(https://ideone.com/4GTp1H) будет утечка памяти? За счёт чего? Какое неявное действие должен был сделать виртуальный деструктор, который его не сделает? Я просто вызываю два пустых конструктора и потом один пустой деструктор для одного и того же адреса.
Я понимаю зачем нужен виртуальный деструктор когда в каком-то из наследников если я дополнительно динамически выделяю память или ещё чем-то подобным, но если я просто переопределяю методы - ничего не произойдёт же?
Кому ты пиздишь
> Какое неявное действие должен был сделать виртуальный деструктор, который его не сделает?
Вызвать деструктор наследника вместо деструктора родителя
Да даже без динамического выделения памяти.
В родительском классе у тебя одно поле, в дочернем - два.
Без виртуального деструктора при
*parent x = new child;
x.~parent();
будет вызван деструктор родительского класса. Память под сколько полей он освободит?
Что поменяется, если он не вызовет деструктор?
>>73578
Ничего не понял по правда говоря. Деструктор не освобождает память, деструктор это лишь дополнительный код, который выполняется перед освобождением памяти, разве не так?
Каких полей? У меня две структуры на 8 байт, где есть только один неявный указатель размером в 8 байт на таблицу виртуальных методов. Если интерпретировать эти 8 байт как указатель - то в нём одинаковое значение даже.
А если перегрузить new и delete, то можно увидеть, что операция выделения и очищения памяти вызывается для одного и того же адреса, неважно указывает ли указатель на A, B или void. Только что в первом случае вызывается 1 деструктор, а в третьем ни одного (и вызывается другой delete, который без указания размера). При этом память была освобождена во всех случаях, даже когда нет возможности вызвать деструктор, потому что тип - void*.
https://ideone.com/jlU7b0
> Деструктор не освобождает память, деструктор это лишь дополнительный код, который выполняется перед освобождением памяти
Это ты сам придумал или подсказал кто?
Интуиция подтверждаемая выводом программы со второго идеона.
Если бы он освобождал память, то ручной вызов деструкторов приводил бы время от времени к ошибкам, но вроде бы не приводит.
Конструкторы и деструкторы - всего лишь синтаксический сахар же.
https://godbolt.org/z/SPwxg3
Если ты утверждаешь что это не так, то я предлагаю тебе вот тут показать что такого необходимого делает деструктор B, что его нельзя пропускать. Я не увидел ничего подозрительного, например, никаких дополнительных освобождений или выделений памяти.
То есть в памяти есть две таблицы виртуальных методов для A и B, и одного указателя на одну из этих таблиц в экземпляре структуры более чем достаточно для полиморфной работы этих методов. Не вижу в каком месте деструктор или конструктор могут неявно выделять какую-либо ещё память.
Но если ты не вызовешь деструктор унаследованного класса, то у тебя вытечет его состояние. Вдруг там был какой-нибудь unique_ptr?
А, ну ты это и так понял. Вообще, ничего не произойдёт, потому что деструктор не работает с аллокацией/деаллокацией.
T ^ const ptr = new T(jopa);
раскрывается примерно так:
T ^const ptr = std::allocator<T>{}.allocate(1);
new (ptr) T(jopa);
delete ptr;
превратится примерно в следующее:
ptr->~T();
std::allocator<T>{}.deallocate(ptr, 1);
Очевидно, его нет, я только переопределяю код методов. Я же сразу сказал, что мне понятны ситуации когда виртуальный деструктор нужен, но не понятно почему пишут, что он нужен всегда если есть виртуальная функция.
>>73873
Нет, с чего бы? Деструктор всего лишь неявно вызывается в конце области видимости или при вызове delete (и вызывает деструкторы для всех внутренних классов). Используется ли он для уничтожения объекта и освобождения памяти или нет - про это нет никаких гарантий, это всего лишь его предполагаемое использование. Вот (
https://ideone.com/7vMN60) я использую деструктор как метод для печати всех элементов и почему-то объект не слишком уничтожается при вызове деструтора. А вот после delete, после этого он всё-таки перестаёт работать при первом же вызове add(0), потому что удаляет объект именно delete.
Ещё один..
Вот анон выше пояснил же, что деструктор это простой метод но со странным названием, и иногда вызывается автоматически. Всё.
Он делает ровно то, что ты в нём напишешь. Нихуя не напишешь - нихуя не сделает.
Алсо, вызовы деструкторов полей и "освобождение стековой памяти" (лол) происходят только один раз при завершении жизни объекта, и уже после того как его десктруктор выполнился.
>деструктор это простой метод но со странным названием
все же у него есть специфика..
виртуальные функции-члены внутри деструкторов не рекомендуется вызывать..
исключения не должны выходить из деструкторов, деструктор всегда должен успешно отработать..
Я кажется начинаю понимать. И стек по-моему не освобождается пока ты программу не закроешь.
Никак?
У тебя последовательность байт на диске. Записаны байты с 1 по 9000. Ты хочешь вставить строку между 4000 и 4001 байтом, чтобы она занимала байты с 4000 по 4100. Какое устройство должно быть у диска или файловой системы, чтобы такая операция была допустима?
Первую половину тебе перезаписывать не обязательно, но вот хвост в любом случае придётся. Никаких аппаратно поддерживаемых операций "всовывания" байтов между другими на нынешних дисках пока нету.
std::istringstream df(string);
df >> str;
df >> numb;
Из деструктора можно бросать и даже ловить. Если знаешь, что делаешь. А виртуальные функции и из конструктора не очень удобно вызывать, но это в силу особенностей реализации этих самых виртуальных функций.
> виртуальные функции и из конструктора не очень удобно вызывать
Что значит "неудобно"? Виртуальный вызов из конструктора ты не осуществишь
Не должен был соснуть. Ищи где проебался.
Нет, я знаю, что надо написать "int a;", и.. че? Где-то там выделилась память. Я понимаю, что я могу манипулировать с этим участком памяти через "a", но зачем мне это делать, когда я не знаю для чего мне эта переменная нужна? Я собираюсь записывать в эту переменную какие-то биты, ок, но для чего?
Я себе это представляю так, что для начала мне нужно что-то сделать, а потом, когда мне нужно будет использовать память, я ее использую.
Но тогда надо начинать с чего-то другого, верно? Но нельзя начать с чего-то другого, так как чего-то другое требует для манипуляции чего-то того, чего нет (переменной). Такой замкнутый круг. Как решать задачу в итоге?
Поешь говна, сделай бочку.
Чисто формально, вызов сделать можно. Результат, правда, не совсем тот, что нужен.
Если ты переменную объявил, это ещё не значит, что где-то там память выделилась. Твой поток сознания вообще непонятен.
Охуеть философ.
> Я себе это представляю так, что для начала мне нужно что-то сделать, а потом, когда мне нужно будет использовать память, я ее использую.
Код обрабатывает данные. Нет переменных - нет данных. Нет данных - нет смысла писать код. "Что-то сделать", впрочем, можно: объявить пустую функцию ничего не принимающую и ничего не возвращающую, а затем её вызывать, сколько хочешь.
>объявить пустую функцию ничего не принимающую и ничего не возвращающую, а затем её вызывать, сколько хочешь.
Хм, интересное решение. Буду пока придерживаться этого варианта, если что пойдет не так или появится лучший - сообщу
Если бы. У тебя там неявный int, так что данные уже есть, хоть и мусор. Перепиши хотя бы с void.
О, ещё кое-что можно:
- пустой оператор ';'
- goto метка;
Нет, дело даже не в этом. Если ты написал int a и больше ничего, то память не выделилась. Вообще нихуя не произошло! Это же объявление, блять, оно не генерирует никаких инструкций. Вообще, если ты о такой хуйне задумываешься, осваивай ассемблер. Там сразу станет ясно, кто такой стек, кто такая переменная, функция и прочие не очень понятные вещи.
Вот кстати да. Те, кто первым языком учит какой-нибудь питухон, обычно остаются без полного понимания стека.
Хуйню не неси, мальчик. Открой ассемблерный листинг и посмотри что делает деструктор.
Ну, если это именно так обозвать, то да. Просто смысла нет в такой постановке вопроса.
Ну напиши тогда виртуальный вызов из конструктора, интересно посмотреть как ты вызываешь метод объекта, который еще не создан
https://gcc.godbolt.org/z/9xx6Hn
Не берусь за чистоту эксперимента, может, там выоптимизировалось чего, но взять и вызвать получилось.
> интересно посмотреть как ты вызываешь метод объекта, который еще не создан
Что значит создан? Память аллоцирована, просто вызывается конструктор, то есть this вполне себе живой указатель. В каком состоянии таблица виртуальных функций мне неизвестно, не знаю, что там в стандарте пишут. GCC, как видно, успевает с ней поработать до входа в тело конструктора.
Thx.
Блядь, так это и есть _не_ виртуальный вызов. Вот если бы у тебя конструктор базового класса вызвал метод наследника, тогда бы был виртуальный вызов.
Пиши свой ll0 парсер
Что такое по твоим понятиям вообще "виртуальный вызов"? Это когда умный компилятор угадывает, что ты там захотел вызвать?
Qt ribbon ui?
пробую так - вылетает, по другому тоже не получается
bool b = new bool[2000000002];
delete[] b;
Заменил неизвестное на непонятное.
Памяти-то хватает? У тебя так каждый bool занимает 1 байт. Вроде бы std::vector<bool> ужимает 8 штук в один байт, попробуй.
А когда его это, того? Всё равно, поиграться с ним можно. Можно ещё и свой велосипед сделать, если это всё в учебных целях (очень вероятно).
У меня твой код работает, кушает положенных 2 гб памяти без каких-либо подводных камней.
Вектор действительно ещё в 8 раз ужимает.
>закрашивать
Если потом это нужно отрисовывать, то проверка каждого из 2 миллиардов кусков или, упаси боже, отрисовка миллиардов отдельных кусочков - очень плохие идеи.
Храни отсортированые границы частей, по ним в любой момент можно собрать части разных цветов, так что если у тебя получится 30 сегментов, то 30 и нужно будет нарисовать, без цикла на 2 миллиарда.
https://ideone.com/hcnwKW для каждого уровня сложности должно храниться не более 10 результатов
Можно как то сделать по человечески?
Понял, спасибо
Не, там надо потом вывести длину закрашенного, думал пройтись где true счетчиком, хотя все равно бы сложности были, даже не учитывая миллиарды значений -_-
Ну ты ведь понимаешь, что запись
this->VirtualMethod() в конструкторе базового класса эквивалентна записи this->MyBase::VirtualMethod ().
Анон тебе верно про позднее связывание написал.
Имей ввиду, что твоя программа будет в десятки тысяч ресурсозатратнее, чем того необходимо для алгоритма, и что она не заработает, если у тебя границы интервалов указываются как double и там какое-нибудь сложное дробное число будет.
Ты разберись, что именно тебе нужно передавать. Ноты, волны или обрезанные чести песен в mp3/flac/ogg/etc
По последнему - режь какой-нибудь libmp3/libflac/etc и передавай целые файлики
Не очень. Один раз научишься делать, потом будешь использовать где удобно.
Конечно понимаю. Я не понимаю, какой смысл у слов "сделать виртуальный вызов из конструктора". Если это вызов метода, помеченного словом virtual (мы уже поняли, что нет), то всё уже разобрано. Тогда что это? Судя по словам "позднее связывание", я могу лишь догадываться, что это значит "вызвать метод, адрес которого станет известен после отработки всех конструкторов" в конструкторе, что, очевидно, само себе противоречит.
Я говорю, что вызывать виртуальные функции в конструкторе может быть "неудобно", потому что человеку, не очень разбирающемуся в работе виртуальных методов, легко себя наебать -- он может подумать, что вызовется метод, определяемый в самом конце конструирования (как это обычно бывает), а не в процессе. На это анон мне отвечает, что "виртуальный вызов из конструктора сделать нельзя". Какой смысл в этом предложении?
Почитай про PCM и как звук вообще воспроизводится и кодируется.
Что вы сретесь, вам Страуструп с Саттером в ccg русским английским языком написали что не надо юзать виртуальные методы в конструкторе, используйте фабричные функции.
мимо
>для начала мне нужно что-то сделать, а потом, когда мне нужно будет использовать память, я ее использую
Любая программа - трансформация одних данных в другие. Нельзя просто "что-то сделать", тебе нужен direct object. Без данных нет и программы. Да и вообще >>>/ph/
Охуеть, дядя сказал, значит, так и буду делать.
Обосрал свой трон с этого
Нет конечно.
(*vec[x].begin())->...
Begin возвращает итератор, через стрелку ты получаешь указатель.
Равносильно твоему же
> vec[x][0].SomeMethod()
this-> сейчас по сути нужен только в шаблонах
> на яве
Что? На яве? У тебя же крестовый код. На яве, если не ошибаюсь, тебе нужно создать класс и в нем сделать метод - и это будет минимальным ява-кодом.
В моем случае, когда я на хук Z делаю кейборд эвент Z - оно проспамливает в милисекунду несколько раз. Как мне отделить виртуальное нажатие кейбордэвента от реального физического?
https://docs.microsoft.com/en-us/windows/win32/inputdev/wm-keydown
Бит 30: The previous key state
На него завязаться как-нибудь?
Хуже эклипса только виндовый блокнот. Используй Вижуал студию
>Однако "оптимизацией" подобные выкидывания, переписывания и упрощения - не являются.
Однако являются рефакторингом. Если оптимизация нужна для того, чтобы компьютер быстрее справлялся с кодом, то рефакторинг нужен, чтобы с кодом быстрее справлялся человек.
Мне кажется ты и близко не понял на что ответил.
мимонуб, читавший листавший этот ваш рефакторинг и прочие чистые коды
Упоминание эффекта Даннинга-Крюгера выявляет находящихся под ним ещё надёжнее.
А всё потому, что впоследствии оказалось, что сами учёные подошли к исследованиям спустя рукава и впоследствии их исследование было пересмотрено и подвергнуто критике.
Вы видите копию треда, сохраненную 18 февраля 2020 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.