>>1209043 UB с точки зрения языка - нет, а вот тебя неявные приведения могут запутать, собственно поэтому анализаторы многих современных IDE подсказывают помечать explicit конструктор с одним аргументом.
Еще один вопрос по гигиене ключевых слов (или не знаю, как это назвается, проектирование что-ли)
Есть у меня дерево поиска и в нем Шаблонный метод (паттерн то есть). В самом базовом классе все обходы объявлены как const и фактически они const и есть. Нужно только зафиксировать один ма-а-аленький флажок — он представлен статической переменной.
Зашквар в том, что статическую переменную-то всё равно нельзя менять из const метода, а раз весь обход const, то и его шаблонные методы тоже const. Я выкручиваюсь из этого так: static bool★ flag; Тогда вестимо менять можно, это же не поле, а указатель куда-то наружу.
Я нарушаю какой-нибудь из принципов типа SOLID, когда так делаю, может это ломает инкапсуляцию или еще какие-то есть аргументы против? Интуиция навевает тревогу на этот счет, но опыта прознать самому недостает. Подскажите, допустим ли мой подход или что не так?
>>1209431 В С++ даже специальное ключевое слово до этой хуйни есть - mutable. Правда он только для нестатических переменных, видимо у тебя код особенно ебанутый.
>>1209259 >С++ использует треды, предоставляемые ОС. ОС предоставляет настоящие железные треды Да я уже понял. Но есть другой вопрос. Если я пишу на винде, что лучше использовать, std::thread или встроенные функции для мултитрединга из WinAPI?
>>1209582 std::thread по сути обёртка над винапи (в винде), однако он удобнее, хотя бы тем, что с ним можно использовать лямбды. А вообще если пишешь CLI, то рекомендую перекатиться в раст. Там писать многопоточные приложения гораздо удобнее.
Антоны, начал работать с QT. Встретил в статье подобное объявление: >QScrollArea* scroll = new QScrollArea(); Здесь память выделяется под объект из кучи, да? Но далее в статье не было: >delete scroll Разве от такого не будет утечек? Или QT сам об этом заботится?
>>1210273 delete qtObject; использовать не рекомендуется. Правильно делать так: scroll->deleteLater(); scroll = nullptr; Тогда удаление объекта запишется в цикл событий и он будет удалён когда все текущие события (которые возможно уже затрагивают данный объект) будут обработаны.
Алсо, можно сделать так QScrollArea* scroll = new QScrollArea(this); если создаёшь объект внутри другого QObject'a тогда scroll удалится вместе с родителем и вызывать deleteLater уже не надо будет.
>>1210281 Если используется QML, то при передаче QObject'a внутрь javascript'a по умолчанию за объект начинает отвечать сборщик мусора. Однако если используешь виджеты, либо не передаёшь объект в QML-код, то будет утечка.
Пытаюсь в гуёвые тулзы. Накатываю Нпроклятья. Вопрос, есть некое приложение которое должно выводить постоянно хуйню на экран, и проверять действия пользователя. Как я понимаю я делаю вайл-тру цикл и ловлю нажатия, вызываю по ним функции, а потом запускаю некую хуйню которая по новым данным перерисовывает весь экран. Я так понимаю что это типа событийно ориентированное программирование. Где почитать об этой парадигме и как это принято делать? Алсо, где посмотреть стандарты на форматирование кода, они конечно каждые свои для каждой компании я понимаю, но есть же некий усреднённый стандарт.
>>1210699 Какая платформа? У тебя голый WinApi? Возьми Qt, там всё на сигналах сделано. Читай гайды по тому API, с которым работаешь, а не про парадигмы.
>>1210701 >Какая платформа? Linux пишу под консоль + ncurses.h >Возьми Qt Слишком долго разбираться, я пока в консолечке поплескаюсь, мне понять суть процесса, а конкретный фреймворк уже после.
Прочитал месяца 2-3 назад Липмана страниц 500,дико заебался и забил хуй.Анон,посоветуй какую-нибудь книжку по крестам чтоб шишка стояла и задачки были.
>>1210705 Хочешь консольную аркаду запилить? Я бы на твоём месте сделал 2 треда, один в цикле полит getch() и кидает в очередь события, другой отрисовывает в консольку по событиям от предыдущего треда и может таймеру например. Для этого тебе понадобятся мютекс и conditional variable. Может я херню предлагаю, попробуй поискать либы для твоей задачи.
>>1210714 ой, мне пока до трэдов ещё срать и срать. Я только только ООП закончил дочитывать. Впереди ещё шаблонная магия и купание в STL. Я не знаю даже как прерывания работают, лол.
>>1210721 > кресты не для слабых духом Я тут низкоуровневое легаси говно грёб и впал в отчаяние немного, дикая шизофазийная помесь условной компиляции, ассемблера, ещё какой-то загадочной хуйни вроде подобия самописной ОС, исходников от которой нет и ещё много приколов. А коду 20 лет, там в комментариях прописана дата, лол. 99 год. Просто высказался.
Шарит кто в Qt? Почему я из таблицы могу взять выделенный индекс (currentIndex()), а вот индекс из определённого столбцы и колонки он не берёт (index()?
Анон, вопрос по QT. Есть программа. Она может открываться как в обычном окнонном виде, так и в виде трей-иконки, которая позволяет по клику открыть оконный вид. В программе могут открываться новые QWidget по клику на кнопки.
Код открытия someform = new Someform(privateData); someform->setAttribute(Qt::WA_DeleteOnClose, true); connect(someform, SIGNAL(goodData(QStringList)), SLOT(updatePrivateData(QStringList))); someform->show();
При закрытии форма отсылает сигнал в основную программу и закрывается. Код закрытия emit goodData(privateData); close();
Если программа изначально запускается в оконном виде, то всё работает нормально. Если программа запускается сначала в трей, а затем появляется её окно по клику, то закрытие нового QWidget ведёт к последующему за ним закрытию и основной программы. Код разворачивания оконного вида this->setWindowFlags(Qt::Window); trayIcon->show(); this->show();
Код запуска в оконном виде this->show();
Код запуска в трэй виде this->setWindowFlags(Qt::Tool); trayIcon->show();
Собственно вопрос - почему закрытие нового окна QWidget ведёт в трей-случае к закрытию и основного окна приложения? Как это можно отловить и отладить пошаговое исполнение ничего не показывает?
>>1211256 Наверное забью на то чтобы сделать основное окно настоящим окном после разворачивания. qApp->setQuitOnLastWindowClosed(0); достаточно. Костыли-костылики
Требуется изменить поведение программы при закрытии. Если закрытие идёт через крестик справа-вверху, то поведение одно. Если закрытие идёт любым другим способом, то поведение другое.
В инетрнете предлагают переопределить QCloseEvent, но в этом случае я не могу определить отправителя CloseEvent и сделать вариативное поведение.
Пока, единственный вариант который я вижу - хук на мышь и отлавливание её положения и клика, но это звучит по идиотски. Есть нормальный вариант?
Что-то я так охуел от ваших крестов............ Зачем нужны все эти сложные различные касты? Какое нахуй виртуальное наследование и касты между классами. У меня от звездочек и амперсандов уже в глазах рябит, все равно нихуя не понимаю base-derived нахуй. А exception-safety? Почему такие уебские исключения? Нахуй вы живете?
>>1212016 Он копирует строку начиная с определённой комбинации символов, посмотри просто на вывод идеона и на то, что подают на входу внутри функций. Причём тебе даже два варианта дали на си и на крестах.
Сап двач. Помогите, пожалуйста, с заданием. Написать программу учета заявок на обмен квартир и поиска вариантов обмена. Каждая заявка содержит сведения о двух квартирах: требуемой (искомой) и имею¬щейся. Сведения о каждой квартире содержат: количество комнат, площадь, этаж, район. Программа должна обеспечивать выбор с помощью меню и выполнение одной из следующих функций: • ввод заявки на обмен; • поиск в картотеке подходящего варианта: при совпадении требований и пред¬ложений по количеству комнат и этажности и различии по показателю «пло-щадь» в пределах 10% выводится соответствующая карточка и удаляется из списка, в противном случае поступившая заявка включается в картотеку; • вывод всей картотеки. Хранение данных организовать с применением реализованного вами контейнерного класса set.
Никак не могу понять, как мне реализовать второй пункт задания. Просто совсем идей нет. С меня тонны нефти. ЯП c++. Свой код могу скинуть, но, думаю, лучше на фейко почту
>>1212424 >поиск в картотеке подходящего варианта: при совпадении требований и пред¬ложений по количеству комнат и этажности и различии по показателю «пло-щадь» в пределах 10% выводится соответствующая карточка и удаляется из списка, в противном случае поступившая заявка включается в картотеку; Расскажи попа дробнее и попа нятнее. Картотека в каком виде? SQL-таблица? В картотеке 2 типа объектов - заявки и предложения, так?
>>1212459 Нет. У меня просто бинарный файл. В нём записаны структуры состоящие из целой заявки. То есть там сразу и имеющаяся квартира и желаемая. С этим мне особо заморачиваться не надо. У меня же не серьёзный проект, а просто курсовая.
>>1212465 Ну так а в чем проблема тогда в написании поиска? У тебя есть массив структур 1. Проходишь циклами по структурам, сначала по типу (имеется или требуется), затем по комнатам, потом по этажности, потом по площади 2. Если есть совпавшие результаты, удаляешь их из базового массива, ресайзиш массив, и выводишь совпавшие куда нужно 3. Если нет, то добавляешь. в массив данные своего запроса
>>1212479 Я понимаю сам алгоритм. Я не могу разобраться, как мне сравнивать элементы структур. Если бы я имел дело просто со значениями, то всё было бы ясно, но мне же нужно сравнить элементы структур. Я и не могу разобраться как это сделать. А примеров не нашёл в инете
>>1212495 Да я, вроде, в матиматике более-менее. Но вот в программировании не очень. В том плане, что я немного не понимаю сути указателей. То есть, используя указатель, я же ссылаюсь на структуру. А как из неё мне выделить элементы. То есть, допустим, заполняя таблицу я обозвал свою структуру k. Но тогда все структуры у меня k. Вроде, всё очевидно, и всё зависит от ключа, на который указывает указатель, но всё равно туплю с этим
>>1212506 Если я правильно понял твой код, то ты выводишь просто совпадения отдельных элементов. Да и в любом случае это не то, что мне нужно. Но спасибо за пример
>>1212518 >Если я правильно понял твой код, то ты выводишь просто совпадения отдельных элементов Ты понял неправильно. В цикле сначала сравнивается тип. Если он не совпадает, то переход к другому элементу массива квартир Затем сравнивается комнатность. Если она не совпадает, то переход к другому элементу массива квартир Затем сравнивается этажность. Если она не совпадает, то переход к другому элементу массива квартир Затем сравнивается площадь. Если она не совпадает, то переход к другому элементу массива квартир Если есть 4 совпадения, то заносим совпавшую квартиру в массив совпавших квартир. Переходим к другому элементу массива квартир.
Ещё можно перегрузить оператор сравнения и тогда вообще будет збс. Но по факту то же самое, только красивее
>>1212522 Я, вроде, понял суть. Но блять это всё равно не то. У меня же типо дерево там есть. И надо с его помощью перемещаться. Подобным образом, что у тебя описан, я бы и сам, думаю, написал.
>>1212536 Я не могу использовать почти ничего готового. А тут есть вектор. Плюс мне надо самостоятельно реализовать set. И ещё реализовать "хранение в файле".
>>1212561 Второй пункт. То есть обход дерева со сравнением структур. Удаление я, вроде, понял как делать, но ещё не проверял. Конкретно меня интересует, как обойти дерево и сравнить элементы.
>>1212589 >kvartira Ты уверен, что тебе нужно сдавать курсач? Алсо в чем проблема вообще. Ты говоришь, что не знаешь как сравнивать структуры, но при этом функция добавления в дерево у тебя есть, как ты тогда добавляешь в дерево, если не знаешь, как сравнивать?.
>>1212626 С добавлением я кое-как разобрался, в том числе с помощью примеров. А когда дошло до сравнения я задумался. Не могу понять как это происходит. Даже не знаю как объяснить правильно.
>>1212859 Крч я не допилил там удаление из основной базы - потому что удалять сразу после запроса - тупо. И я не допилил внесение в базу если запрос не даёт результатов. Но эти оба пункта достаточно очевидны и просты.
>>1210706 >месяца 2-3 назад Липмана страниц 500,дико заебался и забил хуй я, к примеру, прочитал 90% книг из этого треда это касается только с++, само собой http://rsdn.org/forum/cpp/7076091.flat я, кстати, безработная хуйня, которую даже на двадцаточку не берут
>>1212967 какое "портфолио", епт? я после вуза неск лет сидел в одной конторе, исправлял ошибки и запиливал фичи в легаси, это же крестоблядство и все ..
Сижу и не могу понять, может кто пояснит если к примеру создать 2 массива и забить в них одинаковый текст int main() { char x = "-pwtb"; char y = "-pwtb";
if (x == y) cout << "1" << endl;// и сделать такую проверку
}
то будет вывод единицы
если же забить тоже самое как аргумент из командной строки
int main(int argc, char argv[]) //и ввод в консоль nameprogram.exe namefile.bin -pwtb { char x = "-pwtb"; if (x == argv[2]) //где argv[2] должен быть равен тому же "-pwtb" cout << "1" << endl; }
>>1213007 Как чел выше написал, компилятор видимо использовал одну и ту же строку в памяти для обоих чаров. С if (x == y) ты просто сравниваешь адреса на которые они указывают, a так как строка физически одна и та же, то и адреса у них одинаковые. Если хочешь конкретно сравнивать строки, то используй функцию strcmp(), только тут внимательно, если строки одинаковые, функция возвращает 0. https://ideone.com/HVKV4e
Ананасы, памагите Нужно изменить размер массива структур функцией. Вот примерно: strc mas = new strc[dohuja]; //strc какая-то структура strc uvelichenie(strc mas) { strc newm = new strc[len+1]; for(int i=0; i<len; i++) { newm=mas } return newm; } Функция создает новый массив на еденичку длинее и переписывает все указатели из старого и дописывает что-то новое но не суть Вопрос в том как дальше воспользоватся функцией что бы массив mas увеличить и он остался с названием mas. mas = uvelichenie(mas); Такое вроде как не работает, и я не ебу как грамотно реализовать увеличение
Устраиваюсь после долгого перерыва на работу, уже порядком подзабыл С++, поэтмоу нужно как-то все это срочно повторить перед собесом. Посоветуйте годных ресурсов для такого.
>>1213239 Во-первых у меня опыт, во-вторых, мне надо как раз подготовиться хорошо. Потому я и спрашиваю. Алсо, молодое мясо обычно она днищеработу берут, а я на норм зп и проект устраиваюсь.
>>1213231 1. Вот эту хуету выборочно полистай. https://books.goalkicker.com/CPlusPlusBook/ 2. И ещё что-нибудь по алгоритмам и структурам (тот же гуголь вполне сгодится). 3. Сгоняй на пару собесов в конторы, до которых тебе похуй и затем повтори 1 и 2.
>2. И ещё что-нибудь по алгоритмам и структурам (тот же гуголь вполне сгодится). Ну по алгоритмам я особо задрить не буду, ибо в свое время задрил, просто повторю самые популярные структуры и алгоритмы.
>3. Сгоняй на пару собесов в конторы, до которых тебе похуй и затем повтори 1 и 2. Вот это да, записался на один как раз на пятницу.
>>1213231 >Устраиваюсь после долгого перерыва на работу, уже порядком подзабыл С++, поэтмоу нужно как-то все это срочно повторить перед собесом. http://cppquiz.org/
>>1213250 хуя ты самоуверенный вот меня "после долгого перерыва" везде куда ходил нахуй посылали еще на этапе хрющ и, канеш, тебе надо было весной идти, лето мертвое время плюс толпы июней, повторюсь какое-то оживление будет осенью еще, после того как люди что пришли весной уволятся или их уволят - те освободятся места где не сраслось у работника с фирмой..
>>1213443 >не сраслось А я вот ходил и получал предложения после трёхлетнего перерыва (стаж на тот момент был около 10 лет). Июней вообще не заметил - они между собой соревновались за более низкие позиции. Ну а летом, оно да, вакансий поменьше, но для опытного спеца их всё равно хватает.
>>1213675 Он >>1213686 уже всё объяснил, правда есть одно "но" - конкретно в винде вместо VirtualAlloc в куче, записи в кучу и вызова бывает удобнее записать код в статическую память (ну там char foo[] = {0x90, 0x90, ...};), сделать VirtualProtect по его адресу и ((void*)()foo)(), не надо ничего лишний раз записывать.
Есть класс, который есть абстракция приложения. У приложения есть графические пассивные элементы (надписи и иконки). Их всего в районе 5-7 и возник вопрос как лучше внедрить поддержку хранения этих элементов в класс.
Создать отдельный метод для каждого графического элемента? Или создать список, на подобии Map и вызывать их по ключу? Или создать вообще отдельный класс для их хранения?
Предположим, чтобы поменьше париться для текущих 7 элементов проще и правда создать отдельные элементы.
Предположим, что их больше, в районе 70. Как в таком случае реализовать их хранение в классе?
Интересует именно как правильно это сделать, а не "ну, работает жи".
>>1213443 Хз, мне за 2 дня после публикации резюме на ХХ, пришло вакансий 20 уже, при чем они ахуели, кидают на почту, в телегу, звонят я уже думаю закрыть на время, т.к. я уже даже не успеваю читать все.
АААААААААААААА БЛЯД!Ь АААА СУКА СУКА СУКА!!! Тип объекта меняется по мере работы конструктора/деструктора, версия виртуальной функции выбирается в соответствии с текущим типом объекта. Как же больно.
Посоветуйте вменяемого объяснения placement new пожалуйста.
Есть такая задача https://stepik.org/lesson/563/step/7?unit=886 и абсолютно непонятное объяснение от авторов курса. Что они хотят? В каких книгах/гайдах это всё хозяйство объясняется?
>>1214624 Правда если идёт речь о C++, то всё гораздо сложнее. Придётся использовать библиотеки вроде libunwind и плюс конпелировать программу с отладочной информацией.
>>1214642 А в чем проблема запустить отладку и поставить на своей функции точку остановки? Выполнение остановится и по стенку вызовов можно будет посмотреть, что и откуда вызывается.
Приветствую. Сейчас сижу на рекурсии, пытаюсь решить задачки, но что-то не особо получается. Условие: Даны два целых числа A и В (каждое в отдельной строке). Выведите все числа от A до B включительно, в порядке возрастания, если A < B, или в порядке убывания в противном случае. Смотрел везде, подправлял, но ничего. Мне просто выводит одно число, но никак не целый ряд. Буду благодарен за помощь. Сам код : #include <iostream> #include <cmath> using namespace std; int function_new(int a, int b) { if (a > b) { if (a == b) return a ; return function_new(a - 1, b);
} else { if (a == b) return a ;
return function_new (a + 1, b); } } int main() { int maximum, minimum, number1, number2; cin >> number1 >> number2; cout << function_new(number1, number2); return 0; }
>>1214718 И как логи тебя спасут в случае необработанного системного эксепшона? В C++ проекте для того чтобы логгировать подобные вещи (да ещё и со стектрейсом) нужно использовать сторонние инструменты вроде breakpad'a.
>>1214722 При чем тут эксепшн вообще? Если вопрос был: >унаследовался от класса, переопределил функцию, как узнать что за функция вызывает мою переопределённую функцию?
>>1214735 Ну да, конкретно у него ебанутое желание. Я просто говорю, что простых логов зачастую недостаточно и требуются реальные стектрейсы (пусть даже без встроенных функций). Жалко, что в стандарте нед средств для их нормального получения.
>>1214739 Ну remote gdb. Тем более я не понимаю в чем сложность эксепшена и к чему ты его приплел сюда, но на обработку эксепшена тоже можно логи поставить. Я на пример почти всегда логами пользуюсь, да и если ты работаешь с какой-то низкоуровневой хренью, то других способов отладки просто не существует.
>>1214742 > Ну remote gdb. Речь про автоматическое логгирование. Или пусть клиент звонит и просит прогромиста подключиться к нему и пердолиться на его компьютере? > да и если ты работаешь с какой-то низкоуровневой хренью, то других способов отладки просто не существует. Есть breakpad. Очень годная вещь для логгирования крешей.
Анон, есть одна небольшая задача, написать плагин для kodi для input stream interface, который позволял бы проигрывать два куска видео как один. Небольшая задача. Но загвоздка в том, что в c++ я даже не пробовал практически ничего писать. Писал только на питоне последние месяца 4, и на прием эту задачу решить никак нельзя. Собственно вопрос, насколько эта задача будет для меня неподъемной? Сколько времени мне потребуется изучать минимум с++ чтобы реализовать эту задачу? На питоне над решением с помощью костылей я бьюсь уже около месяца, но нихуя не выходит. А решение на плюсах будет так сказать нативным, бескостыльным. Спасибо
>>1213998 вопрос в том как много в них нормальных. у меня резюме закрыто уже хрен знает сколько и всё равно пишут постоянно. но при этом это или кадровые агенства которые просто от балды рассылают что-то всем или люксофт.
Сап, в чём проблема, я не пойму. В программу в ccnum будет вводиться через cin значение, и потом если первый символ 4 или 5, то будет писаться что это.
>>1215079 Советую тебе дропать это дело, т.к. ты вообще не понимаешь, что происходит. Надеюсь банкоские карты ты взял как пример и это не задание на работе.
>>1215088 Нет, это в институте задание, просто решил взять проверку МастерКард или Виза, и потом сделать проверку правильности номера карточки. Почему сразу дропать, если мне это нравится, и я хочу понять ошибки и продолжить изучение?
>>1215084 >>1215087 Вводится какая-то карточка, к примеру "4000 0000 0000 0000". Если первый символ 4, значит Виза, если 5, значит МастерКард. Я же правильно понял, что ccwrk подчёркивается из-за пустого значения? Если так, то как мне туда его ВПИСАТЬ, даже нулевое? У меня оно равно функции же, а она неактивна до запуска.
>>1215096 Соре, анон, в /b наверное пересидели день не курил. Зачем юзаешь C-style строки вместо std::string? Ругатся много из-за чего может. Визуалка тебе обо всём говорить должна с номером строкивключи нумерацию строк и описанием ошибки. Анон выше написал, что легче всего первый символ чекнуть, но здесь у тебя скорее всего, ебня с типами т.к. у разности указателей свой тип,std::ptrdiff_t а у тебя разность указателю присваивается. Ну и с = в if тоже проебался.
>>1215090 >А че есть инфа по ним? А какя инфа то? Это крупная галера. Сотни тпшек рассылают список вакансий всем подряд (в описании вакансий часто можно наблюдать ошибки в грамматике и правописании).
>>1215102 >Я же правильно понял, что ccwrk подчёркивается из-за пустого значения? Если так, то как мне туда его ВПИСАТЬ, даже нулевое? Для начала, твой код падает ещё на char *ccwrk = strchr(ccnum, 4); Зачем тебе эта строка? Давай прочитаем определение strchr >Функция strchr выполняет поиск первого вхождения символа symbol в строку string. Возвращает указатель на первое вхождение символа в строке. Завершающий нулевой символ считается частью Си-строки. Таким образом, он также может быть найден для получения указателя на конец строки. Значит она тебе вернёт любое первое вхождение четвёрки. Даже в случае ххх4 хххх хххх хххх или в случае хххх хххх хххх 4ххх Значит она тебе не нужна. Что ты пытаешься сделать в случае symbcc - вообще не понятно.
Тебе нужно лишь читать первый символ строки. Первый символ просто получить использовав указатель на строку.
>>1215342 > In C++11 and later, mystring.c_str() is equivalent to mystring.data() is equivalent to &mystring[0], and mystring[mystring.size()] is guaranteed to be '\0'. Так что всё там есть.
>>1215358 Чёт не могу найти явного/косвенного указания на null-terminated в стандарте. Но раз уж господа пишут, что с C++11 можно разыменовывать str[str.size()], то будем считать что '\0' всё-таки там есть.
Сходил на собес. Пиздец конечно они конченые. Я добираясь до них по адской жаре пришел к ним, а они пидоры даже воды не предложили, я уже не говорю о чае или кофе. Начали спрашивать по С++ всякую хуйню по СТЛ, когда у меня там было написано что я больше на Си пишу и С++ только по минимуму юзаю. Еще у них под винду оказалось, хотя у меня четко написано в резюме только линукс.
>>1215385 >Я добираясь до них по адской жаре пришел к ним, а они пидоры даже воды не предложили, я уже не говорю о чае или кофе.
Если из твоего резюме не следует, что ты спец в нужной сфере, то зачем на тебя тратить время, печеньки и кофе? Они таких десяток в неделю опрашивают. Видимо ты ещё со временм проебался, торопился и напотел в штаны.
>Начали спрашивать по С++ всякую хуйню по СТЛ, когда у меня там было написано что я больше на Си пишу и С++ только по минимуму юзаю. Еще у них под винду оказалось, хотя у меня четко написано в резюме только линукс.
Вакансию ты не читал и на сайт работодателя не заглядывал, да?
>>1215397 Я разместил свое резюме на хх, написал четко скидывать вакансии на почту, но нет блять, они нихуя не скинули описание вакансии, а позвонили, рассказали какую-то ебаторию в двух словах, но не сказали что под винду и что там вообще с++ уровня Java, а не си с классами как я хотел. В общем они уболтали меня на собес, я согласился, но попросил выслать мне описание вакансии на почту, что они конечно же нихуя не сделали, но я подумал лан похуй, сама их деятельность вроде интересная была, поэтому я не стал отменять встречу.
>Если из твоего резюме не следует, что ты спец в нужной сфере, то зачем на тебя тратить время, печеньки и кофе? Во-первых, нахуя меня звать на собес, если я им не нужен? Во-вторых, это блять чисто деловой этикет, предложить гостю в своей ебучей сраной говноконторе чашечку чаю или кофе с дороги. Такое их отношение к своим собеседуемым лишь лишний раз говорит о том, что это ебучая галера, где им похуй на своих сотрудников.
Это кстати первый раз, где мне не предложили чай/кофе на собесе. Вопиющая наглость.
>>1215401 Вообще я заметил некую корреляцию между уровнем С++ и ущербностью конторы. Чем больше С++ похож на Java, со всякими там интерфейсиками, чрезмерным кол-вом ООП, СТЛ, буста, QT и прочей ебатории, тем вероятнее, что это обычная галера, где ты будешь только и делать, что фиксить легаси говно. Кстати они мне говорили, что у них сильный упор на фикс багов, после чего я сразу понял, что это 100% галера, куда они ищут макаку.
>>1215408 Так в том-то и дело. Что у меня конкретно написано, чем я занимался на предыдущих работах и что я хочу делать. А когда пришел к этим, они начали спрашивать типа "А вы ГУИ делали когда-нибудь?" Я ахуел с таких вопросов и говорю мне нахуй это гуи не всралось и я этим не собираюсь заниматься. Короче пиздец, ну ладно, сходил хоть размялся.
>>1215401 >Это кстати первый раз, где мне не предложили чай/кофе на собесе. Вопиющая наглость. А мне как-то предложили встретить у них пенсию (в госконторе, ага). Чай/кофе и экскурсия по офису тоже случались, но уже после успешного собеса. Зато перед собесом иногда какую-нить тянку подсылали, которая со мной знакомилась/кокетничала в лифте или на ресепшене.
>>1215119 да ошибки то ладно. они реально хуярят вообще всем вообще все вакансии. у меня в резюме (закрытом хз когда) джава была не знаю, 6-7 лет назад но мне пачками шлют вакансии по джаве. т.е. оно вообще без мозгов. ну и работа там потогоночная.
>>1215510 Ну а что ещё ожидать от работорговцев? Я когда к ним собеседовался, то там 6 этапов было (тпшки -> прогеры -> пм -> какой-то хуй -> контрагенты -> финальные переговоры). Ещё тестовое. Вся эта ебала растянулась на 2 месяца и ни по проекту ни по зп "работодатель" ничего внятно сказать не мог.
>>1215383 >Чёт не могу найти явного/косвенного указания на null-terminated в стандарте. http://eel.is/c++draft/string.classes#basic.string-4: In all cases, [data(), data() + size()] is a valid range, data() + size() points at an object with value charT() (a “null terminator”), and size() <= capacity() is true.
>>1215914 #define это не compile-time, т.к. разруливается препроцессором еще до компиляции. С соответствующими особенностями – нихуя не знает о типах, копипастит код как текст. И дефайн это не рефлексия
>>1215921 Сompile-time же. Наверно будет что-то вроде шаблонов. Хуй знает, мне от рефлексии надо только read-only фичи, типа итерирования по всем значениям enum.
>>1215933 Т.к. в конце свича нет default, то при добавлении значения в енум конпелятор спалит, что его нет в свиче и покажет варнинг (при соответствующих флагах). А при изменении\удалении значения код тупо не скомпилится. ??? PROFIT
>>1216643 В вектор элементы набиваются плотно, жопа к жопе, в одном куске памяти. Поэтому занимает меньше места и можно получить доступ по индексу. Но вставка и удаление из середины медленная, т.к. надо сдвинуть все 100500 объектов после удаленного на один назад. А при заполнении всего участка памяти берется кредит в два раза больше предыдущего выделяется новый участок побольше, туда перемещаются все данные, а старый удаляется.
В листе у каждого элемента личный кусочек памяти, где лежит он сам и два указателя: на тот что за ним и перед ним, как в очереди к терапевту. Поэтому вставка в середину быстрая (хуле там – четыре указателя переставить). Зато при добавлении элемента приходится выделять этому мудаку отдельный кусок памяти, отчего стандартный аллокатор, не оптимизированный для маленьких объектов, срет кирпичами. И нет доступа по индексу – чтобы добраться до середины, спрашиваешь "кто крайний?", потом у него "вы за кем?" и так N раз.
>>1216659 Хорошо объяснил, спасибо. Я так понимаю с вектором программа быстрее работает, если ты этот вектор не часто меняешь, а больше читаешь. Даже если ты не знаешь индекс элемента и прогоняешь вектор через цикл, то это будет быстрей чем в списке, так как прыгать по указателям медленее, чем читать в памяти +1 по очереди. Правильно? А какой из этих способов используется для реализации массивов в Javascript и списков в Питоне, не в курсе?
>>1216683 Можно в принципе всегда использовать вектор, если данных не много (до 100мб, а может и больше). Фича в том, что внутри него обычный массив, как в си. С соответствующими бонусами: вектор может переместить себя прямо голыми руками через memmove(), передавать этот массив в сишные библиотеки, +из кэша процессора кровь не течет, т.к. все данные размещены последовательно.
Хз что там в ЖС и питуне, но вероятно тоже что-то вектороподобное. Ибо только джава так упарывается по интерфейсам, что предоставляет доступ по индексу к LinkedList.
>>1216696 > спрашивайте ваши ответы Как запилить аналог винапишной функции WaitForMultipleObjects? Нужно знать, какой из запущенных тредов завершил работу.
>>1216751 Насколько я знаю, нет способа узнать, завершен ли поток, если только он сам не сообщит об этом каким-либо образом. Поэтому можно раздать всем тредам общий condition_variable с мьютексом и дальше по примерам с cppreference.
>bWaitAll [in] If this parameter is TRUE, the function returns when the state of all objects in the lpHandles array is signaled. If FALSE, the function returns when the state of any one of the objects is set to signaled. In the latter case, the return value indicates the object whose state caused the function to return.
Я вытащил экзешник из папки релиз на рабочий стол, он запустился без проблем, так как нет файлов, которые программа искала бы в папке проекта. Как быть с остальными инклюдами и что именно надо прицепить к экзешнику, чтоб он запустился на другом компе? В свой компилятор кидал ещё вот эти два файла (либ в папку либ, хидер в папку инклюд), длл-ку в Windows\SysWOW64.
>>1217029 > Я вытащил экзешник из папки релиз на рабочий стол, он запустился без проблем, так как нет файлов, которые программа искала бы в папке проекта. Потому что система их нашла в папке шиндовс куда ты их и забросил.
> Как быть с остальными инклюдами и что именно надо прицепить к экзешнику, чтоб он запустился на другом компе? Вместе с экзешником должны быть и дллки.
Сап, плюсаны! Подскажите где ошибся? Не считая того что происходит переполнение целочисленного типа( работой над большими числами я займусь позже). Прога по вычислению теоремы Ферма. https://ideone.com/C3tZ6t
библиотеки для ARM микроконтроллеровАноним25/06/18 Пнд 20:20:25#247№1217304
Начинающий микроконтроллерщик, вопрос будет о существующих годных фреймворках. В основном работаю с STM32. Знаком со стандартными библиотеками HAL, а так же MBED C++ библой.
Какими библиотеками или фреймворками пользуются профессиональные программисты ARM микроконтроллеров? Интересуют конкретно C++.
>>1217333 >https://ideone.com/AxGmby Видел такую форму записи когда гуглил про решение этой теоремы, думал что может она неправильная. for for for вот теперь буду знать спс
>>1217317 Я не математик. Но зачем вообще такая теорема нужна? Ну вот сказал какой-то чувак, что для n>2 решений нет. И блять 300 лет не могли доказать. Какой вообще смысл этой теоремы?
Может потом пригодится как частный случай какой-нибудь практической задачи. В математике часто так – придумывают совершенно пизданутые (но формально непротиворечивые) теории и модели, которые вообще непонятно нафиг нужны. А через 100 лет они внезапно оказываются полезны в какой-то области. Так на тензорное исчисление всем было поебать, пока оно не пригодилось для физики твердых тел.
Сап плюсач. Саморазвиваюсь короче. Появился вопрос и хочу его задать, в надежде получить ответ. Пишу хуйню без особых знаний, руководствуясь неким факом, который автор оставил. ФАК этот для хук длл. Но фак уровня /b, чтоб ретарды как я не могли быстро все повторить. В общем кратко, предположим, я хукнул функцию. По её вызову, мы попадаем в хук, и там как пишется, надо вызвать другую функцию с указателем thisptr. По логике, вызвав функцию с этим указателем, она вернет некий результат. После чего, мы получая результат, должны перезаписать входящие данные в функцию, которую хукаем, и вернуть ей управление. Каким образом будет выглядеть вызов рандом функции с указателем thisptr, да чтоб она еще что то выполнила и вернула?
>>1217527 с натяжкой да. Обычно под цепочкой ответственности подразумевается что-то типа "гуишный виджет получает событии о нажатии клавиши, обрабатывает его или передает родителю если не знает, что с ним делать, и так далее"
Сейчас пытаюсь разобраться в указателях (без них рекурсивную задачу выполнил), но с ними у меня какой-то затуп. Мне нужно с помощью рекурсии вывести цифры числа по отдельности. #include <iostream>
using namespace std;
void recursion (int p) { cout << p % 10; if (p == 0) return; else recursion (p / 10 ); (Здесь собственно ошибка)
}
int main() { int a; cin >> a; recursion (&a); return 0; } Что нужно изменить, желательно с пояснением. Спасибо за ответ!
>>1217621 ()p это разыменование указателя, тип этой операции будет int == ()(int). тип выражения ()p / 10 тоже int, а твоя функция принимает recursive(int). Если ты попытаешься взять от него адрес &(()p / 10), то тоже получишь ошибку, так как результат деления это временный объект. Так что в данном случае нужно вынести деление отдельной строкой (*)p /= 10; recursion(p);
>>1217628 (*)p /= 10; recursion(p); Может бредовый вопрос. Но в данном случае recursion (p) будет являться ссылкой на целочисленную переменную или самой переменной. p = 000xf230 или p = 12 (допустим).
Ребят, я не знаю как такое вообще возможно. Может что-то с компилятором, но вот в общем какая ситуация. Вот собственно сам код : https://ideone.com/1j6Ez5 Его задача проста, ввести кол-во элементов массива, забить массив и вывести наоборот. Он делает свою работу, но в нем есть две бесполезных строки. std :: cout << *ptr_array-- << std :: endl; std :: cout << &ptr_array << std :: endl; Но стоит мне их убрать, то программа начинает работать не так как нужно. Почему подобное происходит? Вот программа без этих строк: https://ideone.com/9c7flr Либо я реальный идиот и что-то упускаю, либо Бог знает что. Спасибо за ответ.
>>1217736 Лень вникать, но &arr[number] указывает за пределы массива (индексация то с 0 начинается, поэтому должно быть number - 1). А вот это (star)ptr_array-- как раз сдвигает указатель назад обратно в массив.
>>1217744 Объективно, number = 3. Передалось это значение, по идее должно будет равняться 2 , и с индексами все будет нормально. Но видимо из-за указателей получается именно так. Просто до этого я делал еще без функции, тоже на этом моменте затупил, забыл отнять. Но тут то это должно работать так, как надо.
>>1217744 Это видимо из-за инкремента, он сначала выводит, а потом отнимает. Допустим максимум массива был равен 4. Он сначала из этой 4 вычитает 1, чтобы не выйти за переделы, потом отнимает еще раз 1 и получается 2. Но тогда как эта программа исправно работает, если изначально массив состоял из трех 4 элементов, а не из двух. Видимо я что-то упускаю.
>>1217762 Чтобы всё заработало, тебе надо прибить эту строку и прописать number - 1. Кстати, есть ещё момент: объявление T[size] variable; требует, чтобы size был известен или вычислен во время компиляции. Конструкция типа int size = 10; int array[size]; не скомпилируется.
>>1217765 Вроде как понял, что изначально ptr_number (без n-1) был за пределами этого массива, потом в функции его можно засунуть внутрь через ptr_number-- или, как ты сказал number - 1. Везде звездочки, если что. А про t[size] видимо я не особо понял. Ты имел ввиду, что я после cin >> number и объявления int arr[number] получу ошибку компиляции? Но все, вроде как, исправно работает.
>>1217769 >Но все, вроде как, исправно работает Там видимо какая-то особенность компилятора gcc. Компилятор от микрософта такое не пропустит, так как он не знает, что пользователь запишет в number.
expr - an integral constant expression (until C++14) | a converted constant expression of type std::size_t (since C++14), which evaluates to a value greater than zero exp - целочисленное константное выражение (до с++ 14), преобразованное константное выражение типа std::size_t (начиная с с++14), которое вычисляется в значение больше нуля.
>>1217786 У меня просто Visual с ошибками постоянно ставился, не смог найти решение, хотя кучу репаков перекачал. Пришлось поставить codeblocks. Тогда нужно создать массив допустим на 20000, а потом работать со своим размером? Сейчас посмотрел и увидел, что подобное на Паскале делал, где-то 3 месяца назад.
В обе функции за раз передаётся всё содержимое пакета целиком, без заголовков и «\r\n\r\n».
Надо иметь в виду, что данные на интерфейс IReceiver поступают произвольными блоками (нет никакой привязки к размерам и границам пакетов). Класс должен быть как можно эффективнее при следующих условиях: средний поток, подаваемый на вход – 500 Mbit/s, средняя длина блока входных данных – 1024 байт.
>>1217811 / Simulate partial network traffic by blocks of various size/ r = rand() % 15 + 1; Вот эта строчка показывает, что ты не умеешь тестировать свою писанину.
>>1217832 Тест должен быть стабильным. Рандом делит это качество на ноль. Более того, ты не сможешь воспроизвести поток данных и найти баг, если тест не пройдёт.
>>1217844 Боже мой, во-первых, в задании нету ничего про тесты, так что это моя отсебятина, во-вторых, это вовсе не тест, а экземпл, что это говно вообще работает, так что мне глубоко поебать на какие-то там баги.
Еще добавлю, что я написал это говно на коленке чисто для разминки, я даже не собираюсь туда устраиваться работать, т.к. мне они не понравились, так что я не особо запаривался на счет того, как я написал. Конечно я бы мог запилить какие-то нить охуительные тесты показывающие нагрузку, пропускную способность и прочее, но мне это нахуй не надо.
Вообще ненавижу тесты, если в работе надо писать юнит тесты я сразу ее шлю нахуй. Это для макак.
>>1217850 Так ты поясняй, а не только снисходительно пизди тип это не прально то не прально. Коль решил доебаться - обосновывай.
>>1217855 >Вообще ненавижу тесты, если в работе надо писать юнит тесты я сразу ее шлю нахуй. Это для макак. > То есть для отладки ты написал один код, а для демонстрации другой (с недвусмысленным методом make_test_stream)? Или ты не отлаживал вообще?
Сложные алгоритмы без тестов не написать и уж тем более не оптимизировать. Гарем из наташек-тестировщиц не поможет.
Ну с бомбёжкой по поводу замечаний тебе тоже желательно совладать.
>>1217868 Бля ты вообще видел реальные тесты когда-нибудь? Тот мой код похож на реальные тесты?
>Сложные алгоритмы без тестов не написать и уж тем более не оптимизировать. Я говорил про юнит тесты. Тесты на алгоритмы и производительность это совсем другое.
>Ну с бомбёжкой по поводу замечаний тебе тоже желательно совладать. Где ты бомбежку увидел? Ты нормально общаться научись сначала, не снисходительно и аргументированно.
>>1217877 >Я говорил про юнит тесты. Тесты на алгоритмы и производительность это совсем другое. Алгоритм заворачивается в класс, который, в свою очередь, является юнитом.
>>1217887 То есть, если тебе придётся писать алгоритм, то ты превратишься в макаку и будешь писать юнит-тесты? Или ты будешь писать тесты прям в классе алгоритма?
>>1217895 Уже через чур толстить начинаешь. Тесты к своему алгоритму-то я напишу, если надобность будет и то выборочные. Я имею ввиду, я не пишу тесты на каждый пук, как это делают некоторые дауны, тратя 80% времени разработки на ебаные тесты.
>>1217900 >Тесты к своему алгоритму-то я напишу Ты их и написал в задании. Но с rand там явный залёт. Помнится я как-то писал тестовое на senior'a и как раз тестовую часть сделал на отъебись. По ней меня и выебли, сволочи :). Так что либо аккуратно оформляй это говно, либо выкидывай нахуй.
>>1217921 Ну с ранд может и да, хотя я не рассматриваю это как тест, скорее как демонстрация.
Я конечно мог бы получше стараться, но меня просто не особо парит, что они ответят, т.к. я буду дальше искать более подходящую для себя работу. Под конец уже хотелось побыстрее доделать эту задачу и перейти на что-нибудь другое. А так да, я им заломил ЗП 180к ( хотя по мне норм зп для мидла, даже маловато, хотел сначала 200к попросить ) и они такие типа ебать ты заломил ЗП, мы тебя будем оценивать как сеньора. Я думаю мне пох ваще как вы там будете меня оценивать, лол.
>>1217981 Да уже пох. Я уже все равно отослал до того, как сюда запостил.
>>1218009 >Ключевое слово explicit избыточно с конструктором Да, я знаю. Я потом добавил второй аргумент и забыл убрать эксплицит.
>Чем занимается галера? Какая-то хуйня по видеонаблюдению. Я тут писал про нее уже пару постов назад. Главная причина почему я туда очень вряд ли пойду - это то, что они под виндой пишут, а я только под линукс всегда разрабатывал и винда мне вообще как-то противна в плане разработки. Стоит только взглянуть на WinAPI и уже блевать хочется. К тому же там под студией надо сидеть и всеми этими виндовыми штуками пользоваться, я в них ничего не понимаю и разбираться лень. Да и нахуй мне такой опыт, когда пол жизни под линукс пишу.
>>1217844 Так как seed для рандома постоянен нет чего-то в духе srand(time(0)), то rand() будет каждый раз генерить одинаковую выборку. Так что можно сказать тестовые данные константны. Мимо другой анон. Зацепило тестовое, решил сам сделать. Вот что вышло https://ideone.com/HNjdzP
>>1218034 >CamelCase >lowerCamelCase >Hungarian notation >10 уровней вложенности. >Java-style >Куча magic numbers Я даже не проверял работает ли это и правильно ли сделано, но это просто невозможно читать. Я бы тебя забраковал только за ужасный код стайл.
Именую все в under_scope, ибо camelCase это все из джавы, паскаля и прочего.
>Лол, ну ведь 3 максимум и то в одном месте где свич. С отступом в 8 символов 3 уровня это уже через чур. Цитирую Торвальдса: >if you need more than 3 levels of indentation, you're screwed anyway, and should fix your program.
>>1218058 Ну на каких-нибудь убогих галерах может так и пишут, хз я никогда там не бывал. Но если ты уважающий себя прогер и твоя команда не сброд макак и индусов, то вы будете придерживаться какого-то лаконичного и ясного код стайла, чтоб другие могли прочитать без особого труда, что ты там наговнокодил, точнее напрогал, ибо говнокод запрещается тоже.
Кстати, когда хожу по собесам, всегда спрашиваю про код стайл, помогает сразу отсеять галеры с быдлокодерами.
Снова вопрос. Вот, допустим, есть массив n из i элементов. Я могу ввести с клавиатуры число x, а потом присвоить x элементу массива n какое-то число. Типа : сin >> x; n[x] = 1; Но как такое сделать в функции? Спасибо за ответ!
Антоны, зачем надо объявлять отдельно заголовочный файл класса с названиями функций, а затем и .срр с реализацией? Нельзя что ли просто в заголовочном делать реализацию?
>>1218277 Можно, просто во-первых это стиль такой, во вторых чтобы не было перекомпиляции, если ты заменишь что-то в cpp файле будет перекомпилироваться только он, а если в хэдере, то будут перекомпилироваться все файлы, в которых этот хэдер включен.
>>1217811 Что нужно читать, чтобы эту байду уметь? Я прочел Страуструпа Язык C++, но это задание сделать не могу и решение не понимаю. Это вообще сложное задание?
>>1218286 >Можно Только для инлайн функций, шаблонных функций и (С++17) инициализации переменных. Для обычных функций/методов тоже работает, но если включишь один хедер в разные срр, то линкер найдет несколько определений (даже и одинаковых) и обложит тебя хуями.
>>1218328 Что бы научиться программировать надо не только читать но и писать. Хуяч код каждый день и байтоебь, через полгода научишься писать как этот тип
>>1218352 Я могу эту задачу решить, но только без этих абстракций, только в структурном стиле. Я не понимаю, зачем использовать ООП в подобных задачах, он же ниуместин.
>>1218277 h-файлы дикий костыль языка Си, где ты сам делаешь работу компилятора, объявляя функции для использования. В C++ этот костыль перекочевал, впитав в себя ещё и особенности использования с шаблонами (а шаблоны в большинстве случаев ты можешь объявлять только в h-файлах, если не считать 3.5 костыля, которыми никто не пользуется).
Для решения этих проблем были придуманы модули, которые избавляют от необходимости h-файлов. Однако модули не взлетели в C++20 (потому что в самый последний момент кому-то что-то не понравилось) и скорее всего будут только к C++23 или C++26 (а возможно и ещё позже).
>>1218381 Нет. В современных языках ты прямо внутри исходника каким-нибудь ключевым словом объявляешь какие классы/функции должны бить видимы за пределами файла, а какие нет.
В C/C++ для этого используются отдельные h-файлы. Т.е. если объявление класса/функции есть в h-файле, то они считаются доступными за пределами файла с реализацией, иначе - нет.
>>1218382 Ну и помимо видимости в пределах файла, есть ещё видимость в пределах "модуля". Опять таки в современных языках можно несколько файлов объявлять частью одного модуля и настраивать видимость функций/классов в пределах этого модуля. В C/C++ подобного механизма нет и обычно просто делают отдельную папку private или подобную и складируют туда h-файлы, содержимое которых пользователь API не должен подключать.
>>1218352 Я не пойму незнакомых явлений, если буду ебашить знакомые хеллоуворлды. Где узнать про это всё байтоебство, хотя бы на уровне разъяснения базовых понятий, что к чему?
>>1218632 Я несколько раз перечитал твой пост, убедился что ты говоришь от балды и вздохнул спокойно. Потому что если бы связывание кода упиралось бы в наличие / отсутствие хедеров, это был бы пиздец.
_ Имхо присутствие в С-языках хэдэров это случай протекающей абстракции, когда мы не можем динамически определить сигнатуру функции и требуемые символы (и соответственно не можем что-то вызвать из библиотеки без точного знания вышеупомянутых), и ебет это только сишников и плюсоводов, потому что динамическое определение вышеупомянутой херни в язык еще не завезли.
>>1218652 Начал читать Джеймса Коплиена Программирование на C++ 2005 там что-то будет об этом?
Шапка просто шикарная. Я такой дурак, что сразу по ссылке не сходил еще при первом посещении треда. Почему бы не выделять ее, чтобы нубы не пропускали?
Помогите решить задачку, помогу рублем. Нужно дополнить класс методом pop так, чтобы программа корректно вывела на экран информацию об объектах хранимых в стеке.
>>1218950 Я бы с удовольствием научился, но до окончания принятия задачи осталось 30 минут. А все что я знаю о стеке, это то что поп удаляет верхний обьект
>>1218954 T∗ pop() { auto head = header; if(head == nullptr) { return nullptr; } header = head->tail; auto data = new T(std::move(head->data)); // перемещаем данные // auto data = new T(head->data); // как вариант - копируем данные delete head; return data; }
>>1218963 Проблема в том, что node хранит данные по значению, а возвращать надо указатель. Значит эти данные нужно перемещать/копировать в новый кусок памяти, а саму node удалять. Иначе будет use after free (если ноду удалишь) или утечка памяти.
>>1218960 Сделал также T pop() { if (header) { T info = *header->data; auto k = header; header = header->tail; delete k; k = nullptr; return info; } else { return T(); } }
>>1218871 Хорошо, Коплиен устарел. Что тогда читать? Напомню, вопрос начался с того, что мне непонятно байтоебство и хочу найти по нему материал для знакомых с основами языка. Что ты посоветуешь?
>>1219018 У меня в MinGW32 с Code::Blocks не работали pretty-printers в gdb, потому что питон туда не завезли и видимо уже не завезут. Подсунул в CB tdm вместо mingw – всё ок, но стало пиздец медленно линковаться. В остальном разницы не заметил.
Сап плюсач. Разбираюсь с указателем this. Если кртако, то если у меня есть класс Car(), то я могу обратиться к его члену например this->Engine()?
Дальше. Как можно перезаписать параметр функции изнутри самой функции? Ну предположим у нас есть указатель на структуру векторов. Есть функция, принимающая параметром этот указатель. Внутри этой функции мы вызвали другую функцию, которая возвращает другую структуру векторов. Как мне сделать так, чтоб передать этот параметр? Просто сохранить указатель на новую структуру и вызвать первую функцию с новым указателем прямо внутри этой самой функции??
>>1219244 >Просто сохранить указатель на новую структуру и вызвать первую функцию с новым указателем прямо внутри этой самой функции?? Хуйня же выходит чет. Хуй знает как делать. Хелп ми.
>>1219260 Да все оказалось до банального просто. Функция оказалась принимает параметр, и передает реторном в другую функцию. Я ебался в глаза и не хотел видеть этот реторн. По сути я просто должен переписать это значение результатом другой функции и в реторн пихнуть новое значение.
>>1219052 Конкретизирую. Чуть выше кто-то привел пример задачи на собеседование и ссылку на свое решение. Вот: >>1217811
Мне стало интересно, что это за мудреные штуковины. Я их не понимаю, хотя в общих чертах с языком C++ знаком. Тут отвечают, что это байтоебство и советуют мне «RTFM». Я всецело соглашусь, только вот какой конеретно талмуд читать? У Страуструпа такого не было, начал читать Коплиена, говорят, устарело.
Теперь выходит, тут еще замешана старая сишная работа с памятью. Зачем она мне? Разве в C++11/14/17 нельзя это всё сделать как-то почеловечнее, более высокоуровнево что-ли. Могу пойти Кернигана-Ритчи перечитывать, да вот нужно ли теперь?
Я не знаю, где изучаются такие штуки. Прошу совета, что почитать/посмотреть, чтобы было понятно, как он решил эту тестовую задачу, в чем там проблемы и как можно сделать лучше. Такой вот вопрос.
>>1219244 this неявно разыменовывается внутри функций класса, так что тебе не нужно вызывать из одного метода другой через this. Можно, конечно, использовать во избежание путаницы с аргументами, если совпадают имена. Но стоит изначально разумно называть данные и аргументы — и никакой путаницы не возникнет.
class Car { public: void start() { this->fuel_inject(); // излишне fuel_inject(); // нормально }
bool rename(string name) { if(this->name != name) // достаточно было бы назвать аргумент new_name return this->name = name; // и запутываться было бы уже негде return false; } protected: void fuel_inject(); private: string name; };
Про остальную часть вопроса по словесным описаниям понять трудно. Давай код. Кроме того, что тебе уже ответили, подозреваю, там может быть замешан std::forward или двойной указатель или еще что-то.
>>1219273 двачую, я проебал линк на его писанину, если этот крестовый господин еще присуствует, пусть продублирует ссылку плиз и да, если кто-то ответит, в каких книгах пишут про такое байтоебство, был бы благодарен
>>1219504 Он же писал, что его основной язык C. Поэтому и пишет он в c-style с классами. Если хочешь так же, то иди в тред по C и спрашивай книги и задания там.
>>1218943 Ну тут как бы вообще проблема со реализацией стека. Думаю, большая ошибка, что учат писать на плюсах. Смотришь, а там на самом деле на Сишные хедеры и строку. Ну йобана скороче уже c++20
Сап двощ. Спустя два года снова снова ебусь с реверсом и попыткой написать на внутренней апи хук с подключением ингейм автоаима. Снова нихуя не пони и хочу спросить.
Есть bool __thiscall CEGun::ComputeTgtLeadPosition(CEGun this, struct Vector ) Есть enum FireResult __thiscall __high CEGun::Fire(const struct Vector )
В общем суть задачи такова, что хук вешается на CEGun::Fire, где внутри неким хуем вызывается CEGun::ComputeTgtLeadPosition абсолютно не представляю как вызвать, говорилось что то про this. Но она булевая, и возвращает 0 или 1. Хотя говорилось, что она делает перерасчет вектора, который надо будет передать реторном из CEGun::Fire. На скрине как раз функция, которая хукается и в которой надо вызвать CEGun::ComputeTgtLeadPosition .
В общем, как надо вызвать, чтоб получить этот вектор, и передать его дальше?
>>1219776 Так из стандарта c-style никто не убирал. В с++20/30/40/50 он тоже останется. Просто есть болезные, которым невдомёк, что им дали не новый стандарт, а добавили функцмонала в старый. И нет никакого old/modern c++ а есть разные стили написания одного и того же говна.
Я немножко в ахуе. Это комплиятор надо мной издевается, что ли?
uint32 count = vector.size() // 4, printf выдаёт нужный размер for (int i=0; i<count; i++) { myStruct.arr = vector; printf("arr[%d] = %d", i, arr); } printf("count = %d, i = %d", count, i);
Так вот, в конце count = 4, i = 4, но arr = xxвсего один раз принтится, ну и массив, соответственно, нихуя не заполняется. Фигня в том, что struct объявлен как struct MyStruct { 32 arr[1] }
Неужели он видя, что всего один элемент, просто пропускает остальные шаги, защищая меня от чего-то (а на самом деле заставляя сидеть лишние часы)?! Почему, блядь, ошибку-то об array out-of-bounds нельзя выдать, как при обычном доступе? Только сделав uint32_t *arr = myStruct.arr получилось нормально все итерации лупа пройти. Что за пиздец-то нахуй? Горю, сука. И не нагуглить же ничего, любое упоминание пропуска итераций лишь миллиарды вопросов о continue выдаёт.
>>1219777 >>1219776 Это мы с вами знаем, чем C отличается от C++ и как пишут на C, а как на C++. Я тому нубасу и хотел сказать, что C/C++ сложно, много хаков, не все концепции очевидны, течёт память и так далее. Чтобы уметь программировать и понимать основные концепции достаточно python так как порог по сравнению с С++ вообще отсутствует. Попробуй объясни школьнику семантику перемещения.
>>1219783 может, ты имел в виду >myStruct.arr = vector; ибо у тебя там >myStruct.arr = vector; и естественно компилятор выкинул цикл за ненадобностью, правда непонятно, нахуя он принтф выкинул
>>1219773 На пике вообще инт вместо вектора. Или это там указатели такие? Если функция булевая, очевидно перерасчитанный вектор сохраняется поверх исходного (по тому же указателю).
>>1219903 В смысле расписана задача как говно. Я байтоёб со стажем, но не осилил описание. Браться за такое без уточнений — однозначно жрать говно потом.
>>1219825 Ето указатель, да. Криво преобразует в псевдокод, и часто каждый раз еще и по разному, лел. Но все остальное вроде показывает правильно, кроме вот соглашения о вызове и переменных в параметрах функций. >очевидно перерасчитанный вектор сохраняется поверх исходного (по тому же указателю) И тогда получается, нужно просто вызвать эту функцию, которая пересчитает вектор ( с данными параметрами первой функции) , а реторн можно будет вообще не менять, тому что обращается к той же самой структуре, которую мы изменили при перерасчете? Что то вроде такого? А бля, хуй знает как. https://pastebin.com/7939Gf4h Хотел бы передать привет и спасибо чуваку, который помогал в прошлый раз, мыло проебал.
>>1219937 Так в принципе должно работать компилироваться. Чтобы ComputeTgtLeadPosition смог перезаписать вектор, от него пришлось отломать const. увидишь такое в нормальном проекте - набей автору ебало Во второй строчке можно обойтись dynamic_cast если CELauncher наследуется от CEGun, и вообще без каста если наоборот.
>>1219811 Да, разумеется там arr[idx] = vector[idx] должно было быть. Ладно бы он не присваивал значение массиву вне границы, но, блин, он ведь да, и printf'ы заигнорил, то есть, просто взял и пропустил все итерации, правильно инкрементировав при этом i, будто так и надо.
Компилятор gcc.
>>1219815 Не, там предварительно malloc'ается нужное (правильное) количество памяти, да и после arr в MyStruct есть ещё элементы, так что настолько далеко, чтобы i перезаписать, я уйти никак не мог. И уж точно бы i не становилась магически именно вот 4 всегда, если бы она вдруг перезаписывалась.
>>1219505 Дык, а у меня вопрос, как это сделать не на сисклассами, а на нормальном современном C++. Это вообще возможно? Или там было задание по сям, а он по-приколу писал си через плюсы?
Извините, если вопрос дебильный. Я только изучаю эти штуки и путаюсь очень, поэтому пришел сюда спросить. Если платина, скажите, что читать, какой манул курить.
Типичный случай наследования. В базовом классе приватное поле с указателем. В классе-наследнике еще одно приватное поле с указателем. Теперь пишем свой оператор присвоения. Для базового класса очевидно: старый указатель удалить, создать новый, инициализируя разыменованным из аргумента оператора присвоения. Объекты одного класса, видят приватные поля друг друга. Для класса-наследника уже непонятно: с его приватным указателем процедура та же, а вот как подступиться к той части, которая инкапсулирована в базовом классе? Я совсем не понял, что тут принято писать? Если вас не затруднит, скажите, в чем идея? Или у меня должны быть сеттеры-геттеры в protected, через которые все значения указателей перезаписываюся? Как это принято делать в самом простом варианте?
>>1219998 Тут надо как-нибудь извернуться и вызвать оператор присваивания у Base. Это можно сделать явно, типа Base::operator= ( this, d ) с соответствующими static_cast'ами. Или сделать ссылку на Base: Base& tmp = this; tmp = d;
>>1218056 >>1218143 Кажется, вполне логично: одни ходят по собесам, другие работают. У двух категорий существенно различаются взгляды на стиль кодирования.
>>1220052 Хз как правильно, но явный вызов вроде получше выглядит.
В перемещающем operator= надо сначала освободить память по указателю value. Тем более, что в Derived ты это правильно написал. Кстати, копирующий operator= в Derived накроется пиздой, если f = nullptr. Лучше сделать как в Base.
Охуенная оптимизация. Ради того, чтобы в 0.0001 перцента случаев код работал быстрее, мы замедлим остальные 99.9999 перцента случаев лишним бранчем в машкоде! Так победим!
delete value; value = new int(^b.value);
Не exception-safe.
Derived temp(d); std::swap(*this, temp);
Реализуй свой swap, а создание копии перенеси на плечи оператора присваивания. copy-and-swap называется.
>>1220059 >явный вызов вроде получше выглядит Явный — это variant 2? Меня терзают смутные сомненья. Если && в параметре и std::move в аргументе приведения справляются и по-отдельности, не поломается ли чего от избыточности. Слышал, что компиляторы сами оптимизируют возврат из функции в перемещение и, если дополнительно сделать move(), произойдет что-то лишнее вместо создания всего нужного сразу по адресу места возврата.
>сначала освободить память … копирующий operator= в Derived накроется пиздой Боги, как можно было проворонить. Я невнимательный, оказывается. Спасибо. Всё ведь понимаю и так прошляпил.
>>1220065 >Охуенная оптимизация. Это делалось не ради того, чтобы у невнимательного пользователя быстрее отработало самоприсвоение. Это во избежание непредсказуемых эффектов как раз для таких случаев. Разве лучше было начинать тело с if(this!=&b) { и включать в эти фигурные скобки всё до } return ^this; или ты что-то другое имеешь в виду?
Где не exception safe, нужно проверить на нулевой указатель, так?
>>1220083 >Это во избежание непредсказуемых эффектов как раз для таких случаев. Так пиши так, чтобы непредсказуемых эффектов не было даже при самоприсваивании. Это делается без проверок.
>>1220164 #include <cstdlib> и в том месте, где обрабатывается нажатие: std::system(R"("C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" http://2ch.hk)");
Как из c++ кода запустить другую программу и НЕ ЖДАТЬ ЕЕ ЗАВЕРШЕНИЯ? Нужно что-то вроде std::system("heavy-process"); только без вышеобозначенного недостатка.
>>1220222 Чёт не понял кто кого ждёт. Вызывающая программа выполняет std::system и идёт дальше по коду без ожидания (ожидание будет если ты используешь std::thread и потом join()). Запущенный системой процесс вообще не знает, кто его запустил, и тоже никого не ждёт.
>>1220275 std::system выполняется ровно столько, сколько системе нужно на создание нового процесса (получение идентификатора, выделение памяти, инициализация блока управления и постановка в очередь на выполнение). На всё это требуется пару секунд. О каких часах идёт речь?
Ананасы, интересна такая фигня. В наличие есть слабый ноут и мощный стационарник. В силу определённых причин работаю за ноутом. Но на нём приложение собирается за 15 минут, когда на стационарнике за 5. И вот что мне интересно - могу ли я, работая за ноутом, каким-то хуем собирать приложение на компе и получать на ноуте готовый .exe и .pdb?
>>1220245 А что меняется когда я использую std::thread? Если завести отдельный поток с вызовом system, то он будет ждать, а если выполнять в основном потоке то нет? Нихуя не понял. мимо
>>1220275 Если тебе надо прибить процесс из программы и название его уникально, то можешь опять использовать std::system std::system(R"("taskkill /IM chrome.exe")"); Если таких процессов много, то через win api CreateProcess() создаёшь процесс и получаешь от неё process handle, а потом TerminateProcess(process handle).
>>1220333 Ну да. Отправляешь файлы на комп, запускаешь на компе компилятор, отправляешь с компа .exe и .pdb. Придется обмазаться файлообменом и сценариями.
>>1220488 >Он конпелируется поверх .NET и от C# почти ничем не отличается, кроме C++-подобного синтаксиса. Из него можно обращаться к обычному С++ коду. Поэтому на C++/cli удобно писать обертки для плюсовых классов.
>>1220487 >>1220495 Ок, может тогда подскажите, как ВС починить, если идеи есть. В общем, отказывается компилировать код. Любой. Пишет, что проект устарел, предлагает пересобрать и появляется ошибка. Переустанавливал ВС несколько раз, сейчас снова поставил -- то же самое. Гугл не спасает -- решений нет, хотя у многих такая хуйня.
>>1220506 Первое правило использования вижуал студии - всегда только пустые приложения. Всю МС парашу прегенеренную не стоит юзать для крестов. В предыдущем кейсе мне думается ты что-то наворотил с прекомпилед хедерами (стдафкс которые). Они как-то очень через сраку работают
>>1220507 Да это сам вижуал так работает, я хз что делать. Можешь любой проект скинуть, он не соберется. Ощущение, что только переустановкой винды пофиксится все.
Можно как-то ту хуйню из первого моего поста через код блокс запустить? Я ебанусь винду менять, другого пеки нет.
>>1220513 Исключение. Кидается при исполнении программы. Здесь ты намекаешь, что у меня может произойти разыменование nullptr. Но там не должен возникать nullptr, это такой инвариант, который нигде не нарушается по задумке. Поэтому мне кажется лишней еще одна проверка.
Если не так понял, то скажи, что ты имеешь в виду?
>>1220508 > Да это сам вижуал так работает, я хз что делать. Добавь в начало своего Source.cpp: #include "stdafx.h" Либо в свойствах файла Source.cpp поставь precompiled headers "не использовать".
Анон, возможно у меня вопрос не очень рилейтед, но. Пишу софтинку, которая втч удаляет файлы. У моего железа\системы есть какой-то баг, который периодически препятствует многократному последовательному удалению файлов. Т.е. например удаление ста файлов через проводник работает нормально, а удаление через фар сотни файлов - уже как повезёт. Я это обошёл в дебаг-версии удалением через std::system("erase \filename.rxr"); Предположив что этот баг может быть не только у меня, я хочу обойти его и в релиз версии. remove("filename.rxr") вызывает этот баг. Создание нового объекта, который удаляет файл, а затем умирает - тоже вызывает этот баг. Какие есть варианты для того чтобы сделать удаление устойчивое к подобной проблеме?
>>1220001 Спасибо, эти штуки-то как раз понятны. Я у Страуструпа о них читал. А вот вопрос мой был о предыдущей задаче, 7, а не 8. Там требуются какие-то placement new и создание своего псевдо-массива-вектора для хранения типов без операции присвоения.
size_t array_size; // аргументы конструктора - количество элементов и значение по-умолчанию T value; char☆ raw = new char[sizeof(T)☆array_size]; // (1) выделили сначала память на все элементы T☆ elements = new (raw) T[array_size]; // (2) потом создали массив в ней
Хорошо, а как заполнять? Допустим, циклом пробежаться
for(size_t i = 0; i!=array_size; ++i) elements = new (raw+(i☆sizeof(T))) T(value); // смещаемся в этом указателе на память elements = new T(value); // или достаточно (1) что массив на ней создали?
А с как быть с тем, что присвоение запрещено? Вот моя гипотеза: for(size_t i = 0; i!=array_size; ++i) static_cast<T☆>(raw+i☆sizeof(T)) = new T(value);
Так правильно или тогда становится избыточным (2) и как обращаться к этим элементам потом?
Нужен совет мудрых!!! >Написать программу, формирующую по исходному BMP файлу новый BMP файл, в котором правая половина является зеркальным отражением левой Как подобное реализовать, ведь в BMP данные записаны построчно снизу вверх, ничего в голову даже не лезет, только очень сложные костыли которые вряд ли сработают
>>1220866 В гугле же есть ответы. Ставишь компилятор VS (то есть отдельно без установки студии) и вызываешь его из CB с ключом /clr. Второй вариант это поставить виртуальную машину и накатить на неё винду и студию.
>>1220959 Да, я понимаю, как это реализовать, я работал с bmp. А пересказал задание я для того, чтобы ты его прочитал. Пересказываю еще раз, только подробнее, план таков: 1) Прочитать спецификацию на формат bmp. 2) Выяснить, что попиксельные данные изображения в файле находятся по такому-то сдвигу. Узнать, где взять этот сдвиг. 3) Начать читать по сдвигу по столько байт, сколько указано где-то еще. Для этого надо опять прочитать документацию. 4) См. предыдущий пост.
>>1220936 >Что скажете об ide code::blocks? Собираюсь вкатываться, и оно пока больше всего приглянулось. меньше всего visual studio > Зайди на какой-нибудь агрегатор вакансий (тот же hh) и в поиске введи названия разных ide. Выбери из топ 3 то, что тебе больше нравится (VS, QtCreator и кто-то ещё). Не стоит тратить время на освоение маловостребованных ide.
>>1220936 VS с решарпером под плюсы офигенна, даже инклуды автоматом ставит, все кейсы по енуму и тп. КютКреатор почти так же хорош, при включенном статическом анализе кода подсвечивает все ерроры и варнинги до компиляции.
>>1220972 Хуёвый совет - выбирать ide на будущее. IDE должна быть удобной сейчас, для обучения. Кодблокс подойдет, он как раз для laba1.cpp.
>>1221072 >Студия де-факто стандарт индустрии. Под винду мейнстрим, но только под винду, а винда сама по себе не стандарт индустрии, лол. Фишка студии в том что это универсальный солдат под windows, не более.
>>1221072 >Студия де-факто стандарт индустрии. Если ты пишешь какое-то говно под винду то может и да, и то я дома сижу с CLion, ибо студия это говно. А на линуксе это в основном Eclipse, хоть я его и не навижу и не понимаю как этой парашей пользоваться. На линуксе сначала юзал QtCreator, потом с появлением Clion только на нем и сижу.
>>1221088 Я никак иначе не пробовал кодить, кроме как в MVS. (Онлайн компиляторы для мелких кусков не в счет) Нужно ли изучать GCC/clang или что-то там еще? Я могу считаться полноценным программером, если не знаю на практике других сред?
>>1221293 >Студия это говно. 0 аргументации, ничего. Просто студия это говно. Хорошо, проходи мимо. Дяди тут деньги зарабатывают. Да не гори ты так, студентик. Студия говно, потому, что компилятор там говно + студия говно потому, что она только под винду + студия говно потому, что она тупая как пиздец, и ее интелисенс глубоко отсасывает по сравнению с CLion + студия говно, потому что они нихуя не поддерживает CMake и Make + студия говно потому что она не поддерживает GCC + студия говно потому что это блядский майкрософт, что уже по определению говно.
Ах да, если что дяди делают деньги разрабатывая сервера и распределенные системы под linux. На винду делают либо игрушки для школо-пидоров, либо всякое офисное говно.
В общем, любой уважающий себя разработчик не будет просто так шквариться об винду и студию.
Что стало с языком C++? Страуструп пишет, что для совершенной пересылки нужен std::forward() и показывает это на таком примере: https://pastebin.com/UeamWjJY
А у меня то, что он приводит как проблему и причину применять forward работает спокойно и без всякой дополнительной возни. Что-то изменилось в языке? Советы 2008 года устарели и теперь они не актуальны? Что не так?
>>1221346 Я горю исключительно от твоей тупости. Что такое - компилятор говно? Что такое - тупая как пиздец? Что ты вообще несешь? Чем тебе майкрософт не угодил? В красноглазую парашу нассал? Симейк поддерживается, Мейк - совсем ебнулся чтоли в 2018 то? GCC поддерживается.
Таблетки выпей "уважающий себя разработчик", и иди laba2.cpp допиши.
>>1221370 Gnu C Compiler изначально, но теперь, видимо, основной компилятор для C++ для тех, кто в линуксе. clang это какая-то составная часть еще одного компилятора, тут уже не знаю. IDE это где всё уже на месте и достаточно кнопочку нажать, как раз мой уровень владения. Нужно уметь писать из строки и скачивать трансляторы/компиляторы/линковщики/компоновщики и танцевать с этими бубнами или это уже пережиток прошлого и можно быть полноценным прогером из готовой среды? Или засмеют?
>>1221393 Можно как для ДЦП-додика-патау, почему Страуструп пишет, что должно выдать ошибку компиляции, а у меня запускается и всё норм? https://ideone.com/QJ1Ij1
Для чего нужны, статью читал. Но вот дошло до примеров — и ступор. Примеры противоречат постановке проблемы. Проблемы как бы и нет вовсе. Должно не запускаться, но всё ж работает. Или это unspecified behaviour моего компилятора и просто нельзя на такое полагаться?
>>1221397 Ну представь, что в примере, который я скидывал, у C не было бы конструктора C( const Val& ). Тогда вариант без форварда действительно не скомпилируется.
Зачем всё это? Чтобы при создании объекта через функцию конструктор мог принимать rvalue ссылки и соответственно применять разрушающее копирование (в смысле перемещение). Без форварда параметров конструктор получит const lvalue и будет вынужден копировать все данные. А в твоем коде в конструктор передается вообще указатель. Очевидно, что будет работать и так.
>>1221434 Бля ты такой тупой, просто пиздец. Там имеется ввиду, что помимо работы я использую CLion дома, где у меня винда стоит, а не VS.
>visual assist Ага, чтоб это говно нормально работало надо еще кучу плагинов по конским ценам покупать.
Вопрос на самом деле даже не в студии, а том, что какой адекватный человек будет писать на С++ под виндой? Для C# студия да вроде норм, ибо она под это заточена, но по С++ она отсасывает полностью во всем.
>>1221425 Спасибо. Вникаю. Тяжеловато. Есть ли смысл не глядя ставить forward() там, где сомневаешься? Или бывают вредные побочные эффекты? И еще уточнение. Я правильно понимаю, что по результату работы std::move(x) это то же самое, что static_cast<decltype(x)&&>(x)?
>>1221434 Позвольте встрять с вопросом. Интелисенс вообще нужен? Я просто нубас и пока что иногда подглядываю, что он там предлагает, чтобы различать точку и стрелку, когда имею дело с указателем. Но зачем он опытному разработчику?
>>1221460 Например позволяет не лазить по заголовкам, чтобы выяснить какие параметры принимает тот или иной метод и как он перегружен. Ставишь каретку в скобки - ctrl+shift+space и он тебе показывает полную сигнатуру метода и его вариации.
>>1221456 >static_cast<decltype(x)&&>(x) Если x будет l-value, то decltype вернёт T_x&, и получится static_cast<T_x& &&>(x). Затем произойдёт сжатие ссылки T_x& && до T_x& и в результате будет static_cast<T_x&>(x). А надо, чтобы было T_x&&. Поэтому >>1221466
>>1221476 Я-то работаю уже лет почти 10 лет и понимаю, кому и для чего нужна винда, а ты видимо нет. Если даже брать всякие десктопные приложухи, коих малая часть по сравнению с кол-вом серверного ПО, которое в абсолютном большинстве под линукс, и если отбросить всякие кроссплатформенные приложухи типа браузеров, мессенджеров, видеоплееров и т.п ( хотя больше то и не надо на компе ничего в 2018-то году ), то получается, что конкретно под винду на С++ пишется очень мало софта и в основном это игры, для всего остального уже давно юзают С#, ибо он как ты сказал, задача определяет инструменты, и кому надо себе мозги ебать с плюсами, когда на Си шарпе можно сделать это в 25 раз быстрее и надежнее.
>>1221484 Там будет плавающий результат в зависимости от категории выражения. Если будет выведен &, то произойдёт вызов конструктора копирования или оператора присваивания копированием.
>>1221490 Предположу, что ты все 10 лет писал серверное по под линуксом, а по выходным сидел дома.
Давай начнём наш экскурс, например, с по для трёхмерного моделирования (спектр применения от игр и анимации до инженерного проектирования и инженерных рассчётов). https://en.wikipedia.org/wiki/Comparison_of_3D_computer_graphics_software Как ни странно, но почти всё работает подвендой. Далее, следуя твоей логике получается что всё надо писать на C#. Но там же всякие вычи, алгебра, дифгем, матан, который на интерпретируемом языке никто писать не станет?
>>1221515 Даже если ты возьмешь все фотошопы, все 3д редакторы, все кады и прочую поеботу с графеном - это будет 0.001 часть от всего софта который пишется.
Ладно, чтобы тебе было понятнее. Google, Amazon, Yandex, Facebook, Vk и т.д Все это написано под линукс, представь сколько там людей работает, сколько кода написано, и сколько человеко-часов вложенно. А теперь сравни все это с какими-то 3д редакторами, которые юзают только профессионалы, а те сервисы юзают почти все жители на земле.
>C# >интерпретируемый Обосрался с этого, сразу видно твой уровень.
>>1221534 Вот это манёвры. Сначала ты говоришь, что всякая попса типа игр и дестктопного по, которым пользуется кучу народу ежедневно это хуета, а вот серверное по это круто. Потом ты переобуваешься и говоришь - не не, инженерное по для спецов это хуета, то ли дело вконтактик, яндекс такси, магазин на диване.
Кратко выводы. После задействования forward() - становится возможно передавать rvalue по значению, - передавать копируемое lvalue и всякие rvalue по неконстантной lvalue ссылке становится невозможно, - передача по константной lvalue ссылке не изменяется, - ранее недоступная передача по rvalue ссылке становится доступна для всех рассмотренных типов, - покуда тип это определяет, передача безымянного по значению подменяется передачей по rvalue ссылке, - Я забыл рассмотреть тип, который можно копировать, но нельзя перемещать.
>>1221632 Ты забыл ещё const T&& ссылки. Тогда компилятор будет вылетать с ошибкой, если прислана не rvalue ссылка и никогда не будет копировать аргумент.
>>1220893 А в чем проблема считать данные в массив чаров, привести его к массиву rgbtriple/rgbquad, реверснуть его, засенить одну половину изображения другой, снова реверснуть и записать в файл?
Йо, есть задачка, которая требует много (~20) операторов разветвления (if else). По сути это задача путника, что идет по дороге, на которой он может повернуть на любую из них. Из-за этого приходиться писать гигантские конструкция
if(leftSide) { // Что-то делает классное if(newLeftSide) { // Еще что-то классное
if(...) { ... } else { ... }
} else if(newRightSide) { // Еще что-то классное
...
}
} else if(rightSide) {
...
}
В общем тоска. Выглядит это громоздко и нечитаемо (почти). Какие существуют подходы к организации подобных длинных разветвленных алгоритмов?
>>1221900 1. Совместимость среды. Если не тестировал программу на той же конфигурации (ОСь, установленные программы, "железные" характеристики), что будет у заказчика, то ожидай проблем. 2. Выключение программы вместо исключений и исправление проблем. Если у тебя прога может вырубиться на 23 минуте обработке данных из-за любого exception встреченного по пути, то это большая беда. Обязательно сделай возможность восстановления данных при аварийном выключении программы, чтобы при повторном запуске не терять пользователь не терял время. 3. Системные пути. Не забудь, что системные пути у тебя и у заказчика - это разные пути. В принципе это отсылает к пункту 1. 4. Графический интерфейс. Должна быть привязка к разрешению и типу экрана. Иначе всё поедет к чертям собачим. Опять таки - пункт 1. 5. Кодировка текста. Твоей кодировки может не быть у заказчика. Особенно, то что касается кириллицы. И опять это пункт 1.
>>1224300 Я даже не знаю как выразить свои чувства в слова. Хорошо. Я знаю конструкцию switch case. Как она избавит код от громоздкости?
switch path case Left .... switch newPath case LeftSide .... switch newNewPathLeft case LeftLeftSide .... case RightSide switch newNewPathRight case LeftLeftSide ... case Right ....
>>1224347 Хотя я что-то упоролся вчера вечером. Решение очевидно. Просто вынести каждую конструкцию if else в отдельные методы. Это уменьшит громоздкость и сложность кода. Программировать за полночь всегда плохая идея.
Начну со второго. Этот >>1224155 товарищ еще не выучил основы языка (самые-самые основы), а бросается задавать вопросы по некоей задаче. Он смахивает на студента, которому завтра сдавать лабу, а он ничего не знает. Студенты с лабами и вопросами по синтаксису идут на хуй, так написано в шапке.
С первым всё гораздо интереснее. Не буду перетирать его косточки, скажу только что не мир крутится вокруг программиста, а программист крутится вокруг заказчика с его боевыми задачами, за которые он готов платить программисту, и это заказчик задает вводные (в том числе выбирает ОС), а не программист. Нежелание программиста писать кроссплатформенные программы я считаю некомпетенцией, а "заказчик идет на хуй ставить нормальную ось" - попыткой прикрыть свою некомпетенцию снобизмом. Когда софт, за который заказчик тебе заплатил чтобы тот работал, не будет работать - на хуй пойдешь ты, а не заказчик.
>>1224782 > Нежелание программиста писать кроссплатформенные программы я считаю некомпетенцией, а "заказчик идет на хуй ставить нормальную ось Хорошо, а нужно ли поддерживать всякое устаревшее дерьмо как винда 7?
>>1224850 А чего в ней устаревшего? Лучше бы windows xp в пример привёл. Там даже нормальных примитивов для мультипоточности нету, приходится всё через медленные костыли делать.
>>1224782 > Начну со второго. Этот >>1224155 товарищ еще не выучил основы языка (самые-самые основы), а бросается задавать вопросы по некоей задаче. Какие я должен выучить основы? Я прочитал несколько книг, и это по твоему незнание основ?
>>1224782 >Этот >>1224155 товарищ еще не выучил основы языка (самые-самые основы) Расскажи, что же это за "основы"? Ох, и не дай бог ты сейчас начнешь залечивать мне про конструкцию switch case (ну, ты в глаза ебешься когда читаешь сообщения - это нормально).
А потом может быть объяснишь как организовать в коде разветвленное дерево вариантов событий? Классический способ организовать код в маленькие, но тем не менее смысловые методы я уже привел, что ты можешь предложить?
>>1224850 У тебя может быть какое угодно мнение о том что устаревшее, а что нет. Если большинству заказчиков необходим софт под винду 7, значит ты будешь писать софт под винду 7, тем более это не rocket science.
>>1224858 Листать оглавление != читать. Как ты мог прочитать несколько книг по плюсам и не знать что такое switch, вообще не сталкиваться? Такие ошибки характерны для вкатывальщиков и студентов, я уже говорил. Скорее всего ты не читал никаких книг и пытаешься меня обмануть.
>>1224871 Причем тут твои "смысловые методы"? Тебе нужно как-то выбирать между ними, это не связанные вопросы. Вопрос был не в том как "организовать код в методы", а в том как передать управление нужному блоку кода из десятка имеющихся, для этого в общем нужен switch-case, что непонятно?
>>1224908 >Вопрос был не в том, а в том как передать управление нужному блоку кода Ааа. Да, перечитал свой вопрос, он и правда был некорректен. Идея изначально была в том, что есть древовидная структура с одним началом и множеством концов и дохерища ветвей. Вопрос был как организовать компактно и красиво процесс прохождения этого дерева от корня к вершине при том, что в зависимости от различных внешних обстоятельств некоторые пути могут оказаться закрытыми, а другие наоборот открытыми.
>>1225103 Поэтому меня и удивил ответ про switch-case. В данной ситуации он дает тот же результат, что и if else - слишком громоздко. Легко запутаться.
>>1224908 > Скорее всего ты не читал никаких книг и пытаешься меня обмануть. Мимо другой анон, дай пару советов начинающим, как нормально читать книги?
>>1225181 Вот у меня есть всего один совет, но очень, ОЧЕНЬ важный. Правильно читать книги так - после каждого нового описанного в книге синтаксического / алгоритмического / архитектурного средства открывать среду и реализовывать его, а после каждого пятого - все предыдущие пять. Книги с задачами Праты для этого очень хороши, называются "Язык программирования С (C++), лекции и упражнения".
>>1225247 Забыл сказать, это годится только для начинающего, вкатывальщика, чтобы голова побыстрее на место встала. Каждая новая книга будет сообщать все меньше собственно нового, и можно будет читать по диагонали. При этом все равно проверяя себя задачами, потому что они и тренируют голову (то, что называется в быту "алгоритмы"), и тренируют руки (умение шлепать код по четкому описанию) и дают оценку своего уровня, которая в большинстве случаев неприятно удивляет. Я не берусь судить о том, сколько времени нужно провести в таком режиме, но когда ты можешь решить некую задачу, охватывающую всё что ты прошёл, и сделать это быстро, не отвлекаясь на медитацию - значит ты всё усвоил. Соответственно для C++ по Прате: нашлепал добавление-удаление-редактирование-поиск-запись-в-файл-чтение-из-файла на плюсах (корректное, не вылетающее и без ошибок), не напроектировав херню в классах, не получив ругань valgrind - вроде освоил. Повторил все то же самое через неделю - ну да, точно освоил. Пора двигаться дальше.
Доброго вечера аноны, столкнулся с такой проблемой при создании двумерного динамического массива. Учусь в MVS 2013. часть кода в котором ошибка вы видите ниже. описание ошибок видна на пик. Помогите кто может. #include <iostream> #include <cstdlib> using namespace std; int main() { int row=0; int col=0; cin >> row; cin >> col;
int arr = new int *[row]; for (int i = 0; i < row; i++) { int arr = new int[col]; }
Ответы на все вопросы:
- http://en.cppreference.com/w/
- http://www.cplusplus.com/reference/
Прошлый: