Это копия, сохраненная 31 мая 2019 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Ответы на все вопросы - http://en.cppreference.com/w/ http://www.cplusplus.com/reference/
В нвидию тоже просто так не берут, там рендеринг знать надо.
Мне кажется, фенгомен JS связан с тем, что создание сайтов сейчас очень востребовано на рынке, много заказчиков и за это хорошо платят. C++ это в основном наука, разработка игр и программ для десктопа. В науке никогда не заработаешь, в геймдеве зарабатывают только какие-нибудь транснациональные сверхмонополисты вроде Valve или EA, а десктоп в 2019 никому не нужен и стремительно умирает, его вытесняют смартфоны и мобильные приложения.
>создание сайтов сейчас очень востребовано на рынке
а в биз жалуются, что веб-студии дохлый номер
Возможно, но студия разработки игр или своя научная лаборатория определённо ещё более дохлый номер в экономическом плане, конечно.
> студия разработки игр или своя научная лаборатория определённо ещё более дохлый номер
фак ю!!!!
мы все это сделаем! не сдавайтесь работяги!!!!!!!!!!
Потому что быдло пишет сайтики для быдла. Весь веб уже лет десять как в жопе, всё благодаря пиздоглазым братьям нашим меньшим, а всяким васянам и бабкам сракам похуй, что всё тормозит, не работает, выглядит как оргазм шизофреника и всё в этом духе.
Двачую, web 2.0. был ошибкой, но это неизбежно должно было произойти в связи с популяризацией интернета и компьютерных технологий. Вот на пике пример хорошего стиля: нейтральный спокойный фон, черный текст на белом фоне хорошим шрифтом, концентрация на информации, никаких отвлекающих картинок и анимации, только ссылки и текст. Благоря этому, кстати, страница весит максимально мало и загружается практически мгновенно.
черно-белый стиль имеет очень высокий контраст, который далеко не всем нравится. я бы например сделал эту страницу менее контрастной в мягких цветах, аналоговая цветовая схема или что-то вроде. алсо т.к. бэк это кишки негра и вообще перегружать страницу это фу то я бы сделал чтобы весь текст генерился джаваскриптом динамически с помощью реакта и все это была бы одна страница
мимо воннаби джаваскриптмакака
Пишу курсовик на тему "Распознавание неба на фотографии"
Речь идет о синем небе если облака и могут быть то немного. Хуярю на плюсах и библиотекой opencv. Нейросети и прочее не предлагать так как время поджимает. Сначала расписал тупо алгоритмы сегментации но препод такую хуйню не принял и поставил парашу в полугодии. Сейчас уже горит конкретно не знаю за что хвататься. Кто готов помочь отпишитесь расскажу поподробнее. Может закину копеечку какую на пиццу с пивасом хватит. Застрял на ситуации с пика. Посчитал градиент и видно что то что темное это небо. А че дальше делать и как это писать не представляю
> перегружать страницу это фу
Пожри говна и сдохни, долбоёб.
> Я бы сделал чтобы весь текст генерился джаваскриптом динамически с помощью реакта и все это была бы одна страница
Почему эвтаназия незаконна?
Как к rectangle или text свойство onClicked присобачить. Делаю датчики и хочу к ним присобачить Tooltip, но он требует окно собственно.
Пикрилейтед. Или тебя именно програмный путь интересует?
>onClicked
>Tooltip
Как это связано?
Вообще в кюмл клики присобачиваются оче просто к чему угодно с помощью
AnyItem {
MouseArea {
anchors.fill: parent
onClicked: { /code/ }
}
}
Бля, чувак. Ты меня спас.
Вот что я и забыл, так это MouseArea.
Я забыл написать, что я qml ебеню, простите.
Массивы, циклы и прочее говно изучал миллион раз
Паттерны проектирования
Программирование игр с SFML
Попробуй большим медианным фильтром пройтись что-ли, затем выбери то, что осталось тёмным.
Привести указатель к текстовому виду и записать в std::string к примеру. (явно не static_cast<std::string>(void))
itoa не в стандарте, но там есть указание основы (16-чной для адресов)
сам ты далбаёбю
std::stringstream, не?
Ладно, ладно, видимо на этот раз далбаёб здесь только я, я просто уже забыл сишные функции, всё проверил, всё работает, спасибо.
нормально только все равно некоторые части остаются черными. Вот если бы начать заливать сверху то тогда нормально будет. Осталось понять как это делать
если ты не можешь найти это - то это не вижуал студия ебучая, а ты.
Про-тип - grep -rin для поиска текста из гит баша
friend std::istream&operator>>(std::istream&in, Movie&object) {
std::cout << "Movie name: "; in >> object.name;
std::cout << "Show time: "; in >> object.time;
...
...
}
Надо чтобы в object.name записывалась строчка с пробелами
friend std::istream&operator>>(std::istream&in, Movie&object) {
std::cout << "Название:\ "; std::getline(in, object.name);
std::cout << "Время сеанса:\ "; std::getline(in, object.time);
std::cout << "Цена:\ "; std::getline(in, object.price);
std::cout << "Зал:\ "; std::getline(in, object.room);
return in;
}
Потому что читать надо внимательнее.
>>382569
> Окей, я переделал под стринг, но теперь он перепрыгивает сразу на время сеанса и ничего не записывает в название
Опять же, читать надо внимательнее. По умолчанию сепаратор стоит '\n'. Непонятно, какой у тебя формат файла, может ты записал всё в одну строку и теперь искренне надеешься прочитать обратно так, как записывал.
Кстати, нахера тебе эти вызовы std::cout при чтении из потока?
Записываю в бинарный файл в строку, да. cout'ы чтобы сказать пользователю, что вводить надо.
Извините меня, пожалуйста, но у меня до завтра курсач горит, а я не совсем выкупаю, что делаю.
Подожди, я же еще в файл ничего не записываю на этом этапе, почему он сразу перепрыгивает на время?
> Записываю в бинарный файл в строку, да.
Чё?
> cout'ы чтобы сказать пользователю, что вводить надо.
Ну так и пиши тогда cin, зачем тебе отдельная функция? Ты же понимаешь, что если на неё натравить ifstream, то у тебя на экране появятся ненужные строки
PS: никто в код твоего курсача смотреть не будет, пиши как тебе удобно
Спасибо, дядь. У меня походу в другом месте где-то проблема, что он сразу перескакивает.
В общем заколхозил, что он просто дважды спрашивает это и всё работает)
std::cout << ""; in.getline(object.name, 32);
std::cout << "Название: "; in.getline(object.name, 32);
Не помню, cin буферизированый? Возможно ты что-то до этого вводил и поток не почистил
У тебя после цифрового ввода остается '/n' в потоке. Гетлайн ее считывает и получает пустую строку. После ввода цифр делай cin.ignore(1000, '/n');
Спасибо. Бтв, курсач всё-таки не написал и буду заново переделывать с нуля уже своё. Можешь совет дать?
У меня есть класс movie а ля сеансы в кинотеатре и мне нужно хранить все эти сеансы в бинарном файле. Как лучше сделать: 2 отдельных класса для сеанса и файла, или методы с работой с файлом просто в классе фильма сделать? И как лучше реализовывать поиск и редактирование?
Показ фильма это данные в программе. За каждый показ отвечает объект твоего класса. Файл -- это способ вывода из программы. Твой класс должен отвечать и за возможность своего вывода. Короче: класс для сеанса и метод в нем для вывода.
> У меня есть класс movie а ля сеансы в кинотеатре и мне нужно хранить все эти сеансы в бинарном файле. Как лучше сделать: 2 отдельных класса для сеанса и файла, или методы с работой с файлом просто в классе фильма сделать?
У класса Movie заводишь метод для сохранения/загрузки, делаешь ещё один класс, который будет иметь допустим std::vector<Movie>, вот у него и делай методы поиска/редактирования/etc. Заодно и сохранение всего списка.
> И как лучше реализовывать поиск и редактирование?
Поиск либо как find(enum критерий, строка), а внутри уже в зависимости от критерия использовать эту строку (например, для поиска по названию обычным find_if проходишься по вектору, предикат будет сравнивать название с аргументом, для поиска по году можешь сначала перевести строку в число и точно так же искать) ИЛИ сделать несколько разных методов findByName, findByYear и т.п.
Для редактирования можешь id какой-нибудь у фильма завести
>operator<<(ostream, myEnum) {
> static std::map<MyEnum, std::string> map = {{Enum1, "Enum1"}, {Enum2, "Enum2"}};
> ostream<<map[myEnum];
> return ostream;
>}
Можно ли как-то заставить компилятор ругаться в случае, если значения enum'а обновили и они перестали совпадать с созданным map'ом?
>У класса Movie заводишь метод для сохранения/загрузки
угу, классический антипаттерн universal object
[CODE]
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main(){
setlocale(LC_ALL, "Russian"); //Не помогает это дерьмо
string text;
cin >> text;
ofstream fout;
fout.open(text + ".txt");
system("pause");
return 0;
}
[/CODE]
Щас потестил cout << text + ".txt";
Почему-то и вывод тоже не работало. ХЗ кто виноват. Я или MINGW, но бля, чё делать?
Проблема в кодировке самом терминале
system('chcp 1251');
или
#include <windows.h>
SetConsoleCP(1251);
SetConsoleOutputCp(1251);
должны решать проблему
Дохера всего перепробовал. Даже скатился до стандартного вывода введёной фразы в консоль- не робит вообще ни как.
АЛСО файлы так же создаются в неверной кодировке.
>Можно ли как-то заставить компилятор ругаться в случае, если значения enum'а обновили и они перестали совпадать с созданным map'ом?
Можно, но обычно костылями. Самый простой способ - это сразу энумы объявлять со строкой.
https://stackoverflow.com/questions/28828957/enum-to-string-in-modern-c11-c14-c17-and-future-c20
Ещё можно закостылить switch и предупреждения C4061/C4062.
Значение знаешь?
Конпелятору попробуй поставить флаги -finput_charset=cp1251(или че у тебя там) -fexec_charset=cp866.
Посоветуй сам тогда чт-нибудь. Эта хуета ни в какую не поддаётся, и не желает адекватно работать
Советую перестать программировать на винде, например.
Советую прекратить жрать пердоговно. В студии проекты по умолчанию юникодные. Вместо "ололо" пишешь L"ололо", вместо char - wchar_t, вместо printf - wprintf, и так далее.
Добавлю. Ядро Windows, графическая подсистема и NTFS, начиная с NT 4.0, полностью на Unicode. Добавлены библиотеки для поддержки ANSI. Но часть вызовов из ANSI конвертируется в Unicode.
мимопроходил
, многопоточное проганье - вот за это вообще не шарю, и за пределами std тоже не шарю. Так вот, что и сколько мне нужно еще учиться, чтобы стать гуру в C++ (с учетом того, что вышеперечисленное я например уже выучил (авансом) )?
Ну бля дохуя разной, в т. ч. проекты на github, игры там, sdl2 ncurses sfml. Но я прост не понимаю, типо все пиздят мол C++ дохуя сложный, его никто не знает и т. д, но во что эта сложность упирается? В изучение всевозможнвх бустов? В умение писать на темрлейтах тьюринг полные языки?
Но на самом деле нужно быть не гуру c++, а разбираться в предметной области и библиотеках, в куче всякой хуйни типа вероятности отказа ячеек памяти, аппаратных багов и прочего.
погоди, а какую книжку александреску ты читал? "современное проектирование" что ли? как ты ее читал, если не понимаешь "как вычислить факториал на этапе компиляции", там без понимания шаблонов вообще не стоит ее открывать, лол
Пока что с релиза не устарел, а много воды утекло
Какие возможные подводные камни? На идеоне с простым классом отрабатывает без проблем. В проекте начинает неистово жрать память на моменте с erase (доходит до 10+ ГБ отожранной оперативы и умирает)
Видимо время затрачивается на ресайз вектора.
Вариант с vec.erase(vec.begin(), vec.begin()+1000) работает в 1000 раз быстрее.
Вариант с vec.erase(vec.begin(), vec.begin()+10000) работает мнгновенно
Если требуется контролируемые итерации по 1 шт, то vec.pop_back() работает с приемлемой скоростью.
Ща местные гуру разъяснят, мне тоже интересно.
Мне нужно прочитать кириллические значения из файла с кириллическим названием.
Сначала я ищу нужный файл в папке
wchar_t szPath[MAX_PATH];
GetCurrentDirectory(sizeof(szPath), szPath);
lstrcat(szPath, mask);
hf = FindFirstFile(szPath, &fd);
etc.
Файлы с кириллицей в названии я не нахожу.
Ок, пишу setlocale(LC_ALL, "russian");
Файлы с кириллицей начинают находиться.
Начинаю читать их при помощи кода
std::wstring line;
std::wifstream in(name);
if (in.is_open()){
while (getline(in, line)){
std::wcout << "readed: " << line.c_str() << std::endl;
}}
in.close();
Читаются 2 символа "Ee".
Отрубаю setlocale(LC_ALL, "russian") и хардкожу название файла.
Файл читается нормально.
Получается что я могу или читать файл или искать файл.
Как делается правильно то?
Мне нужно прочитать кириллические значения из файла с кириллическим названием.
Сначала я ищу нужный файл в папке
wchar_t szPath[MAX_PATH];
GetCurrentDirectory(sizeof(szPath), szPath);
lstrcat(szPath, mask);
hf = FindFirstFile(szPath, &fd);
etc.
Файлы с кириллицей в названии я не нахожу.
Ок, пишу setlocale(LC_ALL, "russian");
Файлы с кириллицей начинают находиться.
Начинаю читать их при помощи кода
std::wstring line;
std::wifstream in(name);
if (in.is_open()){
while (getline(in, line)){
std::wcout << "readed: " << line.c_str() << std::endl;
}}
in.close();
Читаются 2 символа "Ee".
Отрубаю setlocale(LC_ALL, "russian") и хардкожу название файла.
Файл читается нормально.
Получается что я могу или читать файл или искать файл.
Как делается правильно то?
проблема в том что ты не понимаешь, как устроен вектор
проблема в том, что удаление первого элемента, как и удаление элементов из середины вектора - дорогая операция
В 21 веке интернета, международного текста, неиспользование юникода, свободно поддерживающего все языки сразу, должно быть законодательно объявлено вредительством против человечества и наказываться кастрацией и пожизненными принудительными работами на лесоповале в Колыме.
В 2019 году говновысер работает только с одним языком, это у него "коррректно". Корректно - убивать таких уродов.
Попробуй erase через remove сделать, чтобы удалять не с начала вектора первый элемент, а с конца почитай, как remove работает.
И ты компилишь в дебаге или релизе? Я не такой гуру, чтобы точно знать тонкости и разницу в видах сборки, но мои скудные знания дают предположение, что это может сыграть свою роль.
Конкретно в этом примере или с твоим классом?
Потому что здесь память жрать и правда нечему. А вот у тебя может быть утечка памяти в деструкторе или конструкторе копирования/перемещения.
А все потому что его писал Бог Патрег
а, ясненько
>Я не могу понять, почему начинает заниматься память в огромных масштабах.
потому что ты не понимаешь, что происходит в векторе при удалении первого элемента
а происходит кое-что (что ты должен знать так то) люто непроизводительное
но объяснять я этого не буду здеся
Выбрал почему то с++. На ваш взгляд хороший язык? Могу поднимать 300к наносек 50к на нем? Вообще перспективный язык для вкатывальщиков? Чем он отличается от С и C#? Или все как то взаимосвязано. Вроде С++ дополнение к С.
Прошу объяснить адекватно.
Все остальные языки это как бы подмножество C++
Алло, что такое байты и память, алло блять. Когда не необходимо на юникоде писать и нужна память, используй аски
UTF-8
Я ещё слышал, что вместо написания компактных программ, люди покупают память, это так?
Я думаю да, ведь долбоебы все на utf8
50 можно. До сотни можно в Москве. Больше уже сложнее. Если нужны деньги, то лучше питон или жс.
Какой ужас, последний стандарт. Да, чего это я, надо как настоящий дед писать на C++98, вот где скилл показывали.
Не ерничай. Новый проект начали на C++17, правда там без работы с fs. А старые с 11 портировать пока никто не будет.
Толсто
Я хочу сделать variadic функцию, но мне нужно передавать в нее два инта, которые имеют разные значения. (Один - высота, другой - ширина) причем я не могу передавать их структурой, т.к. я хочу, чтобы можно было передать что-то одно, а не целую структуру. Короче, как мне различить два инта из параметров?
> Я ещё слышал, что вместо написания компактных программ, люди покупают память, это так?
> Я думаю да, ведь долбоебы все на utf8
Гляньте, весь мир - долбаёбы, один ты знаешь, как писать софт.
UTF8 при использовании только ASCII символов занимает столько же памяти, сколько и ASCII.
То есть ты точно знаешь, сколько у тебя аргументов будет, но всё равно хочешь использовать variadic функцию? В дурке амнистия?
Создай специальный класс, по сути обертку над структурой, которая будет в полях хранить значения аргументов. Создай сеттеры для этих полей. Дефолтный конструктор этого класса будет полям присваивать значения по-умолчанию. Если нужно отслеживать, были ли переданы те или иные аргументы, заведи в пару каждому полю флаг. Для удобства пусть каждый сеттер возвращает ссылку на себя (на объект этого класса, то есть *this). Тогда ты сможешь писать вот так:
Foo(Params().Width(my_width).Height(my_height));
Foo(Params().Height(my_height));
Foo(Params().Width(my_width));
И тп, а внутри будешь делать:
if (params.HasHeight() && params.HasWidth()) {
//есть и ширина, и высота
}
else if (params.HasHeight()) {
//логика на случай, когда дали только высоту
}
Немного заебно, но это самый расширяемый вариант, да и вообще полезный паттерн.
Я знаю сколько у меня аргументов будет, но я хочу функцию в которой (1)не принципиален порядок аргументов и (2)можно вызывать с произвольным кол-вом аргументов (их всего 10) Например, так: foo(width) foo(height, witdth) foo(color, width, height) и т.д.
Извини, но твой варик мне не особо подходит. Мне это нужно, чтобы уменьшить кол-во букав. Дело в том, что я использую билдер, для создания объекта класса, а хочу, чтобы была вариадик функция в которую я могу передать сам билдер, а потом параметры.
Типа так: setBuilder(ОbjectBuilder(), param1, param2, param3) и у всех парамов произвольный порядок и можно их вообще не задавать (типа так - setBuilder(ОbjectBuilder()) )
Не понял тебя. Допустим ты смог написать вот это:
>вариадик функция в которую я могу передать сам билдер, а потом параметры
>не принципиален порядок аргументов
>можно вызывать с произвольным кол-вом аргументов
Разве в таком случае необходимость в билдере не отпадет?
Не думаю, что такую функцию возможно написать без именованных аргументов, которые запланированы на 20 год.
> (1)не принципиален порядок аргументов
И как же ты собираешься что-то осмысленное с ними делать, если ты не знаешь какой именно у тебя аргумент?
> (2)можно вызывать с произвольным кол-вом аргументов (их всего 10) Например, так: foo(width) foo(height, witdth) foo(color, width, height) и т.д.
Ну так запили десять методов, не еби голову ни себе, ни тем, кто твой код поддерживать будет.
А лучше подумай ещё раз, что-то твоя функция какую-то хуйню делает.
>Разве в таком случае необходимость в билдере не отпадет?
Мне в некоторых местах нужен именно сам билдер. Например, когда кол-во задаваемых параметров меньше 2(такое часто бывает). В общем, у меня вопрос, как можно отличить один инт от другого?
>И как же ты собираешься что-то осмысленное с ними делать, если ты не знаешь какой именно у тебя аргумент?
Именно это я у вас и спрашиваю. Как можно один инт от другого отличить? Я этого не знаю. Можно может, например, создать какой-то свой тип который будет просто оберткой над интом?
>десять методов
>не еби голову ни себе, ни тем, кто твой код поддерживать будет.
>как можно отличить один инт от другого?
Только при помощи билдеров, эмуляции именованных аргументов при помощи пар и прочих костылей. То есть в твоем случае никак вообще. Повторюсь, если бы такие функции можно было писать, билдер как паттерн был бы не нужен, хоть тебе и кажется обратное.
>Ну так запили десять методов, не еби голову ни себе, ни тем, кто твой код поддерживать будет.
Эти 10 функций, что сетят параметры билдера уже есть. Проблема в том, что когда мне нужно засеттить все 10 параметов, например, это выглядит так:ObjectBuilder().withParam1().withParam2().withParam3().withParam4().withParam5().withParam6().withParam7().withParam8().withParam9().withParam10().getResult();
А я хочу так: createBuilder(ObjectBuilder(), param1, param3, param2, param5, param4, param7, param6, param8, param10, param9);
Понятно?
> Как можно один инт от другого отличить?
Надеюсь, ты уже понял ответ...
>Можно может, например, создать какой-то свой тип который будет просто оберткой над интом?
Конечно можно, но если я тебя встречу в реальной жизни, то скорее всего сломаю нос. Серьезно, бля, перегрузки писать не хочу, хочу обёртку над интом писать. Пиздец ты гений. Зачем тебе вообще аргументы местами менять? Ты что, на вызывающей стороне не можешь их в правильном порядке расставить?
В общем,
> не еби голову ни себе, ни тем, кто твой код поддерживать будет.
>Зачем тебе вообще аргументы местами менять?
Ты совсем бака? А если я захочу засеттить последние три параметра. Мне нужно будет написать:
createBuilder(ObjectBuilder(), param1, param2, param3, param4, param5, param6, param7, param8, param9, param10)
Вместо:
createBuilder(ObjectBuilder(), param8, param9, param10)
Понимаешь, почему мне не нужна перегрузка?
Хотя нет, у меня есть безумная идея. Пишешь функцию, которая принимает 10 аргументов и собирает из них билдер в стандартном порядке:
>ObjectBuilder().withParam1().withParam2().withParam3().withParam4().withParam5().withParam6().withParam7().withParam8().withParam9().withParam10()
Когда нужно вызвать функцию в особом порядке, делаешь std::bind и нужным образом расставляешь плейсхолдеры
>std::bind(foo, _1, _3, _2, _5, _4, _7, _6, _8, _10, _9)
А затем вызываешь в стандартном порядке
>createBuilder(ObjectBuilder(), param1, param2, param3...)
Может ты сможешь из этой идеи что-то толковое сделать, но пока это довольно сомнительно.
> >Ну так запили десять методов, не еби голову ни себе, ни тем, кто твой код поддерживать будет.
> Эти 10 функций, что сетят параметры билдера уже есть. Проблема в том, что когда мне нужно засеттить все 10 параметов, например, это выглядит так:ObjectBuilder().withParam1().withParam2().withParam3().withParam4().withParam5().withParam6().withParam7().withParam8().withParam9().withParam10().getResult();
> А я хочу так: createBuilder(ObjectBuilder(), param1, param3, param2, param5, param4, param7, param6, param8, param10, param9);
> Понятно?
Попробуй передавать функтор, у которого билдер может спрашивать, нужен ли параметр и его значение.
Что-то типа
std::function<std::optional<int>(enParamType)> getParam
Параметры придется описать енамом (ну а хули ты хотел-то?). Вызывающая сторона будет писать что-то вроде
auto getParamFn = [](enParamType t) -> std::optional<int>
{
....if(t == param1)
........return myParam1;
....else
.........
....return std::nullopt;
}
builder.Build(getParamFn)
Так что, нельзя так? Я в принципе не против такой хери createBuilder(ObjectBuilder(), width(5), height(20), colorR(255)). Но, как ее лучше реализовать?
Передавать в вариадик функцию. createBuilder(ObjectBuilder(), width(5), height(20), colorR(255)) типа так.
Ну и что? Тип-то тебе всё равно надо как-то различать, хоть это и обёртка (или опять же, десять перегрузок на каждую обёртку)
>Тип-то тебе всё равно надо как-то различать, хоть это и обёртка
Ну, да в плюсах же вроде бы есть способ сравнить типы? >или опять же, десять перегрузок на каждую обёртку
Всмысле? Будет одна вариадик функция, куда я все буду пихать и там в зависимости от типа буду вызывать методы билдера.
Почему? Как лучше? За этим я в этот тред и пришел. Как можно не говнокод сделать?
> Ну, да в плюсах же вроде бы есть способ сравнить типы?
Подумай десять тысяч раз, перед тем, как сравнивать типы.
> Всмысле? Будет одна вариадик функция, куда я все буду пихать и там в зависимости от типа буду вызывать методы билдера.
Можешь обертки свои наследовать от какой-нибудь хуйни с методом getType(), где будешь возвращать свой тип (enum), потому что то, что предлагает язык это совсем пиздец.
Самый лучший гайд - https://bazel.build/
рили, cmake - тула из прошлого века с кастомным наркоманским языком описания сборки
Можешь плюсы выучить для общего понимания. Для заработка советую какой-нибудь С# с вкатом в .NET или Пайон.
Веб-хуеб - js/css/html.
>Подумай десять тысяч раз, перед тем, как сравнивать типы
std::is_same + магия перегрузок (или if constexpr) может как нибудь помочь тебе
Мимопроходил-кун
Я имел ввиду то, что такие заклинания в реальной жизни не кастуют
И еще один вопрос, хотя возможно не по теме. Что делать с тем чувством лени, когда начинаешь учитить язык, а после бросаешь из-за лени
Поток создаю так
QThread* thread = new QThread();
this->moveToThread (thread);
connect(thread, SIGNAL(started()), this, SLOT(slotReadFiles()));
connect(thread,SIGNAL(finished()),thread,SLOT(deleteLater ()));
connect(this ,SIGNAL(finished()),thread,SLOT(quit ()));
thread->start(QThread::HighPriority);
slotReadFiles() - слот где идет считывание файлов в структуры
Единственное что, в этом слоте идет создание и удаление объектов класса. На всякий случай и его прикреплю
if (filename == "stream.txt")delete [] streamView;
if (filename == "meas.txt") delete [] measView;
if (filename == "glo.txt") delete [] zrvView;
if (filename == "decoder.txt")delete [] decoderView;
if (filename == "stream.txt")streamView = new stream [ BIS.size() - 1 ];
if (filename == "meas.txt") measView = new meas [ BIS.size() - 1 ];
if (filename == "glo.txt") zrvView = new zrv [ BIS.size() - 1 ];
if (filename == "decoder.txt")decoderView = new decoder [ BIS.size() - 1 ];
int i = 0;
if (filename == "stream.txt") i = 0;
if (filename == "decoder.txt") i = 1;
if (filename == "meas.txt") i = 2;
if (filename == "glo.txt" || filename == "gps.txt" ||
filename == "bdu.txt" || filename == "gal.txt") i = 3;
switch(i){
case (0) : {
streamView->items_.clear();
QDate dBegin = ui.dateEditCurrent->date();
QDate dEnd = ui.dateEditNext->date();
int j = 0;
streamView[j].items_.clear();
for(; dBegin <= dEnd; dBegin = dBegin.addDays(1)){
if (dBegin <= dEnd) {
YYYY = dBegin.toString("yyyy");
DD = dBegin.toString("dd") ;
MM = dBegin.toString("MM") ;
for (int j = 0;j < BIS.size()-1; j++){
NNNN_ = BIS[j];
setMaskDir(path);
u = j;
streamView[j].readFile(path);
}
}
j++;
}
break;
}
case (1) : {
decoderView->items_.clear();
QDate dBegin = ui.dateEditCurrent->date();
QDate dEnd = ui.dateEditNext->date();
int j = 0;
for(; dBegin <= dEnd; dBegin = dBegin.addDays(1)){
if (dBegin <= dEnd) {
YYYY = dBegin.toString("yyyy");
DD = dBegin.toString("dd") ;
MM = dBegin.toString("MM") ;
for (int j = 0; j < BIS.size()-1; j++){
NNNN_ = BIS[j];
setMaskDir(path);
decoderView[j].readFile(path);
}
}
j++;
}
break;
}
case (2) : {
measView->items_.clear();
QDate dBegin = ui.dateEditCurrent->date();
QDate dEnd = ui.dateEditNext->date();
int j = 0;
for(; dBegin <= dEnd; dBegin = dBegin.addDays(1)){
if (dBegin <= dEnd) {
YYYY = dBegin.toString("yyyy");
DD = dBegin.toString("dd") ;
MM = dBegin.toString("MM") ;
for (int i = 0;i < BIS.size()-1; i++){
NNNN_ = BIS;
setMaskDir(path);
measView.readFile(path);
}
}
j++;
}
break;
}
case (3) : {
int j = 0;
for (int i = 0; i < 4;i++) {
if (i == 0){
QDate dBegin = ui.dateEditCurrent->date();
QDate dEnd = ui.dateEditNext->date();
filename = "glo.txt";
for(; dBegin <= dEnd; dBegin = dBegin.addDays(1)){
if (dBegin <= dEnd) {
YYYY = dBegin.toString("yyyy");
DD = dBegin.toString("dd") ;
MM = dBegin.toString("MM") ;
for (int j = 0;j < BIS.size()-1; j++){
NNNN_ = BIS[j];
setMaskDir(path);
zrvView[j].readFileGlo(path);
}
}
j++;
}
}
if (i == 1){
QDate dBegin = ui.dateEditCurrent->date();
QDate dEnd = ui.dateEditNext->date();
filename = "gps.txt";
for(; dBegin <= dEnd; dBegin = dBegin.addDays(1)){
if (dBegin <= dEnd) {
YYYY = dBegin.toString("yyyy");
DD = dBegin.toString("dd") ;
MM = dBegin.toString("MM") ;
for (int j = 0;j < BIS.size()-1; j++){
NNNN_ = BIS[j];
setMaskDir(path);
zrvView[j].readFileGps(path);
}
}
j++;
}
}
if (i == 2){
QDate dBegin = ui.dateEditCurrent->date();
QDate dEnd = ui.dateEditNext->date();
filename = "gal.txt";
for(; dBegin <= dEnd; dBegin = dBegin.addDays(1)){
if (dBegin <= dEnd) {
YYYY = dBegin.toString("yyyy");
DD = dBegin.toString("dd") ;
MM = dBegin.toString("MM") ;
for (int j = 0;j < BIS.size()-1; j++){
NNNN_ = BIS[j];
setMaskDir(path);
zrvView[j].readFileGal(path);
}
}
j++;
}
}
if (i == 3){
QDate dBegin = ui.dateEditCurrent->date();
QDate dEnd = ui.dateEditNext->date();
filename = "bdu.txt";
for(; dBegin <= dEnd; dBegin = dBegin.addDays(1)){
if (dBegin <= dEnd) {
YYYY = dBegin.toString("yyyy");
DD = dBegin.toString("dd") ;
MM = dBegin.toString("MM") ;
for (int j = 0;j < BIS.size()-1; j++){
NNNN_ = BIS[j];
setMaskDir(path);
zrvView[j].readFileBdu(path);
}
}
j++;
}
}
}
break;
}
}
Поток создаю так
QThread* thread = new QThread();
this->moveToThread (thread);
connect(thread, SIGNAL(started()), this, SLOT(slotReadFiles()));
connect(thread,SIGNAL(finished()),thread,SLOT(deleteLater ()));
connect(this ,SIGNAL(finished()),thread,SLOT(quit ()));
thread->start(QThread::HighPriority);
slotReadFiles() - слот где идет считывание файлов в структуры
Единственное что, в этом слоте идет создание и удаление объектов класса. На всякий случай и его прикреплю
if (filename == "stream.txt")delete [] streamView;
if (filename == "meas.txt") delete [] measView;
if (filename == "glo.txt") delete [] zrvView;
if (filename == "decoder.txt")delete [] decoderView;
if (filename == "stream.txt")streamView = new stream [ BIS.size() - 1 ];
if (filename == "meas.txt") measView = new meas [ BIS.size() - 1 ];
if (filename == "glo.txt") zrvView = new zrv [ BIS.size() - 1 ];
if (filename == "decoder.txt")decoderView = new decoder [ BIS.size() - 1 ];
int i = 0;
if (filename == "stream.txt") i = 0;
if (filename == "decoder.txt") i = 1;
if (filename == "meas.txt") i = 2;
if (filename == "glo.txt" || filename == "gps.txt" ||
filename == "bdu.txt" || filename == "gal.txt") i = 3;
switch(i){
case (0) : {
streamView->items_.clear();
QDate dBegin = ui.dateEditCurrent->date();
QDate dEnd = ui.dateEditNext->date();
int j = 0;
streamView[j].items_.clear();
for(; dBegin <= dEnd; dBegin = dBegin.addDays(1)){
if (dBegin <= dEnd) {
YYYY = dBegin.toString("yyyy");
DD = dBegin.toString("dd") ;
MM = dBegin.toString("MM") ;
for (int j = 0;j < BIS.size()-1; j++){
NNNN_ = BIS[j];
setMaskDir(path);
u = j;
streamView[j].readFile(path);
}
}
j++;
}
break;
}
case (1) : {
decoderView->items_.clear();
QDate dBegin = ui.dateEditCurrent->date();
QDate dEnd = ui.dateEditNext->date();
int j = 0;
for(; dBegin <= dEnd; dBegin = dBegin.addDays(1)){
if (dBegin <= dEnd) {
YYYY = dBegin.toString("yyyy");
DD = dBegin.toString("dd") ;
MM = dBegin.toString("MM") ;
for (int j = 0; j < BIS.size()-1; j++){
NNNN_ = BIS[j];
setMaskDir(path);
decoderView[j].readFile(path);
}
}
j++;
}
break;
}
case (2) : {
measView->items_.clear();
QDate dBegin = ui.dateEditCurrent->date();
QDate dEnd = ui.dateEditNext->date();
int j = 0;
for(; dBegin <= dEnd; dBegin = dBegin.addDays(1)){
if (dBegin <= dEnd) {
YYYY = dBegin.toString("yyyy");
DD = dBegin.toString("dd") ;
MM = dBegin.toString("MM") ;
for (int i = 0;i < BIS.size()-1; i++){
NNNN_ = BIS;
setMaskDir(path);
measView.readFile(path);
}
}
j++;
}
break;
}
case (3) : {
int j = 0;
for (int i = 0; i < 4;i++) {
if (i == 0){
QDate dBegin = ui.dateEditCurrent->date();
QDate dEnd = ui.dateEditNext->date();
filename = "glo.txt";
for(; dBegin <= dEnd; dBegin = dBegin.addDays(1)){
if (dBegin <= dEnd) {
YYYY = dBegin.toString("yyyy");
DD = dBegin.toString("dd") ;
MM = dBegin.toString("MM") ;
for (int j = 0;j < BIS.size()-1; j++){
NNNN_ = BIS[j];
setMaskDir(path);
zrvView[j].readFileGlo(path);
}
}
j++;
}
}
if (i == 1){
QDate dBegin = ui.dateEditCurrent->date();
QDate dEnd = ui.dateEditNext->date();
filename = "gps.txt";
for(; dBegin <= dEnd; dBegin = dBegin.addDays(1)){
if (dBegin <= dEnd) {
YYYY = dBegin.toString("yyyy");
DD = dBegin.toString("dd") ;
MM = dBegin.toString("MM") ;
for (int j = 0;j < BIS.size()-1; j++){
NNNN_ = BIS[j];
setMaskDir(path);
zrvView[j].readFileGps(path);
}
}
j++;
}
}
if (i == 2){
QDate dBegin = ui.dateEditCurrent->date();
QDate dEnd = ui.dateEditNext->date();
filename = "gal.txt";
for(; dBegin <= dEnd; dBegin = dBegin.addDays(1)){
if (dBegin <= dEnd) {
YYYY = dBegin.toString("yyyy");
DD = dBegin.toString("dd") ;
MM = dBegin.toString("MM") ;
for (int j = 0;j < BIS.size()-1; j++){
NNNN_ = BIS[j];
setMaskDir(path);
zrvView[j].readFileGal(path);
}
}
j++;
}
}
if (i == 3){
QDate dBegin = ui.dateEditCurrent->date();
QDate dEnd = ui.dateEditNext->date();
filename = "bdu.txt";
for(; dBegin <= dEnd; dBegin = dBegin.addDays(1)){
if (dBegin <= dEnd) {
YYYY = dBegin.toString("yyyy");
DD = dBegin.toString("dd") ;
MM = dBegin.toString("MM") ;
for (int j = 0;j < BIS.size()-1; j++){
NNNN_ = BIS[j];
setMaskDir(path);
zrvView[j].readFileBdu(path);
}
}
j++;
}
}
}
break;
}
}
Так чтобы наполнить объект из своего класса. В документации, по крайней мере, писалось так
@
ДАВАЙТЕ!
@
ДЕЛАЮТ СПЕЦИАЛИЗАЦИЮ ДЛЯ КАЖДОГО ТИПА
Зато шаблоны - модно, стильно, молодежно.
Ясен хуй. Говняный питон лучше макросопараши из cmake
Давай больше контекста, а то непонятно нихера, что ты собираешься делать.
только без простыни методов
Препода нахуй, пользователя на kassir.ru
А твой билет является и зрителем и фильмом? Или чем-то одним из них?
Какой Qt лучше установить на Ubuntu, который в репозитории, с помощью apt, или самый новый, с сайта разработчиков, или какие еще есть варианты? Если с сайта качать, его же ведь автоматически обновить не получиться.
Как устроен контрол типа ListBox, тоесть один поток постоянно перерисовывает данные из некого контейнера, а другой - добавляет данные в этот контейнер. Что там происходит? Как избегается состояние гонки? mutex?
Допустим поступил сигнал на добавление и острисовку одновременно (утрирую)
Если конкретно, то ImGui нет контролов, но есть контейнер с данными)
Есть, да, думаю, сгодится
Видимо добавление с мьютексом идет.
static_cast<char> после того как считаешь это число в интовую переменную.
#include <functional>
У меня такая хуйня была из-за передачи через &.
Попробуй без нее, если выйдет - сделай current position глобальной переменной.
P.S.: не join, а detach, иначе будешь ждать окончания выполнения каждого вызова, а ты же хочешь параллельности.
двачую
а делали его ребята из nvidia
вы только вдумайтесь, 25 (!) тыщ вкатывальщиков на платных курсах
по крестам
целая армия, бля
Щас бы за вкатывальщиков переживать
на курсере курсы можно аудировать бесплатно, но и платно их ради сертификата много кто проходят. 25к со всего мира сравнительно немного, большая часть не вкатывальщики даже а уже работающие прилепить что-нибудь на линкедин или студенты или просто любопытствующие, немало буржуев просто собирают сертификаты, плюсы фигня для вката же
>что их проходит около 25 тысяч человек
В смысле заканчивает с сертификатом? Или смотрит только первый урок и в ужасе убегает?
Откуда цифры?
Почему?
>на курсере курсы можно аудировать бесплатно, но и платно их ради сертификата много кто проходят
неа ((
если бесплатно, то не будет доступа к заданиям и к проверяющей системе
а без выполнения заданий смотреть видео - пустое дело
https://pastebin.com/wgLiZU5x
Что означает запись
>void Rect;
И почему ты передаешь в функцию которая не принимает параметры какие-либо значения?
Понимать бы вообще хоть что-то. Просто попросили помочь, но даже гугля ошибки толком ничего найти не получается.
Список ошибок то дай, при запихивании твоего кода в компилятор ругается на внешние символы, которые пастбин сам преобразовывает
Я не ебу за твои методы треугольников, но вот тебе код который хотя бы начинает выполняется, с моими допущениями что там имелось в виду.
https://pastebin.com/5y5ZBXfp
Но а вообще ты бы хоть погуглил перед тем как спрашивать.
Готовые реализации каждого из методов в инете.
LMGTFY
https://stackoverflow.com/questions/1374037/ambiguous-overload-call-to-absdouble
Возможно, самое простое решение - заменить abs на fabs
Блять ты скопировал откуда-то код, у тебя операторы ввода и вывода заменились на треугольные кавычки, и компилятор тебе открыто говорит что он не понимает что ты от него хочешь. Во вторых у тебя почему-то стоит точка с запятой после обьявления функции, и отсутствует список формальных параметров а потом ты еще и передаешь в эту недофункцию какие-то значения.
Доброго вечерочка, друзья. Примерно года два назад начал немного увлекаться программированием на C++, до этого никакого опыта в разработке у меня не было. Наверное, сейчас разбираюсь в механиках языка на уровне чуть ниже среднего (как мне кажется) - это STL, ООП, немного шаблонов и лямбд. Но всё это теория. Есть ли какие-либо протоптанные дорожки постижения плюсов на практике? Какие задачи стоит решать для увеличения опыта в разработке на C++? Уж очень мне понравилось программировать и я хотел бы в этом развиваться, книг я набрал, но в каких областях стоит начать применять полученные знания?
Нынче машин лёнинг актуален. Вкатывайся, распознавай образы.
Ошибаешься дружок пирожок.
А смысл? Слишком дохуя всего, а мне хватит и map<string, string>, которые уже в 98 есть.
Для практики можешь попробовать LeetCode. Говорят там неплохо
Выбор в пользу 14-17 очевиден. Даже если тебе понадобится только map, то в процессе изучения ты попутно узнаешь(а может и попробуешь и тебе понравится) вещи которых нет в 98
Это какие, например? С ООП я не дружу и не понимаю его, так что практически все нововведения для меня отпадают.
Внезапно, далеко не все нововведения направлены на ООП.
Набери в гугле про 11-14-17 стандарты, почитай краткие выдержки (я вообще впервые на хабре наткнулся на короткое статьи) и почитай.
Ну, ООП со времён 98 не изменилось, а так - умные указатели, move- семантика, thread'ы из коробки, лямбдыхуямбды....
Я написал делегат и модель для ListView
В делегате у меня круг, текст внутри круга, текст под кругом и тултип. Пытаюсь добавить элементы с включенным spacing, но вообще ничего не добавляется. ЧЯДНТ?
Нет, но я уже тупо начал перебирать
В качестве делегата у тебя корневой итем без размеров. Попробуй задать ему размеры, а военному ректанглу стелать анчорс.филлпарент
layoutDirection: "LeftToRight"
orientation: "Horizontal"
А так должно вообще работать, со строками, а не элементами енумов?
обкомпилился
Создайте шаблон класса Stack и заполните его четными числами. Создайте шаблон класса Stack1 и заполните его нечетными числами. С помощью итератора объедините эти контейнеры в вектор.
1. Создаёшь шаблон класса Stack
2. Заполняешь его экземпляр четными числами
3. Создаёшь шаблон класса Stack1
4. Заполняешь его экземпляр нечетными числами
5. С помощью итератора объединяешь эти контейнеры в вектор.
Как я шаблон класса числами заполнять буду?
> заполните его четными числами
Что-то никогда не задумывался, если мы берем какой-то плюсовой контейнер (вектор например) и начинаем его заполнять четными числами то когда ошибка будет? Когда вообще все доступная (скажем 16 гб) оперативная память кончится (с поправкой на фрагментацию) или там есть какие-то технические ограничения которые раньше сработают?
Естественно подразумевается 64 битная система.
сегодня в рубрике задаем вопросы стаковерфлову через двачь
https://stackoverflow.com/questions/3813124/c-vector-max-size
Тупо в текст едите? Он может в html, показывать таблицы и т.п.
Что мешает использовать деление\умножение?
Спроси препода. Спроси друзей. Спроси старшекурсников, которым этот вариант попался.
интересное задание с учетом того что контейнерные адаптеры не имеют итераторов
https://pastebin.com/VJyyMxrW
Такой вопрос: Сколько лет надо тренировать-тренировать-тренировать навыки С++ одиноко в горах как мастер каратэ, чтобы суметь найти удаленную работу джуниором за дошираки и кипяток? Если хотелось бы научные вычисления делать.
Пару-тройку точно
Масутацу Ояма в фильме такой няшка, а в жизни это был лысый кабан, который убивал быков кулаком.
ну давай, найди хоть 1 вакансию джуна-удаленщика, на которую можно устроиться, будучи резидентом РФ.
Мне предлагали работать на qt на зарубежную компанию удалённо, но я уже работал в блокчейн-стартапе.
"другой петушин-кун"
Насколько понимаю, да. Я проходил предварительный этап отбора на их сайте и собеседование в скайпе, когда ещё не работал в стартапе. Эйчар сказал, что доволен, но не прислал оффер. А связался со мной через несколько месяцев, когда я уже работал. Они писали системы удалённого контроля персоналом и видеонаблюдения.
ну, думается мне, что ты себя недооцениваешь.
>Для научных вычислений сильные плюсы не нужны
Лол
>>387817
>А какие-нибудь йоба шаблоны используются там?
Да. Повсеместно. Открой eigen какой-нибудь. Там сплошная магия на expression templates. Или pcl, там буст обмазанный ейгеном, обмазанные еще десятком либ, и все обклеено шаблонами для нажористости.
Может кто-нибудь сказать какую библиотеку юзать (может даже кто напишет пару строк кода) для чтения веб странички.
Вот я, например, в опере и любом браузере могу просто смотреть "исходный код страницы", и я хочу так же просто, имея адрес страницы (чтобы https поддерживало только) тупо получать в символьный массив весь вот этот текст со всей разметкой и не нужной лапшой без выебонов, чтобы дальше уже без проблем можно было это парсить и сохранять в файл, если понадобиться.
Короче то что в браузере делается нажатием кнопок ctrl+u, я хочу автоматизировать для считывания самой программой, чтобы не копировать каждый раз как бухгалтерша кучу текста мышкой и все на c++, поскольку маломальский опыт только на нем есть.
Curl ставил, он мне пару строк показывал, вместо около 7000, и типо все. Было бы неплохо если кто-то просто своим опытом поделился даже, а не просто знанием необходимых библиотек, хотя рад буду всему.
в
libcurl достаточен, вполне вероятно, что ты делаешь что-то не так
На сишарпе делается парой строк. И в отличие от говняных браузеров, можно слать нахуй сертификаты, чтобы любые считались как хорошие и всё качалось без проблем.
надо что-то начать делать
> Может кто-нибудь сказать какую библиотеку юзать (может даже кто напишет пару строк кода) для чтения веб странички
Можешь через curl скачивать или через wget
curl -s -X GET $url
wget -q -O page.html $url
Вот этой тулзой можешь выдирать инфу со страниц https://github.com/EricChiang/pup
Она же может и в json конвертировать результат с которым можешь работать дальше как захочешь
Небольшой тутор http://www.compciv.org/recipes/cli/pup-for-parsing-html/
ну, дзен заключается в том что метапрограммирование на крестах используется для кодогенерации
соответственно, если у тебя есть какие-нибудь задачи кодогенерации, то можно их попробовать решить с использованием шаблонного метапрограммирования, а не олдскульными макросами или внешними препроцессорами
как то так
алсо, щас все проще и понятней стало
почти не нужно использовать рекурсивное инстанцирование, sfinae для условных конструкций и прочие функциональные трюки что мозг выносили раньше
на крестах ты тоже можешь написать, если дело будет происходить в винде, используешь ie com automation
но таки проще щас плагин на js к хрому или лисе написать
Я хочу поменять местами данные в шаблонной функции, вот я это и делаю.
template<class T>void kek(T &a, T &b)
{
T tmp(a);
a=b;
b=tmp;
}
То есть я просто два раза вызываю оператор= и один раз конструктор копирования, ничего страшного.
А теперь представим что сюда будет подставляться йоба класс в котором хранится хитрая структура данных там дерево какое-нибудь по указателю лежит и соответственно операция присваивания очень дорогая.
Получается сначала будет супер долгое копирование, а потом два супер долгих присваивания, да ещё и долгий деструктор для tmp. Как мне сделать чтобы вместо этого просто вызывался оператор копирования с переносом? Вот если бы это был конкретный класс то я бы мог просто
сделать
void kek(Dada &a, Dada &b)
{
Node * root = b.root;
b.root=a.root;
a.root=root;
/...
}
И именно это же и делает конструктор копирования с переносом или оператор присваивания с переносом. Только как мне его запустить?...
Гугли "template specialization". Суть в том что у тебя может быть шаблонная функция, но в довесок к ней еще и несколько альтернативных реализаций под конкретные типы для которых не подходит базовый шаблонный вариант.
То есть в любом случае придётся под каждый хитрый тип данных отдельную реализации писать?
Просто я подумал что было бы круто если бы я в итоге мог сделать например
std::vector<int> v1;
std::vector<int> v2;
//...
swap<std::vector<int>>(v1, v2);
без определения специализаций
и всё - внутренние данные v1 и v2 поменялись местами.
Вообще, даже стандартный автоматически генерируемый оператор присваивания, который просто почленно копирует поля, сделал бы то что мне надо, но проблема в том, что он же в 99% случаев уже переопредлён в подобных классах, как и в этом же std::vector, поэтому я к нему доступа не имею(или имею?).
Спасибо, похоже то что надо.
Ебать я счаслив, я кажись нашел решение, или по крайней мере приблизился. Какой-то пиндос спрашивал за проблемы с подключением через https, ему ответили.
даже жалко, что сейчас в большинстве случаев удобней использовать лямбды стало
>>388032
щас с новой мув семантикой это делают по другому
ф-я swap реализуеются как принимающая универсальные ссылки, а классы, объекты которых будут обмениваться своим внутренним состоянием через эту функцию, должны реализовывать мув-конструкторы и мув-оперторы присвоения
все просто
на самом деле std::swap примерно так и написан (чуть сложнее на самом деле), а все стандартные контейнеры щас с мув-конструкторами и операторами присвоения
>То есть в любом случае придётся под каждый хитрый тип данных отдельную реализации писать?
ты же можешь std::swap воспользоваться, зачем тебе свою функцию писать? но надо реализовать для твоего класса мув-конструктор и мув-присваивание
НО на самом деле ты можешь написать и специализацию для своего класса, если у тебя в интерфейсе класса будет ф-я swap, которая работает эффективней
так собственно, и в стандартной библиотеке сделано - у swap 9 перегрузок для стандартных контейнеров есть, которые вызывают внутренную функцию swap
тем более, все равно для сложных классов приходится делать функцию swap, тк с ее помощью удобно реализовывать конструкторы и операторы присваивания
Вот записано у меня там данных на 1кк байт, какова вероятность что каждый информация будет считана ровно на этот 1кк байт без потерь? Или это зависит от старости моего жесткого диска? Возможны ли ошибки и как их устранять, если возможны, есть что почитать?
([-. ])? от ([-. ]?) чем отличаются?
у меня в книге явная опечатка, но оба варианта работают вроде как одинаково
Это скорее в тред по базам данных нужно, они там по этому как раз должны быть спецы.
El. Psy. Congoroo
как я себе представляю: вот есть такая практика, что классы начинать с большой буквы, а экземпляры этих классов - с маленькой, и тогда их можно отличать друг от друга
но для большинства stl-сущьностей все равно нужно указывать типизацию, тк это шаблоны, поэтому и сделали с маленькой буквы
а стилей кода много разных, все они, правда, получаются некрасивыми, самий уродливый, наверно, их всех, это тот который страуструп придерживается, лол
а так ты все равно будешь следовать стилю кода тому проета, к которому присоединишься
но есть к примеру, у гугла свой стиль кода, у qt, у саттера в книжках (один из самых симпатичных для меня)
выбирай..
Обычно придерживаются стандартов крупных компаний. Поищи google/mozilla coding guidelines. На винде можно в vs настроить форматирование под один из популярных стандартов. На линукс/мак можно через clang.
Зависит от надёжности носителя. Можешь хранить несколько копий и контрольную сумму. Если совсем параноик - делай raid массив.
компилирую ебучий приветмир через консоль g++, а эта хуйня мне выдаёт экзешник на 15 мегабайт. шо за хуйня, чому так много?
тип файла не поддерживается, не могу скинуть
это даже не привет мир, а пустой мейн на 14.5 мб , ахуеть
может быть его так дебаг надувает?
С iostream 47кб, с stdout 37кб, у него какой-то компилятор ебнутый просто
Лол, тебе в реверс-инженеров тред. Чтоб там пояснили, чего в твой екзешник налинковалось.
Аноны, пишу в файл через fprintf. Мне нужно записать строку вида:
Fri Apr 26 15:03:22 2019 {
Первую часть я пишу так fprintf(data, "%s", ctime(&_daterow));
Но как записать еще символ "{" без перехода на следующюю строку ? fflush который мне советует гугл не помог
>fprintf(data, "%s {", ctime(&_daterow));
Первый пик
>fprintf(data, "%s {", "ctime(&_daterow)");
Второй пик
Спасибо, дошло как это работает, но, похоже, именно с ctime(&_daterow) все равно хуячит переход...
Почему много? Мало же. Там под капотом много выполняется без твоего участия, ну и у компиляторов, как часто у софта, есть свойство жирнеть. Новые версии либ жирнее старых и дефолтный экзешник получается больше. Бери как можно более старый компилятор если хочешь маленький размер.
Какая-то хуйня у тебя. Сейчас проверил, g++ через msys2 делает 142 кб экзешник.
Description:
"ctime" converts a time number into a string giving the corresponding date and time. The string has the format
Wed Apr 20 15:32:40 1983\n\0
Таким образом пофиксил так:
char s = ctime(&_daterow);
(s+24) = 0;
В приницпе можно было через setprecision, но тащить iomanip, ну его нахуй.
а хуи ты поправил?
ну суть в каменте строки короче
Кек. Ну, в консоли бы это сработало, кстати.
А почему ты через fprintf пишешь, а не через ofstream?
Никогда бы не подумал, что fstream - не прямая работа с файлами.
Или ты какие-нибудь микроконтроллеры прогаешь, в которых std нельзя использовать?
Я думаю тому анону не надо пересказывать ТЗ.
Проще было бы ознакомиться с ним самому, а не в пересказе.
Оно того стоит, полезная вещь? С чего начать?
А то выглядит с виду как просто нагромождение кучи всего и создаётся впечатление что проще под конкретную задачу специальную библиотеку найти, чем это всё прикручивать.
Буст обычно просят знать если есть куча легаси говна 10+лет, которое лень переписывать и нужно хотя бы понимать, как оно работает
Хотя есть и полезные штуки, которые активно используются, например boost.hana или парсеры ихние
А там где не легаси говно чем пользуются, чтобы дополнить стл(по части работы со строками особенно интересует)?
юзай std::swap
>по части работы со строками особенно интересует)
Да тот же qt. Там есть все что можно придумать, если только тебе не какой-нибудь rope нужен.
буст невозможно изучить полностью, это гигантская куча абсолютно разных библиотек. Выучи СТЛ полностью, сначала.
если для себя, то это тот же буст, стл он не дополнит, а заменит, если заешься объекты туда сюда гонять
ну мне решение на плюсах нужно написать, 300 страниц шлее усвоить не успею, мб есть что то более практичное из туторов? могу забить конечно и написать консольную хуйню, но интереснее сделать с интерфейсом.
ну я именно про разобраться, ни разу с Qwidgets и тд. не работал.
https://doc.qt.io/qt-5/qtqml-cppintegration-topic.html
Поздно плюсы учить - пиши код. В процессе всё равно перепишешь, и не раз.
так я закончу с лабами по плюсам и начну жабу, просто консольные приложения 2 года писать заебало ужасно, интересно что то новое попробовать. Спасибо за ссылку, чекну ещё на ютубе мб что то есть.
жаба мне онли для того чтобы не пойти работать на завод "интеграл", а попробовать пробиться в ерат на 3-4 курсе.
Ясно. Ты студент непту_а_бгуир?
Хочешь чуть-чуть личных наблюдений? Те, кто учил cpp на третьем курсе уже рубили капусту, те, кто учил жабу по полгода ходили на курсы ерата и ещё полгода сидели у них в лабе, а потом полгода работали за копейки. до сих пор работают за копейки
мимо отчислился с последнего курса, ни о чём не жалею
у меня нет внутри коммерческого гена что-ли, ну тоесть я в группе остальным 18 челикам делал лабы за спасибо весь год, убивал по 8-9 часов на каждую лабу каждому челику, просто было со своих денег брать как то не оч. ну я долбаёб короч. И нет, даже не в минске, это гомель, тут кроме ерата есть iba, но шот аксиома эскобара в действии.
>рубили капусту
моя проблема в том, что я на самом деле и не знаю где можно такую подработку найти, если подскажешь пару ресурсов и в сторону чего оставшееся время развиваться, буду очень благодарен.
У нас плюсовики с прикладной математики занимаются байтоебством на галерах либо в рога и копыта педалят легаси, и все за копейки. Чеды-джависты с программной инженерии в модных стартапах под ведро пишут за нормальные деньги.
мухосрань
Вопрос, какой обычно аргумент используется для обозначения опции ввода с клавы в cli приложениях ?
Подработку кодером ты не найдёшь, но в какую-нибудь мелкую контору на полставки вполне. Только не унижайся и не работай бесплатно, двух+месячные стажировки тоже нахуй, хотя испытательный срок два месяца - это нормально, только не бесплатно.
Составь грамотно резюме, не ври в нём, не собеседовании всё равно скорее всего вскроется. Ну а изучить стоит наверное Professional C++ Development 4th Edition и C++ core guidelines, ну и задачки на каком-нибудь hakerrank порешать
ну это скорее всего не скоро, я ток наследование понял, ещё гора вещей которые нужно знать, главное блять просто как то победить ебучую лень, самое сложное в этом всём.
Какая лень, если ты пиздогруппникам делал лабы за спасибо? Тут не время нужно, а систематическое повторение
ну перед одногруппниками был груз ответственности, короче нужно воспитать себя как то, заебалось, что каждая попытка сесть за код, сводится к тому что я не знаю какие задания повыполнять интересные и сажусь катать во что нибудь, буду это исправлять, спасибо за разъяснение!
микроконтроллеры еще, асу, софт для приборов - тоже копейки
геймдев еще - копейки
крестовики, в смысле
500-700 баксов..
За геймдев в рашке нормально платят, но отрасль специфичная и имхо не очень приятная. Вообще не знаю, как найти интересную (не легаси, не эмбед) и оплачиваемую работу на крестах. Вся движуха сейчас в мобилках и вебе, а там кресты почти не нужны (если не считать исключительных примеров уровня применения функциональных языков в энтерпрайзе)
Ты забыл посчитать примеры где сам решаешь на чем писать не от хорошей жизни, впрочем, не на ГОвне же в самом деле - так что выбора нет
> Вопрос, какой обычно аргумент используется для обозначения опции ввода с клавы в cli приложениях ?
Можешь ознакомиться
https://it.wikireading.ru/29002
Под винду - WinAPI. Даже устанавливать ничего не надо, правда заебешься на этом писать. А если нужно что-то кроссплатформенное, то есть FLTK из легковесного, но выглядеть все будет как говно.
1 2 3 4 55 224 2 4 5 6 ... Нужно выводить эту строку в столбик с фиксированной шириной, если элемент не входит, то переносить его часть на следующюю строку, если на конце пробел (то есть строку завершает пробел) игнорировать его и начинать выводить следующюю строку.
Пиздец, уже всю голову сломал как это лучше сделать
Вот мои попытки
//strlen(stroka.c_str())%10==0?stroka.append("\n"+to_string(element)):stroka.append(to_string(element)+" ");
strlen(stroka.c_str())%10==0?stroka.append("\n"):stroka.append("");
stroka.append(to_string(element)+" ");
Сложность еще в том что строка каждый раз выводится в цикле в котором к ней добавляется очередной элемент.
Жаль. А то вот есть например пикрил - выглядит нормально(не считая того что нету адаптации под масштабирование винды, лол) и весит всё вместе 362кб, но это для шарпа с .нет фрейворком. Неужели для С++ вообще ничего подобного нету?
Ну это из-за того, что дотнет фреймворк уже установлен на компе юзера где-то в недрах системы. В принципе, тоже самое можно сделать, например, с Qt, т.е. сам экзешник будет весить мало (несколько десятков килобайт), но библиотеки, требуемые для работы весят довольно много (но их также можно установить куда-нибудь в недра системы и их не будет явно видно).
Так, я придумал как все сделать, но мне нужно знать:
Можно ли сделоть printf("10 символов начинаяя с такого - то", stroka.c_str());
Почему бы не написать логику на плюсах, а фронт на C#?
Ну тогда твой единственный выбор это хуярить на winapi. Удачно поебаться, лол, но зато экзешники будут весить максимально мало.
Мне нужно чтобы строка из цифр разделенных пробелами выводилась столбиком более менее фиксированного размера, при этом цифры могут быть разной длинны.
Грубо говоря мне нужно вывести первые (для примера возьмем фиксированную длину в 10 символов) 10 символов строки, потом следующие 10 символов уже после "\n" и так далее.
Самый простой способ это разделять цифры не пробелами а '\t'. Соотвественно если у тебя стандартный терминал на 80 символов то после каждых 10 чисел проставляешь '\n' вместо '\t'. Ну и числа должны быть неболее 7 разрядов, иначе все поедет.
string str;
for (int i = 0; i < 20; i++)
{
str += to_string(rand() % 10000);
str += ' ';
}
cout << str << endl << endl;
int maxlen = 15;
int curlen = 0;
for (int i = 0; i < str.length(); i++)
{
cout << str;
curlen++;
if (curlen >= maxlen)
{
if (str == ' ')
{
cout << endl;
curlen = 0;
}
else
{
if (curlen % maxlen == 0)cout << endl;
}
}
}
string str;
for (int i = 0; i < 20; i++)
{
str += to_string(rand() % 10000);
str += ' ';
}
cout << str << endl << endl;
int maxlen = 15;
int curlen = 0;
for (int i = 0; i < str.length(); i++)
{
cout << str;
curlen++;
if (curlen >= maxlen)
{
if (str == ' ')
{
cout << endl;
curlen = 0;
}
else
{
if (curlen % maxlen == 0)cout << endl;
}
}
}
Логичнее было бы наоборот. Если ты передал в параметрах запуска имя файла, то считываешь из него, если ничего не передал, то считываешь с клавиатуры.
http://lazyfoo.net/tutorials/SDL/13_alpha_blending/
И блин не пойму, как раскидать один файл по нескольким, у меня либо линкер ругается, либо циклические инклуды
>C. В программе должен быть создан визуальный интерфейс.
Что имеется в виду, CLI визуальный али нет ? Вроде прямо -- графический не сказано же.
Терминал это тоже абстракция графического(визуального) интерфейса, ссы преподу в лицо.
Или на практике обычно делают в виде одной функции - пик2? А то ведь это менее эффективно, потому что будет вызываться на 1 перенос больше в обоих случаях. Разница конечно наверное ниочём, но тем не менее.
Ассемблерный листинг сперва посмотри, оптимизатор хуев.
А какой смысл? Самое полезное оттуда включили в стандарт, а качество кода там максимально сомнительное временами, так что чтение исходников того не стоит - с использованием же по пути разберёшься.
Для imgui нужно ещё что-то, что будет за него рисовать - если брать полностью самостоятельные фреймворки, то из легковесных есть FLTK, но он страшненький и устаревший в плане концепций (я про вёрстку и прочее).
На практике смотрят, что у тебя размер структуры сопоставим с размером указателя (надо бы на поля посмотреть, чтобы наверняка), так что перемещение жизнь лучше особо не сделает.
Пишут шаблонную функцию, где в качестве параметра универсальная ссылка, а внутри функции std::forward. Что-то такого: https://gcc.godbolt.org/z/5obK4Z
Анон, я жопой читал, и мой совет может тебя поставить на долг. Написанно же
>Создайте в программе
Можешь сделать джавой через Javax окно, и нативно в него закрутить крестовые методы
Смотря для чего. Интерфейсы бывают программные и пользовательские. Программный интерфейс не визуальный, а интерфейс пользователя всегда визуальный, ведь человек общается с компьютером посредством зрения.
Если у тебя речь идет об интерфейсе пользователя, значит нет смысла говорить про него "визуальный", он и так такой в любом случае, а значит под этим словом подразумевается графический.
опять трабла с интерфейсом на qml.
Тупо не отображается все ListView/GridView
кутешные долбоебы сверху, тот самый вид быдла, тянущий вилки по сипп вниз с каждым месяцем.
С чего ты ахуел, дырявая маня? Ах да, ты же студент-долбоеб дрочащий кутешку и не знаешь, что принтфом можно форматить стринги. Нахуй иди уебан. Я твою мать ебал, кстати.
> ведь человек общается с компьютером посредством зрения
Нет. Это я получаю информацию от компьютера посредством зрения (и слуха ещё).
А с компьютером я взаимодействую, обычно, с помощью клавиатуры и мышки.
Гугли какой-нибудь mathjax или его аналог для с++
знаю конечно, залётная дура, но нахуя мне на плюсах систайл юзать, ты жирное прыщавое чмо, которое обожает байтоёбить и дрочить на фурри?
нинужно
Ебать, я думал ты просто студентишка позорный, который нихуя не учил и просит помощи потому что ничего не знает, а ты долбоеб который учил и не может строку отформатить.
ЙА ТОЖ АХУЕЛ НО РИШИЛ НИЧИВО НИПИАСАТЬ!!!
Быдло ебаное, сука.
У меня выходные, долбоеб, могу валяться и со студенто-быдлом общаться сколько хочу, соси хуй
ухх гомопетухи-долбежники)))
>Сап, есть вариант с помощью чего написать математические формулы в qt?
используется тот же подход что и во многих генераторах математических выражений в вебе, а именно сама формула задается в tex формате, далее вызывается tex, которой генерирует это в картинку, далее картинка выводится на страницу (в твоем случае на холст или куда ты там в qt хотел отобразить)
несомненно, это геморно с той точки зрения что tex не имеет апи как такового, то есть его нельзя использовать как шаредбиблиотеку, на линуксах придется тащить с собой зависимость от пакета, если нужна кроссплатформа с виндой, то еще больше еботни будет
альтернативный подход требует еще большего геморроя: а именно использование mathml, а дальше чтобы эта формула рендерилась кутешным встроенным веб-движком
большой плюс этого решения, что в результате будет форматированный текст, а не картинка, и даже можно настроить что при выделении-копировании этой формулы в буфер обмена сохранялось xml-mathml представление, что вообще охуенно в некоторых случаях
хотя может я зря тут расписываю, и тебе нужно всего лишь вывести несколько статичных формул (которые не изменяются)
тогда их просто генеришь заранее через tex и встраиваешь в виде картинок на формочку, это то просто, рас плюнуть
а вот когда формулы меняются во время работы программы, то тут геморроя на порядки больше чтобы их только отобразить
ну а встроенный редактор математических формул - это уже rocket science
https://electroandi.ru/toe/metod/metod-konturnykh-tokov-reshenie-zadach.html
Сейчас попробую объяснить, нужно вот это решение отобразить, только с числами которые вводит пользователь в формочки, тоесть из решения меняются только цифры в формулах, сами формулы остаются теми же.
И ещё, это решение сгодится для сдачи лабы по "КЛАССАМ", я бы говна вьебал смотря на формулы в терминале, поэтому полез туда, где я ничего не знаю, и тут вроде как в мейн файле никакого класса создавать не нужно и все действия я распишу в функции "когда нажата кнопка", так? не до конца ещё концепцию понял.
сенкс
нет смысла учить кучу языков программирования, тем более, что до готовности писать прод на крестах пройдет годика 2. Лучше стать полноценным специалистом в чем-то одном
Зачем тебе вообще что-то? Вставь картинки и не парься. На крайний случай можешь <sub> и курсив применить
так цифры нужно в формулках менять, согласно заданным, я могу например вставить текст например 45I1, 45 могу текстом хуйнуть в зависимости от данных, а I1 картинкой. но это будет уже когда не смогу нормально всё сделать.
А что по-твоему нормально? Вариант с картинками выглядит самым годным, нечего выдумывать какие-то костыли с TeXом
нужно много знать из кодинга, кресты - самый сложный язык из мейнстримовых, а на нем чаще всего в геймдеве сидят, постоянные переработки, авралы перед выпуском, и все это за более чем скромную зарплату, конкретно джуны работают за еду буквально - те зп им выставлятся ровно чтобы снять комнату в общаге и не сдохнуть от голода
>какие подводные?
лютейшая конкуренция
да, на одно годное рабочее место прилетит не 500 резюмех в первые два дня, а 50, но среди этих 50 будут монстры с 20ти летним опытом работы либо вчерашние выпускники, дрочившие кресты и олимпиады всю учебу
на самом то деле, если ты и вправду кресты на уровне спокойного понимания и применения библиотек буста знаешь, то без проблем в геймдев перекатишся (с просадкой в зп, само собой)
только нахуй тебе это надо?
Математическое образование есть, плюсы вроде задрочил до неплохого уровня. Так у меня и на текущей работке авралы. Ну мне особо большая зп не нужна, на старте соглашусь на 70к.
>>391067
Хочется попробовать чего-то нового... думал вообще на другой язык перекатываться. Игрульки вроде интересно делать.
Посмотри Handmade Hero да сделай сам
>std:
>std:
Поясните зеленому. Нахуй это писать, если можно вначале вставить using namespace std;
Можно. Просто в std много банальных слов забито, а это может быть неприятно.
1) Чтобы другой похроммист, читая код,сразу понимал, что используются стандартные средства.
2) Для избежания возможных конфликтов имен. Если в проекте используются другие либы, там тоже могут быть функции с названиями, совпадающими со стандартными.
Кстати код здесь странный. Передается rvalue как параметр, а потом кастится опять же к rvalue (std::move) шо шо
Если это убрать то оно будет преобразовано к lvalue и будет вызвано присваивание.
Оно передалось в функцию как rvalue, да, но теперь внутри setglobal у объекта s появилось имя, и s ведёт себя как обычная переменная (то бишь lvalue). Мы хотим сделать move assignment для переменной global, поэтому мы ещё раз делаем move(s).
фак, щас проверил, всё рили как ты сказал)
double fyt, dol;
cout << "Введите сумму:";
cin >> fyt;
dol = fyt + 0.487;
cout << dol;
Надо чтобы когда вводишь сумму, например 4, и чтобы он 4 раза прибавил 0.487.
помогите
Блять, ты не можешь 0,487 умножить на 4?
>авралы перед выпуском
Что вообще может срочно перед выпуском потребоваться от программиста? Фичекат разве что, но ломать - не строить.
Сейчас же весь геймдев упирается в контент.
ну миллион обьектов создавать для каждой строчки и скрина шот по обезьяньи
подставь вместо 4 переменную. не сдавайся, у тебя все получится!
ну, у меня честно купленный МК11 так и не заработал, например. Даже после патча.
Блин, ну если погромист годами писал бажный код, то наверное не стоит удивляться, что рано или поздно с него за эти баги спросят. Что мешало ему заранее об этом подумать?
Все таки здесь программисты хуевые, а не геймдев злой.
на этот вопрос нельзя ответить. С++ просто быстрее, но очень сильно зависит от задачи. Если у тебя крошечный клиент какого-нить IO, то выигрыш от плюсов будет незначительным, т.к. тормозня будет на IO. А если у тебя какая-нить числодробилка - то сильно быстрее.
с++ - быстрый как понос, программисты на крестах резкие как пуля
Легко! Они консольные были!
перед релизом любой игры, даже дженерик срани под мобилку, ключевые разрабочкики вьебывают по 12 часов в сутки и без выходных
в 100% проектах
алсо, щас геймдев перепрофилируется на такую хрень как "игра как сервис", это означает что к игре непрерывным потоком идут патчи, новый контент и все остальное
те пока игра приносит прибыль, ее доят
для разработчиков же выстреливших проэктов все это превращается в непрерывный аврал
Это поделие еще хуже g++, оно не умеет в кириллицу я уже час не могу понять, какие еще команды, галочки и т.д. нужно поставить, чтобы Гейтс понял, что мне нужна кириллица
iostream или stdio или conio.h
Погугли, но те две функции которые я написал - 100% избавляют от твоей проблемы, проверено мной когда я час ебался и не мог понять почему у меня буква ё не пишется.
Реально помогло, спасибо. Только вторая называется SetConsoleCP(1251)
Не показывает отличные от нулевого элементы массива объектов как собственно объекты.
clion, но нада платить денежку
Задача:
1. Парсить папку с кучей видео
2. В одном видео может быть несколько людей
3. Один и тот же человек может быть в разных видео
4. На выходе я должен получать список "человек - видеофайл1;видеофайлХ;".
5. Предварительного сета лиц для обучения нет.
Как это лучше сделать?
Пока у меня получается следующее:
1. Нет ни одного лица в сете
1.1. Обучаем модель распознавания на двух чёрных квадратах
2. Берём кадр1 видео1 ищем лица.
2.1. Пытаемся распознать лицо - получаем слишком большую дистанцию
2.2. Всё ок, мы знаем что у нас в модели только чёрные квадраты, поэтому создаём новую персону (персона1) и апдейтим модель распознавания.
2.3. Берём кадр2 видео1 ищем лица.
2.4. Пытаемся распознать лицо - получаем нормальную дистанцию с персона1 и апдейтим модель. Теперь персона1 имеет 2 фотки и распознаётся лучше.
2.5. Начинаются проблемы. В кадр3 видео1 у нас может внезапно поменяться ракурс лица и оно хоть и распознается как персона1, но дистанция получится относительно большой или у нас может появиться персона2 ещё не внесённая в модель распознавания, но она распознается как персона1 с относительно большой дистанцией. Как обойти этот случай? Как понять - это персона1 с другим ракурсом/освещением или персона2?
3. Но ок, допустим в видео1 у нас только персона1. Открываем видео2. Там может быть как персона1, так и персона2. Но у персоны1 будет новый ракурс\освещение. Как результат мы с примерно одинаковой дистанцией распознаем человека и или будем считать что персона2 = персона1 или что персона1видео1 != персона1видео2.
Как всё это правильно сделать?
Я думаю тебе надо пойти нахуй.
Это в ML тред скорее
Согласен, люблю плюсы, иногда скроллю нулевую, ничего интересного, дай думаю зайду в плюсотред в пр, ну и спустя минуту такая тоска охватывает и закрываю.
Что делать и кто виноват?
Посоветуй книжку/курс по системному программированию где покрывается Windows и Unix.
Это начальные курсы, или для уже квалифицированных?
Если один, то лучше Ютуб и книжки, если два — то так не работает, и надо выбирать что-то одно.
Бля я головой поехал в перерыве, буквы не вижу
Если в общем, про ОС и их теорию, то читай Таненбаума. Про винду, говорят, что Windows Internals хорошая книга.
Даже новый тред создать не могу.
Пните мочуха стереть моё анимешное говно и пилите тред сами.
Массив объявлен как char qdata[] = "";
До цикла он используется только в пик2, да в него что - то пишется и потом он записывается, но как это связано с циклом из пик один -- хуй знает.
успокойся, этот тред перекатывают к 600му псту обычно
Поменял используемый в цикле файл на вообще нигде не задействующийся, ничего не изменилось, разве что { прибавилась хуй пойми откуда опять же.
Во - первых я уже локализировал проблемное место, во - вторых, текстовый редактор что я сипользую так не умеет.
>>392241
>>392231
Так, проблема решена. На первом пике я пишу число в buff, buff имеет целочисленный тип. Стоило начать писать числа (на которые мне, к слову, здесь поебать, я ихтупо считаю) в другой char array как все стало ОК. buff до этого нигде не использовалось, попытался писать без & получил вылет (ожидаемый), так что похоже я неправильно пишу целое число в целое число, ну или что - то еще.
Да, энивей, как это влияет на массив qdata один хуй не ясно.
>когда начинает происходить какая - то необъяснимая хуита,
Когда науку пытаются подменить собственной смекалочкой.
>Какого хуя
Не лезь, блядь, дебил, оно тебя сожрет. Не знаешь - не лезь.
> Во - первых я уже локализировал проблемное место
А итерацию цикла на которой проблема возникает локализовал? Нет.
>во - вторых, текстовый редактор что я сипользую так не умеет.
Ну так нах тебе это говно, используй нормальный.
>пук
Ага, а ты знаешь или так, покушал да и все ?
Тем временем ебаный цикл все продолжает ебать мне мозг.
high_resolution_clock::time_point start = high_resolution_clock::now();
цикл
high_resolution_clock::time_point finish = high_resolution_clock::now();
считаем время
time = (double)duration_cast<milliseconds>( finish - start ).count();
Вылет нахуй, без цикла все заебок.
В цикле выполняется fscanf(mrg, "%i")?n++:false; т.е чтение в никуда.
Если читать куда - то, ошибка пропадает.
Я понимаю что говнокожу/хакерю по полной, но как блядь все эти вылеты и изменения связаны, с какого хуя пускай даже fscan там как - то нитак выполняется она мешает посчитать время между метками (вылет), но если не считать время то все выполняется, при этом scanf отрабатывает как надо. Ну просто рот ебал этого компилятора.
>итерацию цикла
Прблема уже решена, но возникала на первой. Прервать выполнение программы можно и без != по твоему мнению IDE/DE с тонной каши из ненужного для написания простенькой CLI утилиты на чистом C++ кала+мб еще и electron'а.
Ну вот оно, блядь, ну вот какого хуя - то. Строка фиксирующая начало отсчета времени режет массив qdata. Вы можете мне обхяснить ПОЧЕМУ НАХУЙ или нет ?
вообще все, что ты делаешь, кроме изменения уже выделенной памяти, дергает API операционной системы. Даже printf\cout.
Если ты хочешь быть системным программистом, то хочешь-не-хочешь - придется в это углубляться.
Смотря что ты программируешь ofc. Одно дело прикладные приложения, там также своя иерархия в этом отношении. Другое дело какие - нибудь АИС, сами системы как таковые. В общем случае, если твоя программа начинает работать с каким - либо ресурсом помимо самой себя -- ты используешь API, если не системы, так готового фреймвлорка который использует API системы. Прямо изучать API особого смысла нет, появятся задачи -- появится причина загуглить то или иное, все это делается на лету. Знать как устроена ОС, скорее как утсроены типовые ОС нужно обязательно, без этого вообще работать за ЭВМ по идее нельзя. Углубляться там можно до бесконечности, но, обычно достаточно понимания работы с процессором и прочим HW + изучения основных абстракций.
Ну, а ежели ты системный программист, тут и отвечать не нужно, полагаю.
Да, еще можно не изучать API системы если ты пишешь на asm, так как там тебе тупо ПОЕБАТЬ. Порты, хуерты твоя сила.
>>392275
За ответы спасибо, в устройство ОС наверное углублюсь. Решил написать простой p2p чатик с tcp соединением. В итоге оказалось что практически все классы пусть даже не самые сложные для работы уже были готовы, и ощущение что я конструктор по частям собираю, а не программирую, от того такой вопрос и возник
error C4996: 'getche':
#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
setlocale(LC_ALL, "Rus");
int chcount = 0;
int wdcount = 1;
char ch = 'a';
cout << "Введите строкуЖ ";
while (ch != '\r')
{
ch = getche();
if (ch == ' ')
wdcount++;
else
chcount++;
}
cout << "\nСлов: " << (wdcount - 1) << endl << "Букв: " << (chcount - 1) << endl;
return 0;
}
error C4996: 'getche':
#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
setlocale(LC_ALL, "Rus");
int chcount = 0;
int wdcount = 1;
char ch = 'a';
cout << "Введите строкуЖ ";
while (ch != '\r')
{
ch = getche();
if (ch == ' ')
wdcount++;
else
chcount++;
}
cout << "\nСлов: " << (wdcount - 1) << endl << "Букв: " << (chcount - 1) << endl;
return 0;
}
Стандарт тебе дает cin.get() для чтения из потока одного символа, нет - не хочу, хочу писать виндовое говно.
В чем проблема ?
Я рили ненавижу строки и все что с ними связано. Наверное нужно через указатель делать.
Ты пишешь в массив размером один байт. Вот почитай к чему это может привести: https://en.wikipedia.org/wiki/Stack_buffer_overflow
Например сейчас сделал сложения чисел хранящихся в односвязном списке(в порядке с конца) - вродё всё предусмотрел чтобы нигде ни одной лишней проверки не было, ничего лишнего не использовалось, да ещё и порчу исходные данные(использую первый список чтобы лишний раз new не вызывать и если он кончается тогда в конец его вставляю уже нвоые узлы), моё решение занимает 24 мс, это лучше чем 99.91% решений на C++. А в обсуждениях скидывают решения на жаве 1-2 мс(причём 2мс у решений на жаве в топ 97% что ли, т.е. в среднем их решения намного быстрее), и это при том, что их решения мало того что не обходят все лишние проверки условий, так они ещё и не портят исходные данные(т.е. с самого начал вызывают new), а список выделяя для него память(я пробовал также делать - решение становится 28мс вместо 24мс).
Вот например
https://leetcode.com/problems/add-two-numbers/discuss/1182/4ms-11lines-java-solution
(его решения я один в один переносил на C++ результат - 28мс)
4мс, использует деления, одинаковые проверки, исходные данные не портит.
Вот мне поэтому интересно - это просто жава решения на других исходных данных тестируются или JIT какой-то всё оптимизирует в этой задаче?
Уж не знаю, на кой черт тебе этот вопрос задавать в плюсовом треде сдалось, но я в благородство играть не буду, раз ты хочешь через жопу, то держи ответ через жопу:
Отображение f : R² → [0, 255] по правилу (√(x - x0)² + (y - y0))² = k) * c, где k - расстояние от выбранной точки (x0, y0), откуда строится градиент, а c - коэффициент нормирования, чтобы для любой выбранной точки мы попадали в допустимый для RGB диапазон.
наебывают на замере времени, инфа 100%
Если там срр без оптимизаций компилируют, всякое возможно.
По крайней мере -g запросто может быть хуже -O3 в десять раз. (хотя и не в этом случае, я думаю)
Из ассемблера тоже можно дергать API функции, в частности можно делать оконные приложения.
Я скорее о том что asm может работать с ресурсами в и без api системы. Сбросить настройки тогоже биваса например.
емнип:
mov ax, 1010h
mov dx, 70h
out dx, ax
Да, грязно, но можно. И так со многим.
Да, потому что я не знаю как выделить char array неизвестного размера. Говорю же, рот шатал этих строк.
>Зачем тебе сишные строки
Чтобы использовать printf/scanf в различных вариациях (e.g sscanf/sprintf), а их я использую потому что того требует ТЗ.
>Так а на каком ты языке пишешь?
C/C++ по - моему.
В принципе, уже пишу документацию, код таки в релиз ушел.
Их может для этих функций заменить vector<char>::data().
По идее, string::data() тоже может их заменить, но у меня только константный метод выбирается компилятором и не компилится.
Ты можешь уже хоть выдержку из своего тз скинуть, чтобы мы точно поняли, что тебе нельзя в потоки(которые ты используешь) и что тебе запретили использовать std?
cin>>number;
Если во время набора очередного числа просто хуйнуть enter ничего не ввидя, он реально введется (строка сменяется) в терминале и продолжит ждать ввода номера, после ввода числа и поторного нажатия enter число улетает как надо в number, но как заставить cin фейлится если введен тупо enter без чего - либо.
>cin.get() == '\n' не работает
Если вводить пробелы, таже ебатория случается кстати.
Решение довольно кривое, т.к. обычно это никому не нужно. Сначала считываешь из потока в std::string с помощью std::getline, и ее анализируешь:
- если вначале есть пробельные символы, то выкидываешь ошибку;
- если все норм, то создаешь std::istringstream и из него считываешь в переменную.
Этим некроговном никто давно не занимается, даже сам микрософт. Либо дрочи QT, либо всякую ересь типа WinRT
#include <cstddef>
#include <iostream>
struct String {
String(size_t n, char c) : size(n) {
str = new char[n + 1];
for (size_t i = 0; i <= n; i++) {
str = c;
str++;
}
str = '\0';
str = str - n;
}
~String() {
delete[] str;
}
size_t size;
char* str;
};
int main() {
String string = String(4,'A');
std::cout << string.size << std::endl;
std::cout << string.str;
}
#include <cstddef>
#include <iostream>
struct String {
String(size_t n, char c) : size(n) {
str = new char[n + 1];
for (size_t i = 0; i <= n; i++) {
str = c;
str++;
}
str = '\0';
str = str - n;
}
~String() {
delete[] str;
}
size_t size;
char* str;
};
int main() {
String string = String(4,'A');
std::cout << string.size << std::endl;
std::cout << string.str;
}
Ебаная вакаба табуляций наставила.
#include <cstddef>
#include <iostream>
struct String {
String(size_t n, char c) : size(n) {
str = new char[n + 1];
for (size_t i = 0; i <= n; i++) {
str = c;
str++;
}
str = '\0';
str = str - n;
}
~String() {
delete[] str;
}
size_t size;
char* str;
};
int main(){
String string = String(4,'A');
std::cout << string.size << std::
std::cout << string.str;
}
Ебаная вакаба табуляций наставила.
#include <cstddef>
#include <iostream>
struct String {
String(size_t n, char c) : size(n) {
str = new char[n + 1];
for (size_t i = 0; i <= n; i++) {
str = c;
str++;
}
str = '\0';
str = str - n;
}
~String() {
delete[] str;
}
size_t size;
char* str;
};
int main(){
String string = String(4,'A');
std::cout << string.size << std::
std::cout << string.str;
}
String string = String(4,'A');
Из-за этой строки. Почитай на досуге про конструктор копирования, копирующий оператор присваивания, ну и про move-семантику не забудь.
Если коротко объяснять, то в твоей программе вызывается два деструктора, которые вызывают оператор delete[] над одной областью памяти, что по правилам C++ является undefined behavior (UB).
>String string = String(4,'A');
А разве можно так использовать зарезервированные слова? Или оно зарезервировано только если подключать библиотеку string?
Да мне чисто для учебы, освоения принципов хелоуворлдостроения, но в оконном приложении.
Благодарю, анон.
Заменил
String string = String(4,'A');
на
String string (4,'A');
и все равно падает на дестракторе.
char \ yadaun = (char \)malloc(sizeof(char)*cunt);
Это ты так подколол, что winapi настолько уже устарел по сравнению с тем, чем сейчас пользуется, как и описываемое в книге по сравнению с winapi в VS/C++ builder?
Winapi для окошек - да, им вообще уже никто не пользуется напрямую. Winapi для других вещей вполне используется.
Посмотрел повнимательнее, у тебя какая-то хуита в конструкторе написана. Замени на:
String(std::size_t n, char c) : size{n}, str{new char[n + 1]} {
std::fill(str, str + n, c);
str[n] = '\0';
}
#include <algorithm> не забудь. Все должно заработать.
>Решение довольно кривое
Вполне неплохое, по сравнению с моим в итоге:
scanf("%[0-9]s", &element)?({goto next;}):({goto fail;});
fflush(stdin);
Спасибо.
Не, он n + 1 объявил.
>>392557
Ты на n + 1 позицию ставишь \0, возвращаешь указатель на n позиций назад и вызываешь для этого указателя delete[].
Если я не проебался с пониманием того, что ты делаешь, то косяк в этом.
Почему бы в цикле не сделать str = c? И не надо смещать потом указатель обратно.
Ты прав, это главный его проёб. Но он всё равно пишет n+1 символов, и ставит \0 на n+2-й.
Прост хочу прояснить для себя кой-какие вопросики по крестам, что сводятся к си.
Если я возьму книжку K&R, например, там будет все актуально для C++, или есть более специализированная литература?
Сам по себе си мне не нужен, только в рамках плюсов.
Файл main.cpp:
#include "myswap.hpp"
int main() {
int a = 10, b = 20;
myswap(&a, &b);
}
Файл myswap.hpp:
template <typename Type>
void myswap(Type , Type);
Файл myswap.cpp:
template <typename Type>
void myswap(Type a, Type b) {
Type c = a;
a = b;
b = c;
}
___
Ошибка линковщика: C:\Users\...\AppData\Local\Temp\ccwOVCDE.omain.cpp:(.text+0x2e): undefined reference to `void myswap<int>(int, int)'
Если перекинуть определение функции myswap в файл main.cpp, то всё работает.
Возникает закономерный вопрос: "Как объявлять шаблоны функций?.."
Файл main.cpp:
#include "myswap.hpp"
int main() {
int a = 10, b = 20;
myswap(&a, &b);
}
Файл myswap.hpp:
template <typename Type>
void myswap(Type , Type);
Файл myswap.cpp:
template <typename Type>
void myswap(Type a, Type b) {
Type c = a;
a = b;
b = c;
}
___
Ошибка линковщика: C:\Users\...\AppData\Local\Temp\ccwOVCDE.omain.cpp:(.text+0x2e): undefined reference to `void myswap<int>(int, int)'
Если перекинуть определение функции myswap в файл main.cpp, то всё работает.
Возникает закономерный вопрос: "Как объявлять шаблоны функций?.."
Быстрофикс.
>void myswap(Type , Type);
void myswap(Type , \
Type);
>undefined reference to `void myswap<int>(int, int)'
undefined reference to `void myswap<int>(int, \
int)'
Звездочки, не сломайтесь, что б вас.
Быстрофикс #2:
Файл main.cpp:
#include "myswap.hpp"
int main() {
\tint a = 10, b = 20;
\tmyswap(&a, &b);
}
Файл myswap.hpp:
template <typename Type>
void myswap(Type , Type );
Файл myswap.cpp:
template <typename Type>
void myswap(Type a, Type b) {
\tType c = a;
\ta = b;
\tb = c;
}
Ошибка линковщика: C:\Users\...\AppData\Local\Temp\ccwOVCDE.o\tmain.cpp:(.text+0x2e): undefined reference to `void myswap<int>(int , int )'
Я не очень разбираюсь если честно, но по-моему дело в подключении файлов, судя по ошибке линковщика, а не в объявлении шаблона.
У тебя main подключает hpp файл с одним прототипом, а само тело функции находится в файле, который как у тебя не подключен.
Не, ну теперь точно в песду.
Просто верьте, что я нигде не объебался с указателями.
Я на Си прогал с полгода. С указателями всё нормально.
который никак*
Не. Судя по мейк-файлу, myswap.cpp в проекте.
# Project: test
# Makefile created by Dev-C++ 5.11
CPP = g++.exe
CC = gcc.exe
WINDRES = windres.exe
OBJ = main.o myswap.o
LINKOBJ = main.o myswap.o
LIBS = -L"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib32" -m32
INCS = -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include"
CXXINCS = -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include/c++"
BIN = test.exe
CXXFLAGS = $(CXXINCS) -m32
CFLAGS = $(INCS) -m32
RM = rm.exe -f
.PHONY: all all-before all-after clean clean-custom
all: all-before $(BIN) all-after
clean: clean-custom
${RM} $(OBJ) $(BIN)
$(BIN): $(OBJ)
$(CPP) $(LINKOBJ) -o $(BIN) $(LIBS)
main.o: main.cpp
$(CPP) -c main.cpp -o main.o $(CXXFLAGS)
myswap.o: myswap.cpp
$(CPP) -c myswap.cpp -o myswap.o $(CXXFLAGS)
Не. Судя по мейк-файлу, myswap.cpp в проекте.
# Project: test
# Makefile created by Dev-C++ 5.11
CPP = g++.exe
CC = gcc.exe
WINDRES = windres.exe
OBJ = main.o myswap.o
LINKOBJ = main.o myswap.o
LIBS = -L"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/lib32" -m32
INCS = -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include"
CXXINCS = -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/x86_64-w64-mingw32/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include" -I"C:/Program Files (x86)/Dev-Cpp/MinGW64/lib/gcc/x86_64-w64-mingw32/4.9.2/include/c++"
BIN = test.exe
CXXFLAGS = $(CXXINCS) -m32
CFLAGS = $(INCS) -m32
RM = rm.exe -f
.PHONY: all all-before all-after clean clean-custom
all: all-before $(BIN) all-after
clean: clean-custom
${RM} $(OBJ) $(BIN)
$(BIN): $(OBJ)
$(CPP) $(LINKOBJ) -o $(BIN) $(LIBS)
main.o: main.cpp
$(CPP) -c main.cpp -o main.o $(CXXFLAGS)
myswap.o: myswap.cpp
$(CPP) -c myswap.cpp -o myswap.o $(CXXFLAGS)
Ну ёпт, анон. Ты заполняешь в str со сдвигом нахуя именно так непонятно n+1 элемент, а потом возвращаешься на n назад. В итоге ты удаляешь массив не с адресом, например, 0x0000A0A0, а 0x0000A0A1.
Вот это я прозрел, однако.
Если скомпилить шаблон, то в объектнике будет так же пусто, как сейчас в моем желудке...
А чё. Удобно.
Спасибо, анон.
Скомпиль прямо на компе, где показываешь, или положи ucrtbase, vcruntime, msvcrt и остальные зависимости (посмотри через depends.exe) в папку с твоим исполняемым файлом. В крайнем случае посмотри, какой redistributable стоит на том компе, установи соответствующую студию у себя и скомпиль ею.
Технически ты можешь вообще избавиться от CRT, но не для студенческой лабы это дело.
А что не так с VS? там какие-то особенности при компиляции?
Есть ли книги, в которых описываются способы решения этой проблемы?
> Аноны, испытываю сложности с переносом сущностей реального мира в плоскость языка программирования. То есть проблемы с математическим описанием этих сущностей или что тр вроде того.
Ну приведи пример того что ты пытаешься перенести и желательно распиши ход своих мыслей касательно того как бы ты это сделал
Как я понял, C++ Builder в состав RAD Studio входит. А это есть на рутрекере
А зачем тебе именно 7 ?
У них comunity edition сейчас бесплатна (для некоммерческих целей) и с довольно большим функционалом.
В шараге где учусь именно ее юзают, поэтому приходится жрать че дают. Если там все совместимо то ок, спасибо
#include <string>
//using std::string;
int main()
{
string str;
str.~string();
}
error C2300: 'std::basic_string<char,std::char_traits<char>,std::allocator<char>>': class does not have a destructor called '~string'
данный функционал нужен в ОЧЕНЬ РЕДКИХ случаях, и уж точно не в твоем примере, потому-что UB. Зачем ты это вообще мучаешь?
#include <vector>
class MyClass
{
public:
MyClass() {}
~MyClass() { Beep(4000, 10); }
};
int main()
{
std::vector<MyClass> MyVec;
MyVec.emplace_back();
delete &MyVec.at(0);
}
Почему оно не крашнулось еще на delete? И если delete сработал почему деструктор вызывается 2ой раз?!
>не в твоем примере
Я набросал просто по минимуму, чтобы ошибку продемонстрировать.
В книге вызов деструктора выглядит вполне легально: там строка - это член union, сам union завернут в класс.
>Зачем ты это вообще мучаешь?
Ну бля, столкнулся с непонятной хренью, надо же разобраться. Тем более - это последние страницы книги буквально.
> Почему оно не крашнулось еще на delete?
А почему должно крашнуться?
> И если delete сработал почему деструктор вызывается 2ой раз?!
Вектор вызывает деструктор всех своих элементов. Откуда ему знать, что ты вручную вызвал деструктор его элемента? Надо было тогда и из вектора удалить его.
s.~basic_string<char>()
Я понимаю, что книги не могут успевать за стандартами, но в С++17 для данного случая ввели безопасный и удобный std::variant (ну или если невозможно использовать C++17, тогда boost::variant).
например будет выведено:
Путь к файлу: D:\...
и если нажать enter, то это значение помещается в path
>printf, malloc. scanf
>Крестовый тред
Ну ебана. Вам, батенька, в си тред. Здесь суровые крестовики хуярят лямды на шаблонах со сфинае.
Кароче, задали задание, через структуру лист, написать программу по определению в строке десятичных цифр и выносу их. Написал код на работу со строками(шоб слова по отдельности определялись), а вот как определить десятичная ли у меня цифра для выноса не могу понять как
Я знаю про крайнюю плоть, но не пиксели. Что такое растровая область? Битмапа, часть битмапы? Текстура в директиксе? Что?
Область на растровой картинке.
Если непонятно, то можно представить это как массив пикселей. Как для массива пикселей найти пиксели, которые находятся с краю?
Стоп, стоп, стоп, какой еще нахуй границы картинки. Вот картинка, посередине область. Как границы области могут быть границами картинки?
Короче я запостил пикчу и понял. Надо проверять, есть ли по соседству с пикселем другой пиксель с цветом фона. Если есть хоть один такой сосед, то значит наш пиксель - граничный. Только это дебильный алгоритм получится, проверять каждый пиксель области, точнее соседей каждого пикселя, а их будет 8 штук. Если область будет большая, алгоритм будет медленным. Надо как то сократить количество проверок. Может знает кто, как это можно провернуть?
Чего ты хочешь добиться? Получить вектор 2д точек, которые будут границей? Нахуя?
Если у тебя только два цвета, то проще будет каждую строку и брать пиксели которые отличаются от фона (например, первого пикселя)
Построчно не выйдет, тогда крайние верхние и крайние нижние пиксели не попадут в выборку.
К примеру, базовый класс Widget и у него есть какие-то виртуальные функции.
А в качестве наследников будут ButtonWidget, LabelWidget и тд и тп.
Естественно у них будут функции которых нет в базовом классе: Click, SetText и прочее.
Всегда ли нужно в качестве типа указателя иметь базовый класс?
Или можно, допустим, в базовом классе определить несколько виртуальных функций и в наследниках переопределять их и добавлять другие функции (не только виртуальные) при необходимости, если нужно?
Считается ли это каким-то неправильным проектированием?
Операторы Прюитта, Собеля и Кэнни, методы Харриса, Моравеца и SUSAN.
ебись с этим, как я ебался на диплом, зато к получится - будешь собой доволен.
Как я понял, через указатель надо делать только если класс абстрактный с "чисто виртуальной" функцией без определения. То есть тут больше вопрос полиморфизма нежели чем наследования.
Я пробовал уже нечто такое, ругается, что якобы taking the address of temporary object of type, когда я прописываю, на какие адреса должны ссылаться указатели.
Сап, как получить текущую директорию в с++ ?
Гугл выдает 17 версию языка, которая не поддерживается у меня и какие то костыли на си.
Возможно я не правильно гуглю и есть простой однострочный способ получить текущую директорию, как это например в питоне или жаве.
Либо читай про сишный DIR, либо пробуй вытащить из потока результат system("cd").
А вообще, по идее, filesystem доступна не только в 17 стандарте, но и в 14 - правда, это достаточно уебищно из-за отсутствия автовывода типа шаблона.
Попробуй std:: experimental::filesystem::v1 посмотреть, мб у тебя будет. Мне изначально на рабочий комп поставили VS2012, там было это. В общем, удачи, брат - ебаться тебе много придется.
Разбиваешь это уравнение на разные функции.
Например x2k+1 сделаешь одну функцию
Для 4k2-1 другую и тд
Потом это всё комбинируешь в цикле и выводишь результат
спасибо, буду пробовать
> Записывать в файл надо в 16-ричном формате, а числа в программе в quint16.
Записывай по два quint16 в один quint32 или какой там тип
А при считывании "разбивай" quint32 на два quint16
> проверять каждый пиксель области, точнее соседей каждого пикселя, а их будет 8 штук
зачем 8? проверяй 2 или 3 если диагональные тоже считаются граничными.
Все, проблема решилась. Оказывается, он может и quint16 записывать, просто я забыл записывать по одному числу в цикле, и из-за этого он писал хуйню.
Я уже придумал, как это делать, проверяя все 8, но не проверяя каждый пиксель области. Теперь надо придумать, как запилить градиент от какой нибудь центральной точки до границ неправильной области.
Так храни все точки в одном месте и бери их адреса
Да, я видел. Уверен, что это отличные способы, но они слишком сложные для моего случая, когда есть всего два цвета. С двумя цветами можно придумать что нибудь попроще.
Ты в любом случае будешь использовать те же принципы, только изобретешь свой велосипед. Конкретно сейчас ты хочешь SUSAN использовать(оценивать количество рядом стоящих пикселей схожего цвета, а вообще интенсивности, если по-хорошему).
Хочешь просто сделать - бери оператор Прюитта, ебашь свертку и получишь только граничные пиксели после обработки. Собель будет точнее, Кэнни ещё точнее, но сложнее.
Я думаю просто выбирать следующий пиксель рядом с текущим, который соседствует хоть с одним пикселем фона. То есть грубо говоря проверять все 8 соседних пикселя: если сосед белый, соседствует с черным, то переходим на него, а предыдущий вносим в контейнер. Ну и надо проверять, не пришли ли мы к самому первому пикселю, чтобы выйти из цикла.
А это метод Моравеца, брат.
Он сложный самый долгий был у меня среди всех реализованных.
Я тебе говорю, проще в цикле по всем пикселям(т.е. по I и по j) сделать цикл по соседям, в котором умножать интенсивность пикселя на соответствующее значение матрицы свертки(имеется в виду, что левый верхний сосед умножается на число, которое стоит в левом верхнем углу матрицы свертки), собрать результат а переменную, разделить ее на коэффициент нормировки и записать в пиксель.
Описал немного сложно, но загугли, описания алгоритмов есть на том же хабре.
Один ты Д'Артаньян
Cпасибо, в общем я решил пойти по другому пути.
Пздц, чем больше работаю с С++ тем больше удивляюсь что какие то элементарные вещи не сделаны, либо сделаны через пень колоду.
да, дартаньян. может сюда ради бинарного изображения сразу opencv притащить, а то вдруг
Ну давай, предлагай идеальное решение, раз ты у нас самый умный.
Да не все нормально, уже исправил. Слева линейный градиент, справа логарифмический надеюсь, что логарифмический
class Poly_Base
{
public:
friend Poly_Base operator+(const Poly_Base &lhs, const Poly_Base &rhs);
~Poly_Base() = 0;
};
class Poly : public Poly_Base
{
int i;
};
хочу использовать интерфейс абстрактного класса через указатели на него
Poly_Base p1 = new Poly(), p2 = new Poly();
Poly_Base p3 = new Poly(p1 + p2);
френд функшонс ар нот инхеритед
https://stackoverflow.com/questions/3561648/why-does-c-not-allow-inherited-friendship
Вот любую функцию можно смещать относительно координат, верно? Например, арксинус.
Представляем его в виде записи a arcsin(bx−c)+d, где а - амплитуда, b - период, с - смещение периода, d - смещение амплитуды. И вот считаю я значит для своего графика эту формулу, и у меня получается с = pi/2. И из-за этого я тупо не могу посчитать арксинус, потому что внутри скобок из-за этого pi/2 всегда получается число больше 1, а арксинус больше 1 не рассчитывается. И как тогда считать смещение для арксинуса?
почему у тебя радианы внутри аргумента арксинуса? почему у тебя какой-то "период" внутри аргумента арксинуса? ты с тригонометрией не обосрался?
> Арксинус по умолчанию меняется от -pi/2 до pi/2 по Х, и от -1 до 1 по Y
Арксинус принимает значения от -1 до 1 и выдает значения от -pi/2 до pi/2.
>То есть смещенный наверх вправо
Вот так например
https://www.wolframalpha.com/input/?i=asin(x+-+1)+++2
https://ideone.com/C5EMJE
Спасибо, анон.
>френд функшонс ар нот инхеритед
>https://stackoverflow.com/questions/3561648/why-does-c-not-allow-inherited-friendship
Я понимаю что их нельзя перегрузить. У меня вопрос можно ли как то организовать френд функцию абстрактного класса дабы работал оператор сложения?
Вариант с оператором+ членом класса примерно представляю, его можно перегрузить. Интересно именно френд функция
Не обоссывайте,я сильно ньюфаг
>просыпаюсь в 2019
>в 20 стандарт завезли хуйни примерно как с с++98 -> c++11
Ебаать, когда же это все учить
У меня от этой хуйни брат умер рука разболелась. В отпуске заставил себя выдрочить всевозможные сочетания для студии\вима. Сейчас по минимуму пользуюсь, брат воскрес.
shift+ctrl+влево\вправо - выделить слово
shift+ctrl+вверх\вниз - переместить строку
shift+del - удалить строку
shift+end - выделить строку от курсора
Ну и перемещение по файлам тоже хорошо бы освоить, но это зависит от ИДЕ.
>стрелки
Пользуйся православными hjkl, так вообще руку не надо двигать.
Хотя кто бы говорил, я сам в виме стрелками перемещаюсь.
> hjkl
Нихуя неудобно.
Они постоянно "теряются" в остальных клавишах или часто путаю направление.
За это время сделал бы на стрелочках всё что надо.
Даже в стандартном убунтовском pdf ридере функции стрелок продублированы на hjkl. И manpages туда же. И консольный клиент vk. HJKL - это охуенно! Кто считает иначе, тот хуесос
ХЗ. Во многих IDE встроена симуляция vim, еще больше где поддерживатся как минимум доп.плагином. Если IDE не умеет в редактор с цивилизованной парадигмой, то это хуевая IDE. Обезьянья парадигма с единым режимом "для простоты" не считается цивилизованной.
Не слушай ебанатов-некроёбов, в студии и без этого много нормальных хоткеев. Если мало, ищи плагины (например, subword navigation)
Никакие плагины не дадут той власти мгновенного редактирования, которую дает Esc в виме. Пока клавиши с буквами без зажатых альтов и прочего говна печатают только буквы, все очень хуево.
> нормальных хоткеев
Переход к определению функции, например, находится в пизде клавиатуры на F12 или где-то там.
Пробовал. И писал в виме какое-то время.
Да, многие вещи очень удобны, но навигация по коду, переход к определению/реализации функции (особенно что касается виртуальных), цепочка вызовов и тд и тп это всё приходится ебаться и настраивать. В той же студии это уже всё есть.
> Никакие плагины не дадут той власти мгновенного редактирования, которую дает Esc в виме
В виме можно переименовать переменную в рамках функции/класса?
В виме можно переименовать функцию какого-то класса?
Или добавить (убрать) у неё аргумент и чтобы в реализации/определении тоже поменялось?
Это все можно и на vim повесить. Но вот сама техника редактирования кода там непревзойденная.
Согласен. Только очень глупый человек может счесть серьезным занятием использование говноедского видео-терминала. Все настоящие ценители пользуются строчным принтером вместо монитора, перенаправив на него stdout из bash, и довольствуются адекватной последовательной работой с редактором sed. Припадочноя интерактивщина с ненужным перемещением курсора по вертикали - вовсе для душевнобольных, и даже визуализированное перемещение курсора по горизонтали - для гуманитариев, неспособных держать в голове даже одну строку текста, набранную вслепую. Такие люди напоминают школьников, предпочитающих электронные книги бумажным. Экраны - заговор жидов, зарабатывающих на испорченном зрении потребителя. Пожалуй, кончу на этом, чтоб не деградировать от невозможности писать в петровской орфографии за неимением соответствующей раскладки.
Ебанаты из Microsoft сломали студию ещё в версии 15.9, починить собираются только этим летом (тикет написан в ноябре, ответ через пару месяцев, починят почти через год, пиздец)
Нехуй сырое говно качать. Только ньюфани не знают, что у продуктами майкрософт можно пользоваться спустя минимум год после релиза. Ставь 17 обратно.
даже не удалял 17, но сдури мейн проект перевл в 19 обратно ставить начал все очень плохо стало. Да проблему решил с горем пополам пол дня убил
void __fastcall TForm1::Button1Click(TObject Sender)
{
Memo1->Lines->Clear();
int A[4]; int B[5];
int m;
String One, Many;
for(int i = 5000; i < 10000; i++)
{
One = IntToStr(i);
for(int j = 0; j < 4; j++)
A[j] = StrToInt(One[j + 1]);
if(A[0] & 1) continue;
m = i 2;
Many = IntToStr(m);
for(int j = 0; j < 5; j++)
B[j] = StrToInt(Many[j + 1]);
if((B[1] == A[3]) && (B[2] == A[0]) && (B[4] == A[0]))
{
Memo1->Lines->Add("ОДИН - " + One);
Memo1->Lines->Add("МНОГО - " + Many);
Memo1->Lines->Add("");
}
}
}
Что-то вроде не бинарного дерева строк подойдет?
Это копия, сохраненная 31 мая 2019 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.