Вы видите копию треда, сохраненную 10 марта 2017 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Дремлет код крестовый;
Весь рантайм и все баги
Белым снегом замело…
И шаблоны там, по коду,
В семь гигов при компиляции
Поджигают ваш пукан.
На огонь бежит сугробом
Со звездой толпа нюфагов,
Под оконцами стучатся,
И «Слава Бьярне» напевают.
«Крестобляди! Крестобляди!»
Раздается там и тут.
И в нестройном блядском хоре
Так таинственна, чиста,
Так отрадна весть святая
О рождении стандарта…
Шапка: https://github.com/sosachbot/cppthreadhat/wiki
Прошлый: https://2ch.hk/pr/res/892147.html (М)
Алсо, знания javascript будет ли обеспечивать какой-то плюс в изучении?
С того чтоб сесть и подумать надо ли оно тебе.
1200 рублей
https://habrahabr.ru/post/117996/
Вот это изи.
Но нужно что-то поновее
Последние книги Саттера, лол. К тебя осталось мало времени, скоро новый стандарт выйдет, и будешь его драфты зубрить, так что поспеши.
Выбири Дваву
Посоветуйте альтернативу libevent для написания простейшего http-сервера на C++ (libevent как я понял не дружит с win х64, что меня не устраивает).
Есть еще libuv и libеv, но там вроде бы "из коробки" в 10 строчек кода веб-сервер не запустишь - нужно писать свои велики.
Есть что-то еще?
Он почти в 10 строк пишется и на сокетах/epoll/kqueue.
Именно из плюсовых — boost.asio (очень многословно и оверинжинирнуто), casablanca (очень няшно, на последних плюсах, советую), ещё какой нибудь libsocket.
>libevent как я понял не дружит с win х64
Что именно не дружит? У меня конпелировалось и работало в x64.
Адекватного и такого же минималистичного нету. Я использовал для подобных задач libev.
1 то что сети нет - это не баг, а фича
2 модули у силанга и студии есть.
3 корутины давно уже есть.
Некоторые компиляторы записывают нулевые байты в исполняемый файл. Вот и причина такого размера.
Пример: шланг 3.5 https://godbolt.org/g/gFRcuK
гсс 5.1: https://godbolt.org/g/GvQwBZ
>>904702
>>904704
Плюнул на использование либ. Взял за основу пример на сокетах
https://code-live.ru/post/cpp-http-server-over-sockets/
В чем я сосну?
У тебя же данные которые должны сохранятся между запусками программы. Следовательно они должны быть записаны в сегменте данных. Дальше зависит от оптимизаций компилятора. Твой вариант - оптимизирована скорость запуска за счет размера программы (в статической памяти хранится полностью весь массив в "готовом" состоянии). В одном из вариантов продемонстрированным аноном выше оптимизирован размер программы за счет скорости запуска - хранится только имеющая смысл часть массива (нулевые байты отброшены), а полностью массив будет создан и подготовлен уже в рантайме.
>>Твой вариант - оптимизирована скорость запуска за счет размера программы (в статической памяти хранится полностью весь массив в "готовом" состоянии)
Я конечно новичок и писать программы толком не умею, но с каких это пор копирование в памяти стало более медленным чем чтение с диска?
>>сохранятся
Хотя всё ясно
Ты дурак? Зачем ты эту хуйню пишешь?
Во всём. По жизни.
>>904755
>>904754
Я вернулся. Так вот еще чего могу добавить. Это случается, когда я делаю двумерный массив. То есть с обычным такого не происходит. Все равно, спасибо за ваши версии)
Все.
Какая связь? libevent это про обработку событий, а не про сокеты.
Это случается не из-за того что ты делаешь двумерный массив. Это случается из-за того, что ты образуешь огромный литерал задавая первые его элемент.
Когда ты напишешь char value[max] = { 'a', 'b', 'c' } размер файла будет пропорционально велик. Дело в том, что задавая таким образом массив ты говоришь: хочу литерал, первые три байта которого - 'a', 'b', 'c', остальное заполните нулями. Это будет статический блок памяти, который должен быть загружен при запуске программы. Храниться он в data-блоке.
https://en.wikipedia.org/wiki/Data_segment
С плюсовиками которые будут стоить меньше джавистов перформанс только упадет, из каждой пизды будут лезть баги и скорость разработки упадет ниже твоего айсикью.
Когда ты набираешь лоу квалифаед шит готовый работать за еду и твой язык не подтирает им зад — это вообще меньшая из проблем, учитывая что раньше все работало на жаве и рамы хоть жопой жри.
Ну, ты же на полном серьезе считаешь что стоимость программиста зависит от языка, а не решаемых задач, и что плюсовики обойдутся дешевле. Так вот те что обойдутся дешевле — никогда не отобьют даже сотой части денег вложенной в ту же жвм, которая тебе достается халявно.
Потому что под нижней планке зарплаты работать пойдут разве что байтоебы с заводов (та самая часть рынка плюсов, которая опускает показатель средней зп), у которых развитие остановилось на "ой бля битмаска битмаска не выровнять сука блять блять классы это оверхед нахуй rtti я все наебашу на юнионах всего-то за пару дней".
Учитывая популярность джавы я сильно сомневаюсь, что джавист дороже равного по скилу плюсовика. Рыночек насыщен.
>банковский софт
>транзакции, базы, CGI, веб, хуеб
>c++
Чтобы это работало и не рассыпалось придется искать плюсовиков значимо более дороже средних жава-сеньеров. Плохая затея. Но перфоманс вырастет, да, в теории.
> архитектура программного обеспечения и все такое, молодое направление и вся хуйня
С каких пор оно молодое? Думаю стоит почитать банду четырех, рядовому программисту точно пригодится, проектировщику наверное тоже.
На счет популярности профессии не скажу, в крупных компаниях с большими проектами точно есть.
хули вы сразу асинхронку пишите когда вам нужен "простейший" http сервер
вам же не осилить это говно
asio
Про паттерны начитался уже, в том числе эту книгу тоже. Думаю, грызть или нет уже более специфичные области проектирования (конкретно разбиение на системы, подсистемы, виды, документирование и прочее и прочее), несмотря на то, что это полезно в любом случае, не хотелось бы тратить свое время впустую.
На линуксе тебе никаких MINGW устанавливать не нужно. Там GCC и G++ идут по дефолту при установке. В том же /home. создаёшь папку, например ~/home/workspace/cpp. Далее выбираешь в консоли эту папку (необязательно, но удобно), на Ubuntu команда cd /workspace/cpp. И компилируешь g++ main.cpp
Хотя Торвальдс критиковал версию 4,9, на линуксе стоит 4,9,2 на винде 5,3, вот если можно было обновить в линуксе до более новой версии как например youtube-dl -U, было бы здорово
Пиздец, как ты в линукс забрался с неумением компилировать. Там тебе достаточно один аргумент указать при конфигурации (а именно --prefix, чтобы не серануть мимо) и собрать гусей. Что может быть сложнее-то?!
Вопрос первый: слева на картинке 2 ситуации. Почему ситуация Б легальна, а ситуация А уже сообщает об ошибке памяти. Я попробовал сделать new int [26], тогда максимальное число значений массива стало 29. Компилятор gсс/g++.
Второй вопрос: можно ли другим способом динамично добавлять объекты во время работы программы? То чем я сейчас пользуюсь на картинке справа.
Я по книжке учусь, векторы после new и delete идут. Вроде говорят, что векторы умнее массивов, но я пока с ними даже не сталкивался.
А вот про ситуации А и Б можно тут почитать http://ru.stackoverflow.com/questions/297649/Массивы-нулевой-длины
Спасибо. Проверю другим компилятором.
>Почему ситуация Б легальна, а ситуация А уже сообщает об ошибке памяти.
Нипочему, просто повезло с Б. Оба примера могут падать на другой машине/другом компиляторе. Тебе мама разве не говорила, что чтение/запись за границы маасива это UB?
у меня в лекции написано так:
Наполнение - количество объектных полей может меняться от нуля до достаточно больших значений (реализуется с помощью списков)
спасибо, чекну
Странные названия.
Я больше знаком с агрегированием и композицией. Только в твоих терминах агрегирование - композиция, а композиция - наполнение ("мои" термины перед дефисом).
Если кратко, композиция подразумевает такую связь объектов, при котором один объект (родитель) становится владельцем другого или других (дочерних). При уничтожении родителя уничтожаются все дочерние объекты.
При агрегации один объект (родитель) лишь хранит другие (дочерние), но не является их хозяином, то есть при уничтожении родителя дочерние объекты не уничтожаются, в отличии от агрегирования.
Подробнее можешь посмотреть тут:
https://ru.wikipedia.org/wiki/Агрегирование_(программирование)
Бля не то написал, видимо. ЩАс читанул пару абзацев из той методички и понял, что ошибся с терминами.
Говорила. После того как это заработало я полез в гугл. Потом сюда. На винде это не заработало совсем. Ну раз так неправильно, то делать так наверное не стоит.
Пик забыл
Тут не в коде дело, но сделал наглядно: http://ideone.com/MEjyN0
Тут даже видно, в какой момент всё ломается. Почему так?
delete можно применять только к указателям возвращенным new. Установить указатель на случайную ячейку памяти и заюзать туда delete нихуя не даст нормального.
int* arr = new int[3];
Это, по-твоему, указатель на случайную ячейку памяти? Точно такой же указатель "на случайную ячейку памяти" есть в f(), только там он нормально удаляется.
http://ideone.com/e2wQbn
У тебя переменной b не существует после выхода из if else. Можно сделать указатель на void, а в if else выделить память нужного типа но мнекажется эта хуйня какая-то
Всё. Понял как сделать. Код писать не буду т.к. с телефона.
>Откуда взялся этот адрес? Рандом?
да, так линкер положил. но можно задрочить линкер, чтобы складывал по определенным адресам
>Это адрес в виртуальной памяти?
да, очевидно. адресами в реальной памяти заведует только меморименеджер в ядре
>Ниже упомянут что для mov нужен адрес в реальной памяти. Разве есть какаята проблема с переводом из виртуальный в реальную? Нужно же просто знать таблицу страниц виртуальной памяти. Она всегла есть независимо от того какую программу запускать.
wat
Ну там не совсем рандом. 0x8048 это не рандом
> Откуда взялся этот адрес? Рандом?
Если ты про 0x8048470 то там (скорее всего) будет именно такое число, но само по себе оно взято произвольно. Возможно там есть какая-то кулстори почему получилось именно такое число - но по сути оно случайно.
> Ниже упомянут что для mov нужен адрес в реальной памяти. Разве есть какаята проблема с переводом из виртуальный в реальную?
С этим ебется ОС. Программа оперирует с виртуальной паматью, так как будто это реальная - определить что ей подсовывают именно виртуальную память она может только по косвенным признакам (например похожесть адресов выделенной памяти при каждом запуске).
Скачай и установи
Там написано что делать. А обновлять — мне лень, если есть желающие помочь покидайте свежих ссылок.
В 2020 заходи.
[]<>(){} разобрался.
>14 в 2к17-м
В каком-нибудь gcc 8 уже наверное все потенциальные фичи реализованы
https://gcc.gnu.org/projects/cxx-status.html#cxx1z
http://clang.llvm.org/cxx_status.html
В 7-м гцц уже все есть кроме 1-й фичи, а в последних шлангах почти все есть.
Архитектура познаётся только на практике. Книжки грызть не имеет смысла, потому что в этой области они мало что имеют общего с реальность.
Для рашки это хороший вариант для одиночки, если еще общагу прилагают.
Если по еде и жилью обеспечен, то считай ты успешен. 5к как раз на одежду хватит.
Это скорее всего без жилья.
Когда искал работу видел вариант за 4к - в местной областной больничке электротехником, лампочки менять, проводку, и т.п.
Но 4к - этого даже на жилье не хватит, а свое жилье больничка не предоставляет. Не говоря уже о питании.
И как там работать предлагают?
Либо тратить 3к на еду и жить на улице, либо оплачивать коммуналку этими 4к и питаться святым духом.
ИМХО дворником за 8 выгоднее - можно и квартиру оплатить и еду. Но на одежду уже не хватает.
И вот как с такими ЗП выживать?
А я б за пюрешку с сосисками поработал. У меня как раз уровень знаний C++ подходящий: две прочитанные книги. А так хоть опыт какой.
Для матем атика есть биржи, где можно нехило намахинировать.
Для экон омика есть черная бухгалтерия.
И т.д.
Mate
Сразу после того, как деление на 0 и обращение по нулевому указателю станет defined behaviour
@
УДАЛИЛ
Нет ни одной.
Нужно это делать быстро, поэтому решающим фактором можно считать размер изображения, поэтому нужно сделать скрин, сжать его, засунуть в буфер и отправить;
когда я использую https://msdn.microsoft.com/en-us/library/windows/desktop/dd183402(v=vs.85).aspx , на выходе получается 8 мб, причем если пересохранить любым редактором в .jpg размер будет 300 кб (!) без существенной потери читаемости.
Нагуглил только класс CImage, который не включен в инклюды gcc.
Все остальные предлагают пересылать все 8 мб.
Берешь ffmpeg, заворачиваешь стрим на него, он работает быстро, убирает избыточность, сильно снижает битрейт практически без потери качества. На другой стороне разворачиваешь стрим любым видеоплеером.
Это выгоднее, чем пережимать покадрово в жипеги или стримить битмапы. И велосипеды не нужны - все уже готовое.
Хочу перекатиться из пхп в си ++. Какой стек и какое приложение порекомендуете сделать в качестве хоум проекта для джуна?
конпилятор
Как на си или си++ реализовать полиморфизм кода, чтобы функции каждый раз компилировались по-разному? Есть ли для этого какие-то средства метапрограмминга? Например, чтобы вместо вызова NtMapViewOfSection генерировалось
__asm nop
__asm nop
__asm xynta
call NtMapViewOfSection
__asm govno
Заебатая хуйня, для вебки то, что нужно.
То есть, за одну итерацию я беру битмап, хуярю однокадровое видео из этого битмапа, а с другой стороны воспроизвожу по одному видео за пакет? Это прокатит?
>>909406
Если все понимаешь - почему бы и не подсказать, я же не платину спрашиваю, а вполне конкретные вещи.
Самым прямым. Шаблоны - по определению полиморфизм. Ты объясни по-человечески, что тебе надо?
Если что-то нормальное нужно то SFML, например, там даже вроде книга есть с примером разработки игры. Если тебе совсем просто попробовать то можно прямо на форме рисовать в Qt или VS - но будет выглядеть как гавно, хотя у них там вроде как есть двойная буферизация, но даже тетрис они уже не тянут (так как не предназначены для этого). Но попробовать можно.
Проще снять защиту от записи со страниц с кодом, чем об стековое говно руки выкручивать.
>Проще снять защиту от записи со страниц с кодом, чем об стековое говно руки выкручивать.
Тогда тебе придется выкручивать руки об голый асм-говно, а то и машкоды вручную пердолить. Форт гораздо удобнее.
Форт удобен как макроассемблер плюс маленький и простой рантайм. Стековая машина удобнее регистровой просто без вариантов, поэтому ее в каждую первую ВМ и пихают.
> Стековая машина удобнее регистровой просто без вариантов, поэтому ее в каждую первую ВМ и пихают.
Код для этих ВМ пишут не руками, а компилятором.
Для компилятора стековая машина удобнее, для человека — нет.
Ебанутая какая-то у тебя логика.
Если так посудить - давно под все машины код пишут не руками, так какого хрена везде не стековые машины? Конпеляторам жи удобнее
>Ебанутая какая-то у тебя логика.
Нет, у тебя.
Питоновская VM писалась создателями языка чтобы им было проще компилировать в этот байт-код.
Аналогично JVM затачивалась конкретным создателем компилятора под для упрощения компиляции определённого языка.
И т.д.
>Если так посудить - давно под все машины код пишут не руками, так какого хрена везде не стековые машины? Конпеляторам жи удобнее
Унылое передёргивание.
>Если так посудить - давно под все машины код пишут не руками, так какого хрена везде не стековые машины? Конпеляторам жи удобнее
Очевидно потому, что создатели реальных машин руководствуются удобством компиляции далеко не в первую очередь.
>Для компилятора стековая машина удобнее, для человека — нет
Аллокация регистров - NP-полная задача, на решение которой требуются вычислительные ресурсы, не важно машина их использует или мозг программиста. Плюс форт обычно не чистая стековая машина, почти во всех реализациях есть переменные. Кроме того стеков два, и использование стека возвратов для временного хранения значений значительно уменьшает стековую акробатику. Не говоря о том, что модель с двумя стеками предлагает гораздо более высокий уровень абстракции, к тому же легко воспринимаемый человеком, в отличие от асма с регистрами.
Для компилятора удобнее не стековая машина, а SSA или CPS, по которым можно сразу делать кучу оптимизаций.
>Для компилятора удобнее не стековая машина, а SSA
Спс паржал ещё!
Если для компилятора удобнее SSA, почему же clang выплёвывает LLVM-код не в SSA-форме, а с кучей ячеек памяти, куда по 100 лишних раз пишутся и откуда читаются данные? Только mem2reg-пасс LLVM-а превращает этот ужас в SSA.
Почитай http://llvm.org/docs/tutorial/LangImpl07.html , что ли.
>Аллокация регистров - NP-полная задача, на решение которой требуются вычислительные ресурсы, не важно машина их использует или мозг программиста.
Прадалжаю дико ржать. Если неважно, использовать машину или мозг, зачем вообще машины используют для решения задач?
>почему же clang выплёвывает LLVM-код не в SSA-форме, а с кучей ячеек памяти
Потому что clang и сишка. LLVMу-то полюбасу удобнее нормальный SSA принимать.
>>909755
>зачем вообще машины используют для решения задач?
Ты тред читаешь вообще? Пельмень вверху >>909681 считает, что под регистровую машину (асм) человеку удобнее писать, чем под стековую (форт), что явная чепуха.
>Потому что clang и сишка.
Итак, ты сам опроверг своё утверждение, что компилятору удобнее производить SSA-код.
> Плюс форт обычно не чистая стековая машина, почти во всех реализациях есть переменные.
В большинстве VM есть переменные и инструкции вроде
LOAD, которые снимают с вершины стека адрес и вместо него кладут значение.
> Кроме того стеков два
На асме можно написать библиотечку-реализацию стека и завести себе хоть 500 стеков.
Ты с логикой дружишь вообще? Объектный код делает LLVM, он компилятор, ему удобнее SSA. Clang - транслятор из сишки в формат LLVM, он делает как умеет, с аллокациями на стеке, в надежде, что LLVM дальше все разрулит.
>На асме можно написать библиотечку-реализацию стека и завести себе хоть 500 стеков
А на форте можно написать реализацию асма, и завести себе хоть 500 ассемблеров. Суть в том, что с двухстековой машиной работать ничуть не менее удобно, чем с регистрами в асме.
>Ты с логикой дружишь вообще?
А ты, долбоёб? Речь шла про то, что создатели язычков высокого уровня запиливают под них стековые VM, т.к. под них крайне легко комилировать: высрать код для стековой машины можно просто правильным обходом AST (тут я слегка утрирую, конечно, но в общем это верно)
Ты пришёл и начал тут пиздеть что высирать удобнее не код для стековой машины, а код в SSA-форме и за сей наглый пиздёж был немедленно обоссан.
SSA удобнее для оптимизаций, но компилировать в SSA это pain in the ass. Понял, быдлан?
Я говорил, что компилятору удобнее с SSA или CPS работать на входе. Компилятор - тот, кто из промежуточного представления машинный код делает. Так ясно?
Олсо разницы во что выводить, SSA или стековый язык практически нет - они переводятся друг в друга элементарно.
А вот это уже аргумент.
Действительно, задача распределения данных по куче регистров - очень ресурсоемкая задача. Потому все эти gcc и тормозят.
Для стековых машин конпеляция быстрая и простая - регистр всего 1-2, причем с накоплением, знай себе пихай да напихивай.
Но это и минус: когда у тебя много регистров, можно совершить значительно больше оптимизаций.
Регистр позволяет банально не выгружать данные во время операций, сохраняя нить исполнения (нить вычислений одних и тех же данных) в тактовой доступности (на больших чипах полтакта).
Т.е. регистры позволяют быстро и дешево переключаться между несколькими нитями исполнения одного потока, не трогая кэши и память, работая таким образом сверхбыстрым буфером. А иногда и распараллеливая нити исполнения: многие операции работают сразу с несколькими регистрами параллельно, фактически параллельно выполняя операцию над несколькими нитями исполнения - тут вообще кратный рост скорости, если нити данных грамотно свести в такие регистры.
Зависимость тут походу нелинейная: быстрая оценка говорит что каждый следующий регистр ускоряет код больше, чем предыдущий.
Но регистры стоят очень дорого.
За каждым регистром скрывается сотня переключателей и шин. Все это ест много энергии, снижая энергоэффективность, и понятно, сильно ограничивает тактовую частоту - шины получаются намного длиннее, чем необходимо в случае одного регистра.
Стековые машины этих недостатков не имеют: они просты, миниатюрны, энергоэффективны, могут позволить себе бОльшие частоты, и к тому же дешевы.
Их можно клепать тысячами на той же площади, куда влезает одна регистровая.
Но уровень оптимизаций для них ограничен - код будет исполняться медленнее, чем на регистровых машинах.
Т.е. тут война параллельного кода с последовательным: стековые машины хорошо работают с параллельным кодом, но плохо переваривают последовательный, за счет того что последовательный код для стековых машин сложнее оптимизировать и распараллелить.
А т.к. большая часть кода таки последовательная, регистровые машины в большинстве ситуаций получаются более производительными, чем стековые. За счет этого и живут.
А долгая и сложная конпеляция, дороговизна, сложность, низкая энергоэффективность - необходимая цена, которую приходится платить за производительность.
Где важнее энергоэффективность, надежность, стоимость или много параллельного кода - там будут играть стековые машины.
Но с определенного количества исполнительных устройств (операций), которые удлиняют шины, усложняют, удорожают, снижают частоты и энергоэффективность стековых машин, опять начинают играть регистровые машины.
Т.е. стековые машины пригодны только там, где есть еще и ограничение по исполнительным устройствам, количеству команд.
Для слишком большого количества команд пилить стековую машину неэффективно, и проще запилить регистровую, она выйдет примерно той же сложности +/-, зато появится возможность поднять уровень оптимизаций и ускорить код.
В продаже есть вот какие вкусные стековые машины:
http://www.linux.org.ru/forum/development/5472606
https://geektimes.ru/post/133291/
https://geektimes.ru/post/134057/
20 баксов, 1Вт, 144 ведра, 96 миллиардов операций в секунду. Казалось бы: конфетка!
Но! Оперативка и пзу по 64 ячейки на ведро, т.е. эффективность сильно ограничена, программы маленькие, а данные придется гнать потоком через все ведра, не задерживаясь - памяти ни подо что просто нет.
Инструкций всего 32 - большинство операций придется расписывать как микрокод, разбивая на десятки и сотни шагов.
Такая вот эффективность. 96 гигаопс/с идут коту под хвост: штука эта пригодна только для очень узкой группы потоковых алгоритмов, и только там, где нужна энергоэффективность - на большинстве алгоритмов эти 96 гигаопс/с выйдут медленнее чем 4 гигаопса десктопного одноядерного интела: интел имеет кучу регистров, кучу команд, кучу исполнительных устройств, кучу кэшей/оперативок/пзу, плюс для него оптимизации последовательного кода намного дешевле.
Такие дела.
>>909753
>почему же clang выплёвывает LLVM-код не в SSA-форме, а с кучей ячеек памяти, куда по 100 лишних раз пишутся и откуда читаются данные?
Потому что так дешевле и удобнее.
Программа - это граф потока данных и команд, переменные - узлы.
Конпеляция - сжатие графа. Попытка свести количество переменных к количеству физических регистров.
Чтобы грамотно (оптимально) сжать граф по ширине, нужно перебрать миллионы конфигураций графа. Неграмотно можно сжать дешево, но толку от этого, понятно, ноль.
И чем меньше регистров, тем дороже такое сжатие, труднее сделать это эффективно, чтобы не замедлить программу.
Поэтому выгоднее сжать граф чуть-чуть - до сотен и тысяч регистров. Просто убрать избыточность, самыми простыми и быстрыми методами.
А далее пережать уже к формату конкретной машины - не забывай что LLVM все сводит к формату виртуальной машины, который можно перегнать к любому формату физических машин.
А вот это уже аргумент.
Действительно, задача распределения данных по куче регистров - очень ресурсоемкая задача. Потому все эти gcc и тормозят.
Для стековых машин конпеляция быстрая и простая - регистр всего 1-2, причем с накоплением, знай себе пихай да напихивай.
Но это и минус: когда у тебя много регистров, можно совершить значительно больше оптимизаций.
Регистр позволяет банально не выгружать данные во время операций, сохраняя нить исполнения (нить вычислений одних и тех же данных) в тактовой доступности (на больших чипах полтакта).
Т.е. регистры позволяют быстро и дешево переключаться между несколькими нитями исполнения одного потока, не трогая кэши и память, работая таким образом сверхбыстрым буфером. А иногда и распараллеливая нити исполнения: многие операции работают сразу с несколькими регистрами параллельно, фактически параллельно выполняя операцию над несколькими нитями исполнения - тут вообще кратный рост скорости, если нити данных грамотно свести в такие регистры.
Зависимость тут походу нелинейная: быстрая оценка говорит что каждый следующий регистр ускоряет код больше, чем предыдущий.
Но регистры стоят очень дорого.
За каждым регистром скрывается сотня переключателей и шин. Все это ест много энергии, снижая энергоэффективность, и понятно, сильно ограничивает тактовую частоту - шины получаются намного длиннее, чем необходимо в случае одного регистра.
Стековые машины этих недостатков не имеют: они просты, миниатюрны, энергоэффективны, могут позволить себе бОльшие частоты, и к тому же дешевы.
Их можно клепать тысячами на той же площади, куда влезает одна регистровая.
Но уровень оптимизаций для них ограничен - код будет исполняться медленнее, чем на регистровых машинах.
Т.е. тут война параллельного кода с последовательным: стековые машины хорошо работают с параллельным кодом, но плохо переваривают последовательный, за счет того что последовательный код для стековых машин сложнее оптимизировать и распараллелить.
А т.к. большая часть кода таки последовательная, регистровые машины в большинстве ситуаций получаются более производительными, чем стековые. За счет этого и живут.
А долгая и сложная конпеляция, дороговизна, сложность, низкая энергоэффективность - необходимая цена, которую приходится платить за производительность.
Где важнее энергоэффективность, надежность, стоимость или много параллельного кода - там будут играть стековые машины.
Но с определенного количества исполнительных устройств (операций), которые удлиняют шины, усложняют, удорожают, снижают частоты и энергоэффективность стековых машин, опять начинают играть регистровые машины.
Т.е. стековые машины пригодны только там, где есть еще и ограничение по исполнительным устройствам, количеству команд.
Для слишком большого количества команд пилить стековую машину неэффективно, и проще запилить регистровую, она выйдет примерно той же сложности +/-, зато появится возможность поднять уровень оптимизаций и ускорить код.
В продаже есть вот какие вкусные стековые машины:
http://www.linux.org.ru/forum/development/5472606
https://geektimes.ru/post/133291/
https://geektimes.ru/post/134057/
20 баксов, 1Вт, 144 ведра, 96 миллиардов операций в секунду. Казалось бы: конфетка!
Но! Оперативка и пзу по 64 ячейки на ведро, т.е. эффективность сильно ограничена, программы маленькие, а данные придется гнать потоком через все ведра, не задерживаясь - памяти ни подо что просто нет.
Инструкций всего 32 - большинство операций придется расписывать как микрокод, разбивая на десятки и сотни шагов.
Такая вот эффективность. 96 гигаопс/с идут коту под хвост: штука эта пригодна только для очень узкой группы потоковых алгоритмов, и только там, где нужна энергоэффективность - на большинстве алгоритмов эти 96 гигаопс/с выйдут медленнее чем 4 гигаопса десктопного одноядерного интела: интел имеет кучу регистров, кучу команд, кучу исполнительных устройств, кучу кэшей/оперативок/пзу, плюс для него оптимизации последовательного кода намного дешевле.
Такие дела.
>>909753
>почему же clang выплёвывает LLVM-код не в SSA-форме, а с кучей ячеек памяти, куда по 100 лишних раз пишутся и откуда читаются данные?
Потому что так дешевле и удобнее.
Программа - это граф потока данных и команд, переменные - узлы.
Конпеляция - сжатие графа. Попытка свести количество переменных к количеству физических регистров.
Чтобы грамотно (оптимально) сжать граф по ширине, нужно перебрать миллионы конфигураций графа. Неграмотно можно сжать дешево, но толку от этого, понятно, ноль.
И чем меньше регистров, тем дороже такое сжатие, труднее сделать это эффективно, чтобы не замедлить программу.
Поэтому выгоднее сжать граф чуть-чуть - до сотен и тысяч регистров. Просто убрать избыточность, самыми простыми и быстрыми методами.
А далее пережать уже к формату конкретной машины - не забывай что LLVM все сводит к формату виртуальной машины, который можно перегнать к любому формату физических машин.
В мапе один аргумент - ключ, другой - значение . Можно сделать map<int, tuple<int, string, char, float>>
variant
Если что-то простое то читаешь через std::cin и проверяешь на failbit и badbit. Проблема с std::cin что если нет четких ограничений на ввод (например - или инт или нахуй) то нужно много попыток чтения делать. Если производительность важна, то там да, читаешь в строку потом парсишь. Есть atoi, atof и их друзья.
Все очень простое. Буквально два варианта: пустая строка или число. Если строка пустая, то алгоритм заканчивается, если там число - string переводится в int. Возможность букв не учитываем хотя они вроде все равно в int не сконвертятся. Получается, нужно написать getline(cin, stringname), потом сделать проверку на пробел на первой позиции int n=-1; n=stringname.find(' '); if (n>-1) break;, потом через atoi переводить строку в int. Правильно?
Пойду гуглить atoi.
atoi при ошибке возвращает ноль, так что хуй поймешь ошибка там или просто ввели ноль. Бери stoi, оно исключение бросает.
Простой кодец: http://codepad.org/GWbINr9g
Гцц компиляет нормально.
А вот cl.exe Хуюшки:
$ cl 1.cpp
Оптимизирующий компилятор Microsoft (R) C/C++ версии 19.00.24215.1 для x86
(C) Корпорация Майкрософт (Microsoft Corporation). Все права защищены.
1.cpp
1.cpp(14): error C2059: синтаксическая ошибка: ;
НО, ЕСЛИ РАЗВЕРНУТЬ МАКРОС - ВСЁ НОРМ!!111
Чё за дичь? cl.exe не умеет в многопроходность? Как научить?
Кто нибудь сталкивался?
Це пиздец, но я пофексел: http://codepad.org/DMAwf0U1
Банально вынес 0 в макрос и стало норм. Какой-то баг штудийного конпелятор -__-
В другом браузере её тоже нет. Адблок выключен. Зас попробую зарегаться. А это норм тест? Не слишком лёгкий? После прохождения можно будет хвастаться что я кресты знаю? А если я там зарегаюсь, тест пройду, а работать не буду? Результат не аннулируют?
> А это норм тест?
> Не слишком лёгкий?
> После прохождения можно будет хвастаться что я кресты знаю?
> А если я там зарегаюсь, тест пройду, а работать не буду?
> Результат не аннулируют?
Хуй знает, пройди, расскажешь
кнопка появляется после регистрации
Плохой тест. Ответил не на все вопросы, время не вышло, а он завершился. Он ограничивает время одного вопроса двумя минутами. На некоторых вопросах где надо выбрать несколько вариантов можон выбрать только 1. В конце вопросов где надо поставить пропущенное слово в предложение он ставит знак вопроса из-за чего предложение теряет смысл. Вопросы тупо откуда-то скопипащены т.к. в начале одного из вопросов стоял его номер который не совпадал с тем что над постом и которого там не должно было быть. Есть не столько вопрос с неоднозначным ответом и примеры кода с неопределёным поведением. Были вопросы по си и по линуксу. В конце теста мне не дали сертификат. возможно из-за низкой оценки Пересдать можно через 10 месяцев. Детали посмотреть нельзя. Реквестирую другой тест.
Но что мы делаем тут?
struct A {
double x;
};
const A a = new A{ 0 };
Создаем структуру, а дальше идёт её объявление?
>>910850
Почитай о динамической памяти тут:
http://itedu.ru/courses/cpp/cpp-dynamic-memory-allocation
И о умных указателях (с++11 и выше)
http://archive.kalnitsky.org/2011/11/02/smart-pointers-in-cpp11/
Класс, спасибо.
Что за пиздец на 2 и 3 ОП-пике?
>Какое нахуй кеширование строк в компайлтайме; ты сам то понял что высрал?
Я-то понел (что ето хэширование), а ты очевидно — ниет, вот и запеканус.
>Что за пиздец на 2
Отсылка к знаменитой цитате медведева, очевидно же.
>и 3 ОП-пике?
https://2ch.hk/pr/res/892147.html#903297 (М)
Передавать ссылки на какие-то внешние контейнеры не очень идея. Single responsibility же, вся хуйня. Если класс работает с сокетом, то он должен только работать с сокетом, а не управлять еще и масивом. Делаешь через наблюдение. Получив пакет класс рассылает своим наблюдателям сообщение что пакет получен, а они уже решают что с ним делать.
Есть еще похожий на твой вариант, когда интерфейс реализован через внутренний контейнер. Тоесть у тебя асинхронный клиент (или сервер). В одном потоке твой класс принимает пакеты и складывает в свою внутреннюю (желательно не блокирующую) очередь. Рабочие потоки обращаются (через геттер, не напрямую) к очереди и вытаскивают оттуда пакеты. Но в таком случае на контейнер внутри класса, никаких внешних ссылок нет, внутренний контейнер просто используется для организации потокобезопасного интерфейса.
Если тебе нужно что-то простое то твой вариант в принципе тоже ок. Только передаешь обычную ссылку на контейнер, и обзываешь это делегатом. Если в будущем функционала контейнера станет не хватать, то потом просто пишешь настоящего делегата с интерфейсом твоего контейнера (тех методов что реально вызываются в коде). Если все правильно делать, то прийдеться менять достаточно мало существующего кода. Смотря как написал конечно, если твой контейнер лезет со всех щелей приложения (потому что ты его всюду передаешь голого), то тогда настанут естественные пиздарики.
учись гуглить по ключевым словам типа "какая то хуйня use case"
printf(), причем по всем параметрам: от удобства и гибкости до, банально, скорости компиляции.
Для сохранения бинарной совместимости при изменении реализации.
Предположу, что твой терминал должен быть определенного типа
fmt топчик, да
::(*object).variable;
Работает, спасибо.
Говнокод сам себя не разберёт.
Нужны знающие SFML и Box2D
В игре присутствует модель игрока. Суть в том, что при нажатии W игрок просто летит вверх. Эта проблема решилась просто проверкой вертикальной скорости y игрока перед следующим нажатием.
if(evt.key.code == sf::Keyboard::W && playerBody->GetLinearVelocity().y == 0)
А вот как решить проблему полёта при зажатии "A" или "D"? Проверять горизонтальную скорость не вариант. При зажатии кнопки, игрок просто летит в выбранном направлении.
if(evt.key.code == sf::Keyboard::D)
playerBody->SetLinearVelocity(b2Vec2(5.0f, 0.0f));
А так же следующая проблема состоит в том, что при нажатии W+D или W+A игрок поднимается вверх, но влево-право не двигается.
if(evt.key.code == sf::Keyboard::A && evt.key.code == sf::Keyboard::W)
playerBody->SetLinearVelocity(b2Vec2(-50.0f, 50.0f));
Как уже говорилось в СЮ:
в играх нажатия клавиш надо обрабатывать не в ивент хендлере, а в игровом цикле.
Го в /gd/, там более уместно.
Держи структуру данных, где отмечаешь какие кнопки нажати (по инпут ивентам меняешь эту структуруру), в игровом цикле проверяешь структуру на предмет нажатых кнопок.
Ты неправильно работаешь с телами. Тебе, как правило, в ручную не нужно устанавливать скорости - с скоростями ебется движок, это его работа. Ты напрямую манипулируешь скоростями в редких случаях (например при инициализации объекта, если у него изначально должна быть определенная скорость). Ты должен работать с перемещением тел через ApplyForce и ApplyLinearImpulse/ApplyAngularImpulse. Если игрок должен подпрыгнуть - ты прописываешь ему импульс вверх. Движение влево/вправо - скорее всего сила направленная в нужное направление. Скорее всего потому что сила/импульс в некотором роде взаимозаменяемы - силу можно заменить последовательностью импульсов. Конкретный результат зависит и от параметров сцены, нужно пробовать разные варианты и смотреть что получается.
Спасибо анон. С помощью импульсов удалось решить последнюю проблему. Теперь осталась вторая, ведь персонаж летать влево-вправо не должен. Если вверх это решается простой проверкой вертикальной скорости, то как быть влево-вправо?
Персонаж по нажатию W подлетает вверх (прыгает). И если зажать после прыжка A или D, то персонаж застынет в положении, и начнёт постоянно двигаться в сторону нажатой кнопки (A - влево, D - вправо), и по-чуть чуть падать на поверхность под действием гравитации.
Мне нужно чтобы такого нельзя было сделать, так как так можно спокойно перелетать через дыры и препятствия, просто встав на самую высокую точку, на которую можно запрыгнуть.
Нужно с коллизиями разобраться. Нажатия кнопок A и D обрабатываешь только если персонаж стоит на поверхности. И застывать никто не должен, если ты не вручную скорость выставляешь. При нажатии A/D или силу прикладывай или периодически импульсами подталкивай.
Кстати вопрос: что лучше, ApplyForce или ApplyLinearImpulse? Последние доки по Box2D которые я нашёл были за 2013 год, и там даже нет упоминания булевого аргумента wake, который передаётся в этот метод.
Спасибо.
Еще такой вопрос, возможно ли отслеживать вызовы из виндоконсоли и винапи функции?
Знаю, что второе можно сделать http://www.rohitab.com/apimonitor , но не знаю как ? инжектить в виндодлл .
Интересует именно момент между самим вызовом программы (или прямо перед ним) и местом, когда эта программа может почистить логи/прочее.
>>912845
Лол, если бы только мне подобные вещи рассказывали, а не как оптимизировать сборщик мусора.
Если тебе нужно постоянное воздействие на тело то используешь силу. Если короткое - импульс. А так-то они связаны между собой и фактически взаимозаменяемы (при дискретных расчетах). Сила - скорость изменения импульса точнее скорость изменения импульса равна сумме действующих сил. Силу можно представить как импульс который повторяется на каждом шаге. Импульс можно представить как силу которая действует только один шаг.
>везде написано
Где написано?
>уже доступны по умолчанию
Где доступны?
И чем && || не устраивают?
В общем я думаю они только в Visual studio не работают.
Что примерно я должен знать, чтобы хотя бы кодить джуном за еду?
Заранее спасибо.
Nano. Еще можешь посмотреть acme, оче годно.
> когда его не делают
Если при разработке класса решают что его не стоит наследовать (либо полиморфно использовать) то виртуальный деструктор не делают, чтобы сэкономить память и процессорное время. В STL много классов без виртуальных деструкторов - все контейнеры, например.
Нет. Проверять можно constexpr, а параметры ими быть не могут. Можно использовать параметр шаблона вместо параметра функции, но не думаю чт ов такой хуите может быть смысл.
В общем, имеется кусок кода, вот по этой вот ссылочке http://pastebin.com/CNU0dZ4S . В общем-то, проблем, как мне кажется (во всяком случае, как мне казалось до этого времени), в нем возникнуть не может ну вообще никак. На обнуление указателя проверяю, в общем, вроде как, все ОК.
Захожу, я значит, посмотреть, что тут, да как. И, вжух, получай SEGFAULT, петух (угадайте, пока что на какой строчке).
В общем, если вы подумали про цифру 8, тогда я вас обрадую. Так оно и есть. Однако, меня беспокоит то, каким вообще макаром это произошло.
Думаю, так так так, может какую хуйню творю (с чем черт ведь не шутит), захожу в отладчик. И что же я вижу там:
>> layer : 0x16b7bf0
>> m_terrainLayer : 0x16b7bf0
Все как и положено, даже читает внутренние значения класса, однако, какая же великолепная картина предстоит перед моим взором - а вот вы хуй догадаетесь:
>> tileSet : 0x1
Какого черта. Почему она туда указывает?! Ладно, едем дальше, прохожу уже в этот самый "злополучный" метод, и что - а вот нихуя там, он просто возвращает protected-переменную. Все, ничего больше. Притом, что переменная внутри в нормальном состоянии, нихуя не 0x1, как это у меня пишется в отладчике каждый раз. Что за поебистика такая?! Или я в глаза ебусь...
Почему ты решил что проблема в языке? Может у тебя с фреймворком проблемы? Например ты неправильно проинициализировал переменную на которую указывает layer, и проинициализировал хуитой которую к текущему моменту уже удалили.
Нет. В том то и дело, что все нормально и в других местах у меня стоят ассерты на случай косяков обнулений.
У кокоса автоматическое освобождение ресурсов в конце рабочего цикла при обнулении счетчика указателей на объект, но это все дело происходит еще до всевозможных чисток.
Алсо, отладчик считывает область памяти, на которую указывает объект, в том числе и внутренние значения, только вот возвращается почему-то хуйня.
Вот лог GDB для понятности
>>(gdb) step
>>cocos2d::TMXLayer::getTileSet (this=0x1681a90) at /home/%USERNAME%/AndroidStudioProjects/Game/cocos2d/cocos/2d/CCTMXLayer.h:237
>>237 TMXTilesetInfo getTileSet() const { return _tileSet; }
>>
>>(gdb) print _tileSet
>>$3 = (cocos2d::TMXTilesetInfo ) 0x1681750
>>
>>(gdb) step
>>PhysicsProcessorPrivate::setTerrainLayer (this=0x1679260, layer=0x1681a90) at /home/%USERNAME%/AndroidStudioProjects/Game/Classes/src/PhysicsProcessor.cxx:31
>>31 if (tileSet) {
>>
>>(gdb) print tileSet
>>$4 = (cocos2d::TMXTilesetInfo *) 0x1
Ну смотри. Я дописал к твоему коду еще хуйни, чтобы он запускался http://ideone.com/YKKUnW И твой код отрабатывает нормально. Следовательно проблема где-то в другом месте.
Собственно вопрос: есть ли кроссплатформенный вариант для того, чтобы получить список файлов? Вполне сойдёт какая-нибудь мелкая библиотека (но только не какой-нибудь Boost).
И есть ли разница в проблемах между .lib и .dll ?
>>>>913150
Единственное зачем нужен виртуальный деструктор - это полиморфизм. Т.е. если ты будешь хранить объект ыпо ссылке/указателю на базовый тип. В этом случае тебе надо быть уверенным, что при delete разрушение начнётся с последнего потомка, следовательно деструктор должен быть виртуальным
Это ж old-way C-style операторы, не? Они как-бы есть для совместимости.
На разных. Самые упёртые неудачники - когда им при найме поводят хуями по лицу и скажут, что макака способна на большее.
У меня все линкуется, просто вспомнил, что когда-то использовал в Qt под mingw либы буста, скомпиленные в студии (boost::bind).
И тут возник вопрос, существует ли этакая привязка, типо, скомпилил либы в студии - пользуйся в студии?
TinyXML2
save.LoadFile("./saves/slot.xml");
XMLElement saveNode = save.NewElement("Save");
XMLElement slotNode = save.NewElement("Slot");
XMLElement nameNode = save.NewElement("Name");
XMLText nameText = save.NewText("");
XMLElement dateNode = save.NewElement("Date");
XMLText dateText = save.NewText("");
XMLElement progressNode = save.NewElement("Progress");
XMLElement scoreNode = save.NewElement("Score");
XMLText *scoreText = save.NewText("");
save.LinkEndChild(saveNode);
saveNode->LinkEndChild(slotNode);
slotNode->LinkEndChild(nameNode);
slotNode->LinkEndChild(dateNode);
slotNode->LinkEndChild(progressNode);
progressNode->LinkEndChild(scoreNode);
nameNode->LinkEndChild(nameText);
dateNode->LinkEndChild(dateText);
scoreNode->LinkEndChild(scoreText);
save.SaveFile("./saves/slot.xml");
Короче, упростил код до безумия.
>> auto map = cocos2d::TMXTiledMap::create(filePath);
>> auto layer = map->getLayer("terrain");
>> auto tileset = layer->getTileSet();
Все равно tileset указывает на адрес 0x1. Притом, что map и layer в нормальном состоянии...
Пиздец.
Видать то-ли CMake, то ли GCC блядствовали. Удалил папку сборки и собрал сново - и теперь заработало. Но ведь исходники не поменялись...
>Удалил папку сборки и собрал сново - и теперь заработало. Но ведь исходники не поменялись...
https://www.youtube.com/watch?v=CA5tBKSccuw
Этот анон >>913512 тебя плохому научит, юзай https://github.com/cxong/tinydir или вообще fstat обертки для винды. Если у тебя в проекте до сих пор нет буста, значит он тебе не нужен.
Я этот ебучий буст пытаюсь уже целый день сбилдить. Пиздец.
Анон, спасибо тебе за полезную либу.
Нахуй тебе плюсы, это язык для бывалых боевых пидарасов, для спецназ-элиты, почти как 1С. Вкатись лучше в ПЕТОН.
Напиши тогда рогалик на питоне. ncurses все дела. Потом перепишешь на плюсах, если понравится.
Проиграл. Сам сейчас этим занимаюсь.
Зачем curses? Для рогаликов есть libtcod, оно и с крестами работает и с пайтоном.
Лол, да уж тож такой хуитой тсрадаю пизда нихуя не выходит уже год ебу плюсы опенгл, сложно
На, тогда, список литературы на лето, изучай:
http://mrelusive.com/books/books.html
https://github.com/miloyip/game-programmer
Книжки с первой ссылки подустарели, но пусть будут.
да даже если брать по одной книге из раздела, то первую игру он напишет лет в 80
>но не на готовых движках
>писать игры, даже не одну игру, а игры
Ты болен. Освой Unity и не перфекционируй.
Опыт от 5 лет в области системного программирования и секьюрити ресерч (очень желательно желательно),
Полное понимание архитектуры windows (x86/x64) и стека протоколов TCP/IP.
Обязательные знания механизмов антиотладки, антиэмуляции, PE формата. Опыт реверсинга.
Умение разбираться в недокументированном коде. Написание адекватного документированного кода.
OS: Windows. Отличное знание архитектуры Win32 - объекты ядра, процессы/потоки, синхронизация, виртуальная память и адресное пространство процесса, механизмы IPС, code/DLL injection.
Знакомство с книгами Руссиновича, Рихтера и другими профильными источниками.
Понимание отличий Win64 от Win32, WOW64.
Языки, технологии, библиотеки: С++, С++11, 386 assembler, MASM, FASM, STL, boost, Native API, Win API, BSD sockets, WinSock, CMake
Отладчики, дизассемблеры: IDA Pro, OllyDbg, Immunity, WinDbg, Понимание remote debugging
IDE и тулзы: VS 2013-2015, Subversion / Git, Redmine
Возможность полной концентрации на достижении результата в реальные сроки, отсутствие отвлекающих жизненных проблем (дети, болезни и т.п.)
Дополнительно:
Знакомство с форматами файлов PE, COFF.
Знакомство с разработкой драйверов, понимание отличий работы в kernel/user mode.
Криптография - хэши, симметричные алгоритмы, public key cryptography, digital message signing.
* FreeBSD, Linux, Shell scripting (bash, csh).
Поциент у вас рак Юнити головного мозга, срочно пройдити в хоспис для дальнейшего домирания, не мешайте здоровым людям.
Ищут ноулайфера который с 3х лет под спидами, ковыряет шиндоус и плюсы?
Одно радует что никого они ненайдут. Их бизнес загнется без такого важного человека, и на сео этой шараги повиснут многомилиардные штрафы за проебаные проекты. У него отнимут все его деньги хаты машины, жена бросит его отобрав еще часть бабла, постоянно будут обоссывать колекторы, и сдохнет в выгребной яме зимой набухавшись и замерзнув насмерть.
Забыл добавить зп 300к/cек
Кто-нибудь htmlcxx пользует?
Вот есть метод, выводит список файлов, и с этими файлами надо работать. Вот например надо вывести в какое-нибудь место название одного из файлов.
Это мне весь вывод метода в массив закатать, или как?
ну да самом то деле какую проблему я вижу с этой вакансией:
им надо уточнить, кого конкретно надо - кодера или реверсера
так же надо уточнить, кодер нужен "ядерный" или все же это будет прикладник в юзерспейсе
тк универсальных людей нет, особенно под винду
Что за проект? Пишут ядерный руткит для ФСБ, чтобы ставить на компы подозреваемых в педофилии? Нахуя антиэмуляция, лол?
Я не собирался пиздеть или пытаться как-то похвалиться. У меня образование в сфере защиты информации часть с реверсом и подобным я знаю с университета, а работаю в ортогональной сфере, но в силу некоторых причин более или менее знаю шинводс кернелс
Т.е. понятно, что я не подхожу под эту "вакансию"
> Опыт от 5 лет в области системного программирования и секьюрити ресерч (очень желательно желательно),
Сколько платят?
Очень надо Bullet physics, а под c# его никто не курит.
Неужели кресты???...
for (int i = 0; levelNameVector.size() > i; i++)
{
tgui::Label::Ptr emptySaveTitle = std::make_shared<tgui::Label>();
emptySaveTitle->setPosition(135, 92);
emptySaveTitle->setTextSize(22);
emptySaveTitle->setText(levelNameVector);
gui.add(emptySaveTitle);
}
Его суть в том, что я получаю список имён, и каждый раз при проходе цикла рисую тайтл средствами одной библиотеки (надо ещё и положение менять при каждом проходе, да). Я подозреваю, что здесь нужно как-то генерировать название объекта каждый раз, но как - я не знаю.
Ну как бы или класса, или функции. Нужно, чтобы экземпляр типа tgui::Label::Ptr имел уникальное имя. Я уже сам запутался.
Сойдёт даже если просто будет добавляться счётчик к названию экземпляра при каждой итерации цикла.
всево))
class Mister{
public:
void foo(){}
};
class Proper: public Mister{
public:
void foo(int a){}
};
Если мы создадим объект Proper object, то вот так сделать нельзя: object.foo() .
Вопрос : какого хуя?
Почему компилятор не может просто пройти по базовым классам и выбрать подходящую по прототипу функцию.
Он может. Такая хуита называется перегрузкой. У тебя какой-то неправительный компилятор. Либо я тупой.
Можешь показать на примере? Даже если я функцию отрисовки в том цикле засуну в какой-нибудь класс.
В принципе, можно было ещё почитать, и дропнуть после этого.
>Умение разбираться в недокументированном коде.
>>914915
Поясни по хардкору тогда.
Это понятно. Но они отличаются по набору параметров, какие проблемы поискать дальше по наследованию функцию с корректными параметрами?
Дальше совсем пиздец. Набрали в гугле реверс-инженеринг и покопировали разных слов
Это защита для множественного наследования. Так не было бы понятно, какую функцию с нужными параметрами тянуть
Но для такой защиты можно сделать один класс виртуальным (Как-то так это делается)
Не ты не понял. Что будет по твоей логике, если я сделаю не виртуальное множественное наследование?
Ты можешь сделать не виртуальным, это не запрещено стандартом
СТРАУС выбрал такой способ поиска перегруженных функций - они рассматриваются только из одной области видимости (scope). Когда компилятор встречает функцию он начинает перебирать области видимости, начиная с самых узких, пока не найдет функцию с таким же названием. Потом, исключительно в этой области он ищет функцию с нужной сигнатурой. Ты можешь добавить в область видимости Proper все функции с именами foo из Mister дописав в public разделе объявления класса using Mister::foo;
Design and Evolution of C++ же, офигеная книжка, читается как детектив и нисколько не устарела за 20 лет.
[CODE]
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
inline void keep_window_open(){
char x;
cin >> x;
}
struct Point {
double x;
double y;
};
int main (){
vector<Point> inputVector;(3);
vector<Point> outputVector(3);
double x, y;
for(unsigned int i = 0; i<inputVector.size(); i++){
cin >> x >> y;
inputVector.x = x;
inputVector.y = y;
}
ofstream ost ("C://log.txt");
for(unsigned int i = 0; i<inputVector.size(); i++){
ost << "(" << inputVector.x << " " << inputVector.y << ")\n";
}
ost.close();
ifstream ist ("C://log.txt");
double number;
keep_window_open();
return 0;
}
[/CODE]
[CODE]
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
inline void keep_window_open(){
char x;
cin >> x;
}
struct Point {
double x;
double y;
};
int main (){
vector<Point> inputVector;(3);
vector<Point> outputVector(3);
double x, y;
for(unsigned int i = 0; i<inputVector.size(); i++){
cin >> x >> y;
inputVector.x = x;
inputVector.y = y;
}
ofstream ost ("C://log.txt");
for(unsigned int i = 0; i<inputVector.size(); i++){
ost << "(" << inputVector.x << " " << inputVector.y << ")\n";
}
ost.close();
ifstream ist ("C://log.txt");
double number;
keep_window_open();
return 0;
}
[/CODE]
Лол, часто тут такое?
Мимо новичок С++ тредов
В наказание за то, что ты глупое безвольное создание, которое решило спихнуть свои задачи на других людей, потрать столько же времени на перепечатывание текста, сколько я потратил на твою программу.
Код писал какой-то аутист. Не говоря о неудачных программных ходах, код в принципе не работал
>>915068
Я только начал изучать плюсы. А код, вероятно, такой несуразный потому, что книгу, с которой я начал свое изучение для начинающих(Programming Principles and Practice Using С++ Строуструпа) и большинство приемов в решении задачи принадлежит автору книги как и задача.
Если эти объяснения не оправдывают "кривоту" моего когда, то какие действия предпринять по отношению к учебному материалу и/или к себе?
Что код нерабочий отправил, и в правду, я виноват.
Исходники по определению в файле с исходниками, а не в исполняемом.
А это тупо таблица символов.
Джо Саттиса почитай
Вроде какой-то нехитрый флаг не использует символьную таблицу, заменяя своей. И это, наверное, отладочная сборка и нужна для гдб.
Меня тоже заебывать книжки, поэтому нужно писать что-то побольше, и нехватка всего этого сама придет
Нет. Исходники это то что предполагается некорректные исходники тоже исходники компилятор должен схавать. А этот код действительно исходник с++.
>>915413
Отладочная? А почему она по дэфолту?
Что за таблица символов?
CodeBlocks и CLion используют один mingw
ниже сборка/размер/среднее время
CLion - debug -- 2001 KB -- 164.389 ms
CLion - release -- 1939 KB -- 143.948 ms
Code::Blocks - debug -- 2001 KB -- 162.209 ms
Code::Blocks - release -- 914 KB -- 142.278 ms
VS2015 - debug -- 76 KB -- 1463.76 ms
VS2015 - release -- 15 KB -- 408.403 ms
Какого хуя в студии код выполняется в несколько раз дольше? Особенно сборка дебага, я думал, что 0 лишний поставил в количестве итераций.
Какого хуя код из mingw весит столько, можно ли как-то этот размер уменьшить и чего там такого на 2 мб записано? Оптимизации?
Закладки со спайсом
>Какого хуя в студии код выполняется в несколько раз дольше?
Оптимизатор делает сасай.
>Какого хуя код из mingw весит столько, можно ли как-то этот размер уменьшить и чего там такого на 2 мб записано?
Свой сирантайм и прочая гнутая залупа. Убрать зависимости/слинковатьтдинамически/ещё как-то отодрать их каким нибудь спермо-трюком, но работать не будет нигде.
Ну ты тестируешь время выполнения функции которая (скорее всего) зависит от реализации - естественно на разных компиляторах разное время. А размер скорее всего от того что VS код динамически слинкован с каким-то "c++ redistributable". Попробуй свои программки запустить на машине где нихуя нет кроме ос, если есть возможность и желание.
> Аноны, откуда у вас знания по стл и всему шаблонному программированию
Писал много программ.
> Вы книжки из шапки читаете
Читал только Липпмана, когда вкатывался в С++ лет 8 назад. Больше не откуда было черпать систематизированные знания или ответы на вопросы.
Потом читал только на инглише всякие специализированные моменты
>>915334
Ты очень подходил под студента, который под конец семестра, просрав все сроки, начал делать лабы, начиная с первой.
Твой вопрос был чрезвычайно подозрительным. Сложно поверить, что человек, который понял выходные файловые потоки, не смог написать ёлочки в другую сторону >>
> Страуструп
Я бы не стал с этим Страуструпом кувыркаться. Меня он в самом начале только напрягал, очень туго шло. Вот Липпман другое дело, приятно было читать.
> какие действия предпринять
С практикой всё придёт, просто побольше писать программ.
for (int i = 0; levelNameVector.size() > i; i++)
{
drawLevel->drawLevels(gui, window, i, levelNameVector);
tgui::Button::Ptr levelButton = gui.get<tgui::Button>("selectLevel" + i);
levelButton->connect("pressed", [&](){ loadGame(gui, window, levelPathVector); });
}
Создаю я значит объекты по общему указателю каждую итерацию, привязываю к каждому созданному объекту ивент по нажатию, но вот незадача:
При нажатии на созданную кнопку, приложение крашится. В дебаге видно, что программа пытается обратиться к несуществующей функции. Выходит, что по концу каждой итерации loadGame() уничтожается нахуй. Собственно вопрос: как решить эту проблему?
Лол, я хз, конечно, но как насчёт вынести создание кнопки tgui::Button::Ptr levelButton за цикл?
Ну там создаёшь массив кнопок, который существует не только на итерации цикла, а всё время существования твоего меню.
Cудя по твоему описанию и по твоему куску кода, с удалением
> tgui::Button::Ptr levelButton
Может происходить и удаление
> [&](){ loadGame(gui, window, levelPathVector); }
Хотя я пальцем в небо.
> И как ты себе это представляешь?
У тебя этот массив кнопок и так создан, я не внимательно просмотрел, если судить по
> gui.get<tgui::Button>("selectLevel" + i);
Объяви в этом же классе что-то типо
std::vector <tgui::Button::Ptr> levelButtons;
И этот цикл вставь в конструктор класса. Ну или в любое другое место. Основной момент - проверить совпадает ли время жизни levelButton и твоей лямбды/коллбека.
tgui::Button::Ptr это shared_ptr. В конце итерации цикла levelButton удаляется нахуй.
>этот цикл вставь в конструктор класса
Только в вектор через пушбек, разумеется, добавляй. Ну ты сам должен понимать, что не просто стрл+С/V должен быть.
>И как ты себе это представляешь?
std::vector <tgui::Button::Ptr> levelButtons;
for (int i = 0; levelNameVector.size() > i; i++)
{
drawLevel->drawLevels(gui, window, i, levelNameVector);
tgui::Button::Ptr levelButton = gui.get<tgui::Button>("selectLevel" + i);
levelButton->connect("pressed", [&](){ loadGame(gui, window, levelPathVector); });
levelButtons.push_back (levelButton);
}
Очень глупый вопрос
Чем мне нужно компилировать, чтобы код собирался на любой винде 2000-хр-..-10 без .dll.
Помню тулзы от nirsofta больше 400 кб не весили, и запускались под любой виндой
Вообще можно, залинковать все статически. Разве что с разными версиями системного апи могут быть проблемы. Кроме VS - у них там все сильно на CLI повязано, хотя может можно и как-то отказаться от использования. Про тулзы от nirsoft не знаю, но они там скорее всего агрессивно WinAPI использовали, тоесть много кода динамически линковано - просто что он в любой виндоуз должен быть. MinGW это какбы исключение. Он действует во вражеской среде, ему нельзя предполагать что у пользователя будут нужные библиотеки, поэтому он дохуя сует в екзешник. Я думаю если программу из >>915443 скомпилить GCC на линуксе, то у нее размер тоже будет небольшим. Если не линковать stdlib статически.
Ну, я это приблизительно так это все и понял.
Вопрос был в том, чем компилить вин приложения и как собирать, чтобы везде запускалось. 2005й редист стоит даже у последнего васяна думаю. нужен даунгрейд студии, вопрос какой
может ему ввести один из параметров - индекс и сдвигать как будто бы это массив?
Нужен двусвязный список, и кроме указателя на голову списка, нужен еще указатель на конец. Потом или голову перемещаешь в конец, или конец в голову, смотря в какую сторону сдвигать.
А что односвязным ограничиться нельзя?
Просто у меня в задании не фигурирует двусвязный.
Там так сказано:Посредством структур реализуйте односвязный список для хранения окружностей. Обеспечьте следующую функциональность:добавить окружность в список;циклически сдвинуть список на N элементов вправо;циклически сдвинуть список на N элементов влево;сохранить данные в файле, считать данные из файла
И еще, как думаешь, достаточно ли просто в начало добавлять элемент? Просто если есть функция, циклически двигающая элементы, то сортировать их по убыванию/возрастанию просто нет смысла
Нет, но я видимо не понял, что ты от меня хочешь. Или это так влияют 4 ночи за окном.
Суть собственно в чём: TGUI - библиотека-надстройка над SFML.
Имеется окно SFML, в котором идёт отрисовка и прочее. В этом окне создаётся контейнер TGUI, который у меня зовётся gui, и собственно в нём содержатся кнопочки и прочая хуита.
Вот как выглядит drawLevels:
{
auto selectLevel = std::make_shared<tgui::Button>();
selectLevel->setPosition(72, 90 * (i + 1));
selectLevel->setSize(260, 65);
selectLevel->setText(name);
selectLevel->setTextSize(26);
gui.add(selectLevel, "selectLevel" + i);
}
Чтобы получить доступ к какой-нибудь кнопочке или чему-то, что находится в контейнере, надо взять контейнер.get(название). Оно кстати добавляется путём gui.add(экземпляр, название).
https://tgui.eu/tutorials/v0.7/creating-widgets/
https://tgui.eu/tutorials/v0.7/signals-introduction/
Зацикливаешь список, перемещаешься на N в нужную сторону, разрываешь.
Если нужно именно односвязный то делай его. Просто на нем операции с последним элементом дорогие (линейная сложность вместо константной), и если есть возможность то лучше брать двусвязный. А раз у тебя ничего про сложность не сказано и требуют односвязный то делай с ним. Вставляй в начало, если ничего не сказано, так как это проще всего.
Это было очевидно по
> gui.get<tgui::Button>("selectLevel" + i);
Самый просто вариант найти ошибку - поставить data breakpoint. Когда у тебя меняется значение по указанному адресу, происходит остановка. Понятно, что это будет в каком-то деструкторе, но хотя бы по стеку вызовов посмотришь, где это происходит.
Data breakpoint ставь на адрес, где хранится
> В дебаге видно, что программа пытается обратиться к несуществующей функции
Если совсем не сможешь разобраться, могу посмотреть через тимвивер, у нас примерно один часовой пояс. Я мог бы посмотреть и просто проект, но не хочу себе ставить библиотеки
>Прям на ингрише?
Без инглиша далеко не уйдёшь. На ютубе тьюториалы еще
>Меня заебывает моментально, например.
Тебя должна вести идея того, что ты хочешь замутить. Если идеи нет или на нее (уже) не стоит, то трудно всегда. Мотмвейшн, нутыпонел
Судя по всему, разобраться не могу. Может пикрил как-то поможет?
Если нет, то давай фейкомыльцо, скину туда пароль и id.
> ну ты же не так сделал
> не, не так
> пик
Проиграл.
ostriK&>chisdANUSyandR}:exPUNCTUMr&"]u
Там, походу, минутное дело, но я всё равно смогу только часа через 2-3 или ближе к 00:00. Либо периодически проверяй почту, либо держи тимвивер на готове, а себя около ПК
Фикс пика
Я прочитал "C++ за 21 день". Могу ли я уже устраиваться на работу программистом?
java джуном можешь
щас не нужны джуны
у фирм зачастую нет ни времени, ни других ресурсов для того чтобы "выращивать" спеца
нужны люди способные сразу писать код, который не будет выброшен
в тоже время в мидах есть необходимость - до сих пор на крестовую мидловскую позицию приходит иногда всего лишь 6-10 резюме (когда на ява-мида может и под сотню прилететь), причем среди них есть абсолютный нерелейтед, те работодателям вообще не из чего выбирать
#include <windows.h>
int WINAPI WinMain( HINSTANCE _hInstance, HINSTANCE _hPrevInstance, LPTSTR _lpCmdLine, int _nShowCmd) {
int argc = 0;
LPWSTR * argv = CommandLineToArgvW( GetCommandLineW(), &argc);
if (argc > 1)
MessageBoxW(NULL, argv[0], argv[1],
MB_ICONWARNING | MB_CANCELTRYCONTINUE | MB_DEFBUTTON2);
LocalFree(argv);
return 0;
}
А, это эвристика. Ну тогда попробую забить сигнатуры ассемблерными вставками с нопами и сделать скрытый вызов функций по хэшу из кернель32.
Дело в том, что в моем понимании "я прочитал кренинбеха" это сесть и начать читать как войну и мир, глава за главой. У меня есть идея, я хочу ее сделать ультракошерной и масштабируемой, но на йоба-приемы и шаблоны натыкаюсь случайно. Сегодня, например, я научился серелизовать структуру, увидев в буст::асио пример с ICMP а вчера я статик-кастом на воид* ее перегонял в чарэррэй. Мне повезло с этим, но тонких мест еще уйма.
в последнем VS компилирует, в code:blocks с пследним mingw пишет:
Pmx.h|526|error: 'unique_ptr' in namespace 'std' does not name a template type
догадываюсь, что дело с компиляторе. Как ему помочь?
Компилятор тебе строкой выше написал как это исправить, откуда вы блять лезете.
Проблема гипотетически могла быть и в особенностях реализации заголовочных файлов между платформами. Нередко же VS отклоняется от стандарта, поэтому могла быть ситуация, когда мемори включался в какой-то другой стандартный головочник, хотя по дефолту такого не должно быть. И китайцы работали в VS.
Ну это я, очевидно, оправдываю то, что я не открыл скрин, а просто прочитал текст поста. А так ты на 99.9 прав
>>916173
Тебе помогают, а ты говоришь спасибо без уважения.
это всё, что есть для этого mingw, что был в пакете с code::blocks
Попробуй -std=c++0x, мб частичная поддержка этого стандарта там есть. Иначе — меняй компилятор или переписывай код.
2. поставил MS VS Express 2010
3. code::blocks компилятор видит
4. но всё ещё пытается линковать mingw32.lib, которой так уже не должно и быть!
Какого хера и как подправить?
Фошизд в треде, все в газенваген.
А на самом деле: покрути настройки в линкере и search directories, наверяка там осталась лишняя строчка.
качнул Express с chip.DE же
В файте с проектом эта либа прописана. Уберу прям в редакторе
Помогите найти в опциях. Я в code::blocks второй день
Если ты вот этот вот >>916165 то сноси нахуй и ставь ту, что поддерживает последний стандарт хоть немного (2015-17).
>>916269
Нахуя качать откуда-то кроме как с офф. сайта учитывая что она сейчас полностью бесплатная со всеми нужными фичами есть — хз.
Если проект сгенерировала не сама IDE (т.е. шел с исходниками) то скорее всего никак. Иначе просто сотри и тыкай дальше.
Есть какие-нибудь менее фундаметнальные книжки, чем Стивенс?
Посмотрел мимолетом пару видео по сокетам,без книжки не разобраться.
спасибо за поддержку, в том числе и моральную
Я забил на code::blocks (for a while), поставил VS 2013, в которой писаны те сырцы (VS2015 ведь тоже чего-то в них не находила, блеат).
В VS213 компилирует и слава богу. Я вот этот анон >>323745
Мне внезапно надо из лампового делфи в кресты :3
1. Руками на основе argc/argv разбираю строку.
2. Использую POSIX-совместимую getopt()
3. Использую расширенный вариант предыдущего функциионала getopt_long().
Хотелось бы узнать, что является best practicies/как сделать поыбстроми, минимизируя число зависимостей. Буст идёт нахуй. Не интересно.
Дублирую вопрос в ните по пюре Си.
Может, из-за unique_ptr?
>main.cpp
http://pastebin.com/caaNT9MD
>TEST.H
http://pastebin.com/ikQvGf0u
Потому что ты, довн, ресайзишь вектор одного об'екта, а смотришь размер у вектора другого об'екта.
мамкин погромист LOL
Склеиваю стринг из содержимого двух векторов:
for (int i = 0; levelNameVector.size() > i; i++)
{
path = levelPathVector + "/" + levelNameVector;
drawLevel.drawLevels(gui, window, i, levelNameVector, path);
}
Позже передаю эту радость в лямбду.
void SelectLevel::drawLevels(tgui::Gui& gui, sf::RenderWindow& window, int i, string name, string path)
{
selectLevel->connect("pressed", [&](){ loadGame(gui, window, path); });
}
При попытке воспользоваться переменной в лямбде - всё нормально, через cout выводит как надо. Однако стоит воспользоваться ею в нужной мне функции loadGame:
void loadGame(tgui::Gui& gui, sf::RenderWindow& window, string levelPath)
{
cout << levelPath;
}
То приложение просто и понятно крашится.
Немного перефразирую: почему levelPath возвращается абсолютным нихуя в loadGame()?
Обсуждаемые флаги можно назвать как флагами компилятора, так и флагами препроцессора, потому как последний в любом случае является частью компилятора.
Ну типа preprocessor definitions же написано. PREPROCESSOR. DEFINITIONS. ФЛАГИ. Чё занудничать
>У тебя unique_ptr значение как отдаст, довенский хуесос?
>>916522
>Может, из-за unique_ptr?
давай скорей! Скоро мамка спать погонит
> selectLevel->connect("pressed", [&](){ loadGame(gui, window, path); });
А если вместо path будет какая-то захаркоженная строка? "C:\\my\path\to\file.txt"?
"./resources/map/filename.tmx"? Все возвращается как следует, что интересно. Такая строка кстати должна и быть в path.
>>916553
Оптимизаций никаких не стоит.
std::vector<std::string> Stuff::fpathvector(const char* paths)
{
std::vector<std::string> vector;
vector.reserve(fnumber(paths)); // Резервируем вектор в зависимости от числа файлов
for(directory_iterator rdib(paths), rdie; rdib != rdie; ++rdib)
{
std::string StringPath;
StringPath = rdib->path().parent_path().string();
vector.push_back(StringPath);
}
return vector; // Возвращаем вектор
}
Stuff useful;
auto levelNameVector = useful.fnamevector("./resources/map");
auto levelPathVector = useful.fpathvector("./resources/map");
fnamevector делается почти так же, только там именно имя файла забирается.
Я ее уже сам спать погнал (твою)
На мой взгляд, анонимная функция запоминает не значение, как ты ожидаешь, а адрес переменной. К моменту вызова коллбэка память path уже очищена. Попробуй, например, выделить через new.
void SelectLevel::drawLevels(tgui::Gui& gui, sf::RenderWindow& window, int i, string name, string path)
{
char* ppath = new char [512];
sprintf (path.c_str (), ppath);
selectLevel->connect("pressed", [&](){ loadGame(gui, window, ppath); });
}
Понятно, что тут будет утечка памяти, но мы же просто хотим найти ответ на вопрос.
я тебе уже ответил конч >>916536
>>916577
>На мой взгляд, анонимная функция запоминает не значение, как ты ожидаешь, а адрес переменной. К моменту вызова коллбэка память path уже очищена. Попробуй, например, выделить через new.
Это вообще было бы очень тупым багом — он переменную вниз по стеку передает, а std::string имеет встроенный рефкаунтер и может удалится только если ее вернуть из функции наверх.
>ppath
Хотя если лямбда запоминает адрес, то к моменту вызова коллбэка, опять же, будет запомнен адрес ppath, а сам указатель смоет.
Плохая была идея
Не проецируй.
Потому что твой код в хидере тоже так же менять надо, ебанутый. Убери уже нахуй unique_ptr, ты не понимаешь что это и тут оно не нужно точно.
Да понял уже, и даже поблагодарил того анона. И тебе спасибо тоже, что объяснил по какой причине оно так работает.
>а std::string имеет встроенный рефкаунтер и может удалится только если ее вернуть из функции наверх
Он же там коллбэки только инициализирует, а не вызывает. К моменту вызова управление давно поднялось вверх по стеку.
>>916597
>В коде твоём была ошибка
Идея должна была быть понятна. Я же без компилятора писал, ошибка тривиальная.
sprintf (ppath, path.c_str ());
Сравните со stackoverflow
Мои слова направлены не против особого духа борд и менталитета, а за большее число строк кода в ответах. Чтобы можно было просто вставить и запустить. Так очевидно лучше.
Ппц не дави на больное...............
gcc 7 уже поддерживает все фичи c++17, которые планируют принять в стандарт. собирай его и тести. я сейчас с ним играюсь, даже порнуху некогда смотреть.
Очевидный struct с битовыми полями, обернутый в #pragma pack. Но это си, а не цпп. Сделай лучше класс с сериализатором
Бамп вопрос
Таненбаум, Комп. сети. Разжевано вообще все что нужно, не нужно и вообще может пригодится.
> без линукса
Никак. phtrhread это системное апи линукса, естественно оно не доступно на других системах, если только они не предлагают свою posix-совместимую реализацию этого апи. Изучи документацию на эту тему к ОС для которой ты пишешь программы.
me just curious: bare metal ARM??
тебе какбэ намекают что нужно написать функции поддержки многопоточности
посмотри лучше откуда потребность в них вылезла (дизасмом например) и может быть можно что-то придумать
P.S.
>с++ на арме
не забывай про горы говносборок компиляторов в интернетах: https://andriidevel.blogspot.com/2016/05/size-cost-of-c-exception-handling-on.html
это заебись! А ещё? что-нибудь сишечка-лайк или как click в петне
Почему тогда в cpp11 поддержка потоков? Поддержка же в pthread, цпп просто использует фреймворк
Потому что в 11-х плюсах это просто спецификация, которая реализовывается на каждый платформе силами её разработчиков.
Хуле ты паришься, ставь Gentoo.
Оххх, порядок байт другой.
Как это лучше сделать в с++03, ибо после всех .append(..) в памяти процесса под 100 мб.
Просто .reserve () заранее сделай на 10 + N мегабайт.
Спасибо, анон. А если резервировать память под объект с помощью malloc, то на объекте потом как-то можно конструктор запустить? Boost же как-то реализует пулы (я даже код смотрел, там пулы по sizeof распределяются), неужели на массиве объектов сразу конструкторы запускаются?
Спасибо, анон.
Сэйлормун собирает с помощью вот этой штуки
https://pypi.python.org/pypi/bfg9000/
А чем его обычный cmake не устроил? Это ведь стандартно, удобно, распространнено.
Чтобы здесь не флудить отпишитесь на почту ivanegobL%rov025ANUSg,b,mailPUNCTUMcoCA4m лады? Есть к вам парочка подаванских вопросов как к людям в теме.
Отписался тебе за щёку.
>стандартно, удобно
Стандарта в плюсах на эту тему нет, а цмейк нихуя не удобный, так ещё и тормозит похлеще обычного make и всякого питоноговна.
Сменить предметую область и начать писать код который будет работать и который можно будет поддерживать, а не экономить везде на двух инструкциях.
Чё бля? CMake использует некоторый бэкэнд, который уже и выполняет сборку. И чем это тебя обычный make не угодил? Или блять хочешь писать m4-макросы и autoconf-скрипты, сука?
Ты в каком году? В 92-м?
А цмейк просто тугое кривое говнище, сделанное какими-то гидроцефалами. Причём во всех отношениях.
нет у ней альтернативы
если надо кроссплатформу, то проще cmake использовать, чем тащить в исходниках проекта кучу проектных файлов различных версий visual studio и кучу сборочных скриптов под юниксовые операционки
Ты какой-то пещерный человек, ей богу.
Уволился вот со скучной работы, связанной с формошлепством на Qt, во время передышки перед поиском новой работы хочу бустануть свое, так сказать, "резюме" не в обычном понимании, а скорее в виде набора скилов которыми я располагаю, и мне интересно, насколько целесообразно заморочиться 3D-графикой в целом и OpenGL в частности.
В качестве плюсов можно считать возможность вкатиться в геймдев и смежные области, из минусов - возможна дополнительная нагрузка в виде повторения мат анализа, на который я очень успешно забивал болт во время учебы в университете.
Что посоветуете?
Qt creator имеет свой? Или это только оболочка?
Охота что-нибудь полегче
OpenGL или нужен или нет. Если вакансия не под ожл разработчика то пользы от его знания мало будет. Матан не нужен, ты возможно с линалом перепутал. Но линал для изучения тоже не нужен. Если хочешь базвордов в резюме накинуть, то возможно лучше за OpneCL (или CUDA) возьмись, если не владеешь. Это в принципе тоже достаточно специализированная тема, но выглядит более широкой. Потом можно уйти в digital signal processing, например.
Ебать вы аутисты, это же фейкопочта. На самом деле я Анатолий Сердюков и работаю в гугла эйчаром.
>>В качестве плюсов можно считать возможность вкатиться в геймдев
>/0
>Давно таких не видали дуралеев.
Что не так? Объясни
>Знание OpenGL - полезный навык для C++-ника в целом?
полезный. У меня скоро будет проект на опенгл негеймдев (рабочее место диспетчера)
Самая нищенская и одновременно больше всего (по времени) требующая область.
Суть как бы в том, что там конкуренция из сотен макак, готовых переезжать в ебеня вроде Новосибирсков и Харьковых, за зарплату 60к рублей за идею и отечественный геймпром, что называется.
Ну удачи короч
Путаешь глупость и незнание, дурашка.
Посмотри на Git. Линус ссал тебе наебало make'ом(sic!)
https://github.com/git/git/blob/master/Makefile
Играюсь немного, в общем, сервис создает папку в %SystemRoot%/windows32, копирует туда себя и прописывается через CreateService, понятно уже, что это
Так вот, на одной машине папка не создается, соответственно, все остальные действия должны возвращать ошибку.
Но нет. Я ебу что это. Сервис записан в /CurrentControlSet на несуществующем пути, и мало того, что работает, так еще, блядь, функционал поддерживает полностью (стоп\пауз\старт)
Обыскал все папки винды, перезагружался несколько раз.
КАК ОН МОЖЕТ СУЩЕСТВОВАТЬ
ЧТО ЭТО ЗА НАХУЙ
upd
Исследование показало, что данным свойством обладает лишь папка system32.
Можно создать папку там через CreateFolder, скопировать файлы через CopyFile, и даже запилить там сервис, однако после этого получить доступ в эту папку будет нельзя, причем можно создать папку с таким же названием и конфликтов не будет.
Причины и объяснение данного феномена мне все еще неизвестны
>Линус ссал тебе наебало make'ом(sic!)
>2,5 к рукописных строк мэйкфайла с говном из баша
>которые в нормальной системе сборки можно было уложить в 100
Ну да, есть такое. Копрофилия — оно у плюсовиков наследственное от сишников.
Ахуеть, уложишь в 100?
Я не помню, как называется эта фича, но её придумали мелкомягкие, когда хорошенько соснули DLL hell'а. Суть в том, что если приложение, не являющееся TrustedInstaller'ом, пытается срать в системные папки своими библиотеками и прочим, то на самом деле файлы попадают в отдельное хранилище для этого приложения и не видны никому другому. Что-то вроде overlayfs для каждого отдельного процесса, короче.
Можно ли как-нибудь выдрать токен пользовательской сессии адмиистратора?
>C++
Qt Creator/Designer/CodeLite/Code::Blocks/Clion
и почему? Выбираю строго из перечисленных вариантов, остальные по тем или иным причинам не доставили.
Я не хочу срач. Ну, подскажи плюсы-минусы. Лион должен быть самым интеллектуальным, если судить по Идее, но хз, выглядит каким-то слишком громоздким. Писать планирую с активным использованием Кьюта либо что-то простое для Ардуинки.
матанализ тебе не нужен
нужны будут матрицы и квартенионы для всяких 3д преобраований, немного школьной физики (если не будешь лезть в имплементации физ движков), пройди какойнибудь курс по алгоритмам на курсере
в харьков гейдев - пайпстудия берет вобще всех но платит нихуя, есть g5, gameloft, plarium это из крупных,еще с полсотни мелочи, лучше какимто чудом найди постоянную удаленку, но практически нереально если ты не сениор\лид с хуевой тучей проектов за плечами
денег в гейдеве нет а мозгоебли полные штаны, так что держись анончик
мимо 10 лет в геймдеве
vim
https://2ch.hk/pr/res/894904.html (М)
https://2ch.hk/pr/res/894904.html (М)
https://2ch.hk/pr/res/894904.html (М)
https://2ch.hk/pr/res/894904.html (М)
https://2ch.hk/pr/res/894904.html (М)
Стажёры вообще никому не нужны.
>>894904 (OP)
>>894904 (OP)
>>894904 (OP)
>>894904 (OP)
>>894904 (OP)
нет
in.open(_in.c_str(), std::ios::in | std::ios::binary);
std::ofstream out(_out.c_str(), std::ios::out | std::ios::binary);
char buffer[64];
while(in.read((char )&buffer,sizeof(buffer)))
out.write((char )&buffer,sizeof(buffer));
in.close();
out.close();
Вот код копирования бинарных файлов, почему он работает?
Всмысле, в конец файла с вероятностью 63/64 будет записываться хотя бы один лишний байт.
Причем, если делать проверку на EOF, то окажется, что такие чары есть и внутри файла
Как вообще определяется еоф в бинарных файлах?
>Как вообще определяется еоф в бинарных файлах?
Как и в любых других.
Операционная система точно знает размер файла, не никаких EOF сигнатур
>>919125
Тогда почему код копирует содержимое 1 в 1, без единого лишнего байта, хотя должен копировать по 64 символа за итерацию.
>должен копировать по 64 символа за итерацию
Код должен копировать до '\0'.
Если у тебя буфер на 5 символов, то при прочих равных и корректных у тебя будет скопировано 4 символа.
char buf [5] = {'k', 'o', 's', 't', '\0'}. // скопируется только "kost".
char buf [99999999] = {'k', 'o', 's', 't', '\0', 'y', 'l', 'i'}. // так тоже скопируется только "kost".
Да дело даже не в этом. Я просто несколько сильно урезал код.
http://pastebin.com/ggmWVRuz
Так понятнее будет.
>Вот код копирования бинарных файлов, почему он работает?
Для тебя "скомпилировался" == "работает"?
Прост хуево английский знаю, и слышал, что в третьем с++11 не описывают.
Критично ли или лучше подыскать альтернативы?
Прата шестое издание норм подойдет?
Так вот, в одной задаче наткнулся на ошибку и совсем не знаю, что делать. Сама задача http://acm.timus.ru/problem.aspx?space=1&num=1004
Мой код для некоторых тестов :
1. http://ideone.com/O2qb8f
2. http://ideone.com/8EuKLK
3. http://ideone.com/jvYN8i
4. http://ideone.com/UXr58x
5. http://ideone.com/CKuotJ
6. http://ideone.com/4iFi0d
Как видите, у 5-го теста ошибка
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
и памяти расходуется больше, чем на остальных
Подозреваю, что у последнего ошибка связана с этой же проблемой.
Гуглить пробовал, но там в основном эта ошибка вызвана использованием массивов, неправильной величины (у меня векторы), или же что-то там с указателями (я высокоуровневый петух и не понимаю), которых у меня в коде вообще нет, только reference авто циклах, слова new тоже нет.
Прошу помочь, хотя, если пошлёте на хуй, я пойму
Ещё одно, в универе плюсы не учили (первый семестр javascript), самостоятельно я тоже не изучал, просто делал так, как бы делал в других языках (гугл в помощь мне), так что даже, если не найдёте ошибку, можете просто подсказать, что можно было лучше оформить
В пятом тесте. В массиве parent, насколько я понял ты надешся что там дерево. Но на самом деле там граф с циклом 92 -> 57 -> 26 -> 16 -> 92, в результате for на 147 строке работает пока не закончится память. Слова new в программе нет, но его используют неявно вектора, когда им нужна новая память под значения (которые ты туда засовываешь в бесконечном цикле).
Спасибо, благодаря тебе,я нашел свою ошибку. У меня с dfs была проблема и из-за этого возникала указанная тобой ошибка. Сам бы не нашел(
Не прошу решения, просто хотелось бы уточнить - это решаемо исключительно while циклом без использования других управляющих конструкций?
Как я понял, есть я ввожу 5 и 10, то на выходе должен получить все числа от 5 и 10. Так?
Но как, если на ввод пойдут числа 10 и 5?
В любом случае какие-то условия еще должны быть. Ну или я тупой.
На ум приходит использование только двух while циклов, каждый из которых бы проверял диапазон от меньшего к большему и от большего к меньшему. Но это уродство какое-то.
while + break == if
Можно. Под спойлером решение.
std::cin >> a >> b;
int c = b - a + 2;
while (--c) {
std::cout << b - c + 1 << std::endl;
}
Дак в одну сторону (т.е. когда левое число меньше правого) и я написать уже смог, в более понятной форме тем-более.
А вот так, чтобы работало сразу в две стороны (ибо ни твой, ни мой кодец не выдают нужных результатов, если левое число больше правого) - это либо использовать дополнительные управляющие констуркции, либо сразу два цикла while.
У Липпмана глава о while стоит перед всеми другими управляющими конструкциями, поэтому я и подумал, что оно должно решаться только им.
Я думаю что если бы Липпман хотел чтобы программа работала "в обе стороны" то он бы явно указал это. Тащемта с помощью разного рода математических трюков можно этого добиться. Есть вариант подразумевающий UB (основан на предположении о внутреннем представлении отрицательных чисел) http://ideone.com/3yZpjw Вместо сдвига можно использовать возведение в степень и вычисление корня - тогда не будет UB но нужно ебаться с корнями. Но не думаю что Липпман подразумевал что-то подобной в своей задаче.
>>920250
Ну ок, аноны. Похоже, это последствия чтения Страструпа если бы 4-ое издание было переведено, я бы его и только его бы и читал, где тот реально мог в своих задачах заставить человека хорошенько выебнуться с решением.
СТРАУСА
Такое бывает, когда ты в сотый раз пытаешься дочитать хоть какую-нибудь книжку по программированию, у тебя уже есть основа и есть какие-то знания, но между ними имеются пробелы и ты читаешь, потому что хочешь запомнить эти пробелы, но не знаешь, где они.
Ну и после пары глав Страуструпа Липпманн СЛИШКОМ легкий для прочтения, прям как для даунов написано. Хотя, возможно, дальше все будет лучше с этим.
Против ветра ссать вредно. Перестань.
Реквестирую вопрос об изучении исключительно технического английского языка только для чтения сопутствующей литературы.
Слышал, что там только совсем базовая грамматика нужна и основной напор делается на словарный запас специфических терминов.
Авось чего кто годного предложит? Пока читаю Стауструпа 4ed переводя по слову.
> хочу выучить синтаксис языка
> начну с английского
>Читаю первые главы книги, повторяю известное
> держат за дауна
К слову, у Липпмана и у Страуса ставятся разные цели. Первый просто рассказывает про язык, второй претендует обучить программированию.
Читал и то, и то
> переводя по слову
Погоди, ты настолько плохо знаешь английский?
Тогда я тебе сильно не советую пытаться прочитать книгу на английском. Ты, наверно, думаешь, что выбрал наиболее правильный, информативный вариант. Может быть. Но кроме того ты выбрал самый долгий вариант. У тебя это растянется не на один месяц, а может даже на год.
Знаю английский на уровне чтения тех.литературы, легко могу объясниться устно в другой англоговорящей стране, но предпочитаю читать фундаментальные книги на русском, потому что в некоторых местах на перевод тоже время тратится, как бы я не изворачивался и не пытался воспринимать информацию сразу на английском, без промежуточного представления в русский язык
Ты мне вот что скажи, ты зачем в void функции что-то вообще возвращаешь? Как тебя компилятор не развернул?
std::thread нельзя уничтожать, если с ним связан какой-то поток. Тебе нужно вызвать join() или detach()
Потому, что это С++, он обязан помочь пользователю выстрелить себе в ногу. Ты как маленький.
Я и далее глянул, что там. Все же у меня уже есть какая-то база, вплоть до некоторых моментов в ООП, проверенных на практике. Я до этого Страуструпа как раз таки и читал, 3-е издание и мне его форма изложения нравится куда больше. У него даже база читается весьма забавно - нужно вдумываться в прочитанное, переваривать. Да и выглядит это как минимум более информативно. Структура тоже более понятна.
У Липпмана в предисловии написано, что он хочет обучить возможностям языка, которые позволят игнорировать детали и я чувствую, что это ни есть совсем хорошо - т.е. если я серьезно захочу заняться этим делом и найти себе работу кодера, то буду полюбому охеревать от всего, что еще не перенесли на C++11. Хотя, возможно, это просто желание пердолится после pure c
>>920712
Не думаю, что верный. Просто вариант. 4-ое вышло в 2013 году и еще никто не занялся переводом. Вот теперь я понимаю, насколько хуево без англ. языка соваться в подобный мир.
Короче, пока просто буду третье издание читать, уверен, оно и сейчас способно многому научить. А С+11 подтяну позже. Есть же еще С++14 и С++17 за горами, я так долго мутузить буду, лучше вообще хоть что-то делать.
Универсального решения нет. Изначально хотели сделать чтобы в деструкторе std::thread вызывался detach, если он все еще не заджойнен. Но у этого варианта есть куча недостатков. Выделили два альтернативных варианта - вызывать join() или terminate() - но у них тоже свои недостатки. Вот ПЭЙПЕР есть на эту тему:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2802.html
В конечном счете остановились на terminate() - я точно не знаю чего, возможно что в таком случае все проблемы сразу видны. Вообще про проблему не забыли СТАНДАРТНЫЙ КОМИТЕТ получает новые предложения, типа
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0206r0.html
Может что и сделают, поближе к 2030.
>2030
Какой ты оптимист. Они сколько не могли сделать нормальную работу с файловой системой, даже из буста вытащили модуль.
Посоветуйте манул по отладке кода с картинкоми.
Не хуйню, где рассказывают как поставить брэкпоинт, а что посерьезней.
Судя по тому, что происходит у меня, когда допуская ошибку, используя std (и по шапке прошлого треда), такой ахуенный вывод ошибок - это норма для мира с++.
Как это лечить, стоит начинающему использовать что-то другое, типа boost?
Вообще-то наоборот. За незнание паттернов обоссут.
А если по поводу геймдева, то знать абстрактную фабрику - мастхев.
Паттерны-хуятерны, модели разработки и прочее я знаю. Именно по языку или каким-нибудь библиотекам, которыми все пользуются. Я так то явобог, но подвернулась вакансия на крестах. Знаю основной синтаксис и довольно много писал на крестах в универе, осилил когда-то польностью шилдта, хоть он и говно. Лабал на qt. Но хотелось бы знать что мне нужно задрочить, а какие знания освежить(на каких могу обосраться)
Обычная абстрактная фабрика это моветон, за такую отчепушат во все дыры и оставят у параши. Применение в современном гейдеве имеет только абстрактная синглтон прокси фабрика. Вся индустрия только на ней строится.
Ну тебе будет полезно знать STL, это определённо. Зубрить его не надо, но понимать нужно. QT тебе нахуй не нужен, он для интерфейсов только.
Boost ещё может быть полезен, но только в тех случаях, когда STL действительно не хватает. Буст ты до конца жизни не задрочишь. Если геймдев, то DirectX или OpenGL.
А вообще, определись кем ты хочешь стать собственно.
Так нет, про вещи относящиеся к гейдеву я и сам знаю что мне нужно знать. Очкую по языку обосраться т.к. на крестах давно не писал, да и вообще раньше его яростно ненавидел. Ну все базовые вещи я знаю, типа конструкторы, деструкторы, указатели, шаблоны, эти ваши вертуольные функции, ООП и т.д. Есть ли какой-нибудь гайд или книга для перекатывающихся с других языков или просто уже имеющих опыт? И еще какой-нибудь с неочивидными и заковыристыми моментами? А то спиздану что-нибудь типа "более высокий приоритет имеет шаблонизированная функция с такими же параметрами", а не наоборот. И меня прям на собесе отпетушат.
Многопоточность знать надо? Утилиты сборки типа cmake или вижуал студио сама за меня жепу подотрет?
По поводу книг - сюда:
https://github.com/sosachbot/cppthreadhat/wiki
Наверняка найдёшь что-то полезное, я уверен. Многопоточность скорее всего пригодится. Хотя и не факт. (Особенно блять важно помнить про ебучие указатели и ссылки, вот просто блять помнить как они работают). Сборщик мусора за тебя будет подтирать, так что помнить про удаление и уничтожение экземпляров тебе не нужно, если конечно через new их делать каждый раз не будешь.
Утилиты сборки помнить необязательно, если конечно под линукс делать не собираешься. Вижуал студио или другая IDE за тебя не только подотрёт, но и ещё и заоптимизирует с помощью спермотрюков, если попросишь.
Умные указатели же. А сборщики мусора вроде как есть сторонние.
Иначе будет слишком просто сорцы понять
Привет анончик, перекатываюсь из веб макаки в кресты. Возникают синтаксические / best practise вопросы. Может даст кто скайпик / вк уточнять такие нюансы (никаких заёбов и прозьб просмотреть код, только консультация)
>>undefined
Ещё один ёбнутый: это анонимная доска.
это я знаю) У меня пара вопросов есть.
Есть ли способ записать переменную при обьявлении типа int a = cin>>a;
И ещё один. Я работаю в clion и когда запускаю прогу но не ввожу данные и делаю билд опять, приложение зависает в памяти. И приходится убивать его иначе не могу сделать билд, пишет нет доступа к exe.
int a = cin>>a;
Зачем ты так делаешь? Ты лучше сначала объяви переменную, а затем уже что-то с ней делай. Но записывать в переменную данные при объявлении типа можно.
int a = 10;
int a = getSomeValue();
bool isWorking = example.getState();
>И приходится убивать его иначе не могу сделать билд
Ну так в чём проблема? При перекомпиляции он стирает старые скомпилированные файлы в том числе и exe. Завершай приложение перед компиляцией, всё верно он тебе говорит.
Смысл в том что открывает файл Clion, но он его не закрывает при билде и он остается висеть в памяти. Я его могу закрыть только через диспетчер.
Может это баг самого clion.
Саттера как раз наворачиваю. Осилил уже 50 страниц и у меня только один вопрос: Вы что ебанулись писать на плюсах в 2017? Не хватало в этом языке трудностей и неочевидных правил, а теперь еще каждый раз надо в голове держать разверсистые правила вывода типов и когда там моя переменная потеряет const, что там у меня rvalue, а что lvalue или когда указатель потеряет владение объектом и мой временный объект в три хуя на стеке выдолбят. Пиздец, выучите ruby, D, посмотрите как языки для людей должны выглядеть. Почитайте про акка и эрланг, как люди по уму многопоточность делают. Охуеть, пойду дальше дрочить ваши const
std::_Simple types<std::_Wrap_alloc<std::_Vec_base_types<Widget, std: :allocator<W1dget>>: :_ Alloc> ::value type> ::value_type *
Перед билдом поищи кнопку "завершение" приложения, и жми на неё. Я уверен, что она где-то есть.
Дык, это типичные классические спермопроблемы новичка — такое происходит всегда и во всех IDE (в том же последнем культяпкреаторе и студии (хотя там мб уже разобрались, я последний раз 10-й пользовался)) когда судорожно что-то постоянно меняешь и ребилдишь без остановки, причем только на шинде, очевидно что-то не так в системе (либо кто-то не учитывает какой-то ее механизм для чего-то). ну еще у того же QML вообще на всех платформах подобная проблема есть.
>>921580
Кнопочка "стоп" находится слева внизу, слева от места куда ввод-вывод из соснольки переправляется. Шлепай по ней и не ребилдь как сумасшедший.
Почему ему работать с треугольниками куда эффективнее, чем с теми же квадратами?
Почему при разработке игр и моделирования передвижения игрока по миру чаще всего двигают сам мир, а не персонажа в нем? Разве перемещение всех вершин не более затратная операция, чем перемещение вершин самого игрока?
Никто ничего не перемещает. Читай про матрицы преобразований. Каждая матрица умножается на вектор позиции вершины и получается вектор позиции объекта в координатах, которые нужны тебе.
Квадрат - два треугольника. Треугольник - минимальный способ нарисовать двухмерную фигуру, а также однозначно определить плоскость ее размещения.
Не говори о чем не знаешь, в Qt есть виджеты с opengl ускорением.
http://doc.qt.io/qt-5/qopenglwidget.html
Тянет где-то пару десятков тысяч квадратов на экране без просадок на моем ноуте. Да даже стандартными средствами Qt можно сделать тетрис и не будет ничего лагать.
Может быть линка на какой-то пример подобной реализация, а то я вообще хз. Если кто знает,может можно как-то посредством буста фрэймы из fc инкапсулировать в ip протокол.
Посмотри это:
https://youtu.be/-n9Fkq1e6sg
Boost сразу не советую, если для тебя вывод ошибок std "охуенный". Можешь попробовать другой компилятор, там сообщения об ошибках разные.
Вроде и у класса каждого по полтора метода, вроде и про паттерны слышал, и копипастить с переполненного стека умею. А на выходе ебаное говно. Что делать, ананасы?
>А на выходе ебаное говно. Что делать, ананасы?
Рефакторить, и не передавать указатели налево и направо.
>и вообще я уверен что это все течет как школьница при виде альфача
Ну не совсем всё так плохо. Попробуй, запусти, дай нагрузку. Не забывай деструкторы использовать, если ты что-то через "new" создаёшь. C++ хоть и упрощает выстрел в ногу, но не до такой же степени.
Хм... ну да. Задача соответствует условию. Спасибо. Чуть выше >>920250 анон тоже решение хорошее предложил, но оно довольно спецефично.
задача - условию - ответ условию. фикс.
Обязательно надо создавать переменную для отсеивания скобок?
Хули тебе надо-то? Платиновые вопросы про "= и ==" задавать?
Например, были файлы: abc, test, а стали 1. abc, 2. test.
И еще нужна программа, которая удаляет определённое число знаков сначала имени файла.
Если можно, сам я ++ по чуть-чуть изучаю, но до операции с файлами еще не дошёл.
Я не очень понял.
Для твоих целей использовать плюсы не очень умно, лучше ебануть скрипт на питоне.
Если уже так хочешь плюсы - твоё дело. Гугли pstreams (удобный хедер для исполнения консольных команд прямо с твоей программы, умеет получать выхлоп команды в отличии от system(), интерфейс как у iostream)
Как приблизительно это должно работать?
Получаешь содержимое папки:
redi::ipstream getDir("ls /path/to/dir");
Затем по одному читаешь из потока названия файлов, копируя каждую строку (кроме тех, которые собираешься удалить) из исходного файла в новый, после чего удаляя исходный файл:
redi::opstream rm("rm /path-to-file/file.txt");
Или тебе просто готовый код?
Мне не обязательно плюсы, просто плюсы - единственное что я смогу сделать из кода в компилируемый файл.
Я года 3 назад знал пхп, там я бы смог за 10 минут такую программу написать, но уже всё забыл.
Тебе на какую ОС? Ибо команды в винде и лине отличаются, тот же код на обеих ОС работать не будет.
набросал тебе первую программу. вторую слишком затратно писать на плюсах, ибо ей придётся копировать почти всё содержимое файла.
http://pastebin.com/eAix7Eyn
А что определять в "pstreams/pstream.h"? У меня при компеляции пишет что нет такого файла / папки.
> использовать плюсы не очень умно
Часто встречаю замечания по поводу нерациональности, со стороны программиста, использования С++ для работы с ОС. Если кто-то считает, что плюсы и в правду не подходит для решения задач в ОС, объясните начинающему - почему?
>почему
Cкорость разработки. На условном питоне есть широкая поддержка работы с ОС прямо в стандартной библиотеке. Иными словами, на пейтоне ты напишешь 6 строк, а на с+ 36.
По одной простой причине: код на плюсах не кроссплатформенный. Там нет аналога <os> в той же жабе, или питоне. Вместо этого используется winapi или POSIX-вызовы.
>вторую слишком затратно писать на плюсах, ибо ей придётся копировать почти всё содержимое файла.
Я в с+ треде или где?
http://www.cplusplus.com/reference/cstdio/rename/
Извиняюсь, оно с виндой, как оказалось, не дружит. Попробуй версию 0.17, там ещё была совместимость (не факт, что скомпилируется). Если нет - сейчас поищу другую либу и перепишу
js + os.js || electron = crossplatform forevaaa!
Не совсем. Вроде в новом стандарте таки появились кроссплатформенные варианты работы с той же файловой системой благодаря бусту.
Хотя, если использовать буст, то получить кроссплатформенность можно, но программа будет занимать несколько больше.
В глаза ебусь, прочитал как "определённое количество знаков в начале файла".
Берёшь, и становишься. Всё очень просто.
>Почему ему работать с треугольниками куда эффективнее, чем с теми же квадратами?
Треугольник --- примитив растеризации. Квадрат --- два треугла.
>Почему при разработке игр и моделирования передвижения игрока по миру чаще всего двигают сам мир, а не персонажа в нем? Разве перемещение всех вершин не более затратная операция, чем перемещение вершин самого игрока?
Потому что отрисовываешь картинку относительно глаз персонажа, а не (0;0;0) мира
> Потому что отрисовываешь картинку относительно глаз персонажа, а не (0;0;0) мира
А преимущество-то в чём?
Докатились... Ты шутишь, да?
Это совсем уже платиновый вопрос.
[CODE]cout.precision(/number/); // задает количество знаков после десятичной точки
// где number - количество знаков после десятичной точки[/CODE]
не работает эта ебатория
количество нулей не меняется(
делал как тут написано
http://www.cplusplus.com/reference/ios/ios_base/precision/
http://ideone.com/A0APTP
Ньюфаги, вы ополоумели? Ещё спросите как напечатать в консоль матрицу
>Почему при разработке игр и моделирования передвижения игрока по миру чаще всего двигают сам мир
Потому что ты двигаешь объекты виртуального мира проецируемые на монитор, а не монитор в виртуальном мире.
Почему ему работать с треугольниками куда эффективнее, чем с теми же квадратами?
Вершины треугольника не могут не лежать в одной плоскости (это очевидно). А если взять квадрат из 4х вершин, и случайно подвинуть одну из вершин не перпендикулярно нормали этой плоскости, сломается геометрия (он уже перестает быть плоской фигурой, и чтобы исправить положение, придется его разбивать на треугольники вдоль одной из диагоналей). По этому любые многоугольники треангулируются, так проще - меньше логики (хотя бы в проверках), несколько проще элементы gpu (а значит их можно сделать большее количество за меньшие деньги)
Удваиваю этого.
Требуется определить, "пересекаются" ли они общими частями (как на пикрилейтед). Есть ли что-нибудь в стандартных либах или в бусте, или нужно велосипедить?
Вообще не то.
Ребята, которые написали сам код используют gnu компилятор какой-то версии из последних, где есть поддержка c++11.
Я использую компилятор от ARM 6.6 - это необходимо. В ARM6.6 есть поддержка с++11, но с некоторыми ограничениями.
Проблема заключается в том, что в проекте используется одна библиотека, где используется метод std::move. В свою очередь, в описании поддержки компилятором от ARM c++11 пишется, что std::move не поддерживается, но есть прямой аналог (то есть дают кусок кода) реализации с помощью static_cast.
То есть проблема: при сборке проекта у меня выбивает ошибку о том, что no member std::move was found, что весьма логично. А что мне делать?
Что нашёл и что непонятно:
1) Если менять функцию прямо в std, то получим undefined behavior. На практике получим ту же ошибку, то есть то, что member was not found
2) Менять компилятор - будет пиздец. А это вообще может быть выходом?
3) Как override функцию в std - может, я неправильно это делаю? В гугле вообще говорят что это бред, да и в принципе будет undefined behavior
большое спасибо, если кто выскажет свои мысли/решения.
решено, что помогло:
1) создаю move.h, где пишу
namespace std{
template<> return_value move(args) {....}
}
2) подключаю move.h именно там, где использую функцию std::move
3) profit
иду учить матчасть про неймспесы и переопределение
Как ты заебал уже
Он уже не бампается
Меня малость пугает то, что никто этого делать не хочет. Это подозрительно, тут что-то не так
При чем тут перекот. Если бы тред был с ним связан, его бы удалили, как остальные.
Вы видите копию треда, сохраненную 10 марта 2017 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.