[ /tv/ /rf/ /vg/ /a/ /b/ /u/ /bo/ /fur/ /to/ /dt/ /cp/ /oe/ /bg/ /ve/ /r/ /mad/ /d/ /mu/ /cr/ /di/ /sw/ /hr/ /wh/ /lor/ /s/ /hau/ /slow/ /gf/ /vn/ /w/ /ma/ /azu/ /wn/ ] [ Main | Settings | Bookmarks | Music Player ]

No.39226 Reply
File: cat.png
Png, 33.56 KB, 200×209 - Click the image to expand
edit Find source with google Find source with iqdb
cat.png
Предыдущий тред: >>31221
>> No.39228 Reply
>>39188
А как же комбинаторы и лямбда?
>> No.39229 Reply
>>39228
Математики - это такие люди, которые умеют решать дифуры. Они ничего не знают про глупые комбинаторы и лямбды. (сарказм)
>> No.39235 Reply
>>39229
Вот вы смеетесь, а я у себя на кафедре регулярно вижу объявления семинаров по решению очередных дифур. И по другим темам семинаров отродясь не было.
>> No.39238 Reply
>>39224
> > Не цикл, а циклическая структура. Список, который замкнут сам на себя. Цикла нет, рекурсии нет, бесконечный хеллоуворд есть.
Окей убедил. А факториал сможешь так сделать? >>39226

> > Я обращаюсь к двум разным переменным
По одному и тому же имени?
>> No.39239 Reply
>>39238
http://ideone.com/Qw3Um0
мимо-факториал
>> No.39240 Reply
>>39238
> Окей убедил. А факториал сможешь так сделать?
Скажем так. Если использовать ленивые списки - можно сделать любую задачу про циклы или рекурсию. http://ideone.com/HAx1Dn
Просто ленивые списки - это тоже сорт оф рекурсия (потому что сохраняет функцию-генератор для генерации следующего элемента).

Проходы хай-ордер функциями по циклической структуре - это скорее хак, чем реальный солюшен. Без трай-эксепшена из такого цикла не выйти. Но если вопрос конкретно про тюринг-полноту, то while так написать получится.

Но конкретно для факториала и не нужны ленивые списки. Обычных списков и хай-ордер хватает: http://ideone.com/JbRBTS
> По одному и тому же имени?
По двум разным. По таким-же разным, как разные http://ideone.com/XPdZEc one и newone, и использует такие-же одинаковые данные, как two и three. Теперь-то понятно?
>> No.39243 Reply
File: 1224707819435.jpg
Jpg, 81.67 KB, 750×586 - Click the image to expand
edit Find source with google Find source with iqdb
1224707819435.jpg
Я вам картинку принес.
>> No.39375 Reply
>>39240
list *list = &one;
list = &newone;

Ну да one и newone разные. Но лист то тот же.
> > Проходы хай-ордер функциями по циклической структуре - это скорее хак, чем реальный солюшен. Без трай-эксепшена из такого цикла не выйти. Но если вопрос конкретно про тюринг-полноту, то while так написать получится.
Если дать изменять элемент то думаю и без эксепшенов обойтись можно. Но это сорт оф извращение.
>> No.39415 Reply
Кресты надо мной издеваются хнык-хнык. Есть такой код в foo.h:
template<typename T> class Foo
{
...
public:
    template<typename U> U bar(const U & x);
}
И такой код в foo.cpp:
#include <foo.h>
...
template<typename T, typename U> U Foo<T>::bar(const U & x)
{ ... }
На это мне конпелятор ругается, говорит такие вещи:
error: prototype for U Foo<T>::bar(const U&) does not match any in class Foo<T>
candidate is: template<class T> template<class U> U Foo<T>::bar(const U&)
То есть, как я понял, он не видит объявление функции, и как предполагаемый вариант предлагает точно такое же объявление. Что делать, как быть?
>> No.39421 Reply
>>39415
Таак, я разобрался с этой проблемой, но не разобрался с причиной. Чем отличаются template<typename T, typename U> и template<typename T> template<typename U>? Почему это даёт разные результаты? Причём это только в этой функции, когда я перегружаю операторы, скажем, +=, то в foо.h у меня эти template раздельные (один у определения класса, другой у прототипа функции), а в реализации я пишу template<typename T, typename U> и всё работает. А эта функция не работала, особая магия.
>> No.39503 Reply
>>39375
> Но лист то тот же.
С чего бы он был "тот же"? Он в один момент равняется one, в другой - newone. list* - это не структура, это всего-лишь указатель.
>> No.39727 Reply
Пишу на куте. Пока делал хелловорлд с интерфейсами, всё было ок. Заебенил охуенный шаблонный класс с частичной специализацией и всё поломалось. Выдаёт какую-то хуиту почти на каждую строчку вместо ошибок. Так и знал, что нельзя доверять этим мутным расширениям языка.
>> No.39728 Reply
>>39727
> Заебенил охуенный шаблонный класс с частичной специализацией и всё поломалось. Выдаёт какую-то хуиту почти на каждую строчку вместо ошибок.
Теперь тебе остаётся только внимательно перечитывать каждую строчку своего класса и искать, где именно накосячил. Наслаждайся своим C++! Только здесь компилятор может под невнятным предлогом свалить проверку валидности грамматики на программиста.
>> No.39729 Reply
>>39728
Там нормально все. Это куте выпендривается. Ошибки в крестовом синтаксисе компилятор нормально показывает, я их поправил, и он высрал какую-то чушь с рандомными буквами вместо названий переменных и функций.
>> No.39730 Reply
>>39729
> высрал какую-то чушь с рандомными буквами вместо названий переменных и функций
Уверен, что это был компилятор, а не линкер? Если это линкер, то ты нарвался ещё на один известный отсос плюсов - линковка шаблонных классов, если: а) в твоей программе класс используется более чем с одним набором параметров (например, MyClass<int> и MyClass<bool>), и б) реализация шаблонных методов лежит не в *.h, а в *.cpp. Наименьший костыль для разрешения этой ситуации - это перенос реализации шаблонных методов в заголовочник.
>> No.39735 Reply
>>39730
Таки да, линковка. Вообще проблема оказалась в том, что библиотека для работы с сетью линкуется отдельно, но шаблон я тоже вынес на всякий случай, так что не знаю, влиял ли он.
Ну и в итоге апогей - Error: Template classes not supported by Q_OBJECT
Больше копипаста богу копипасты. Ну либо выносить это всё в динамику, что идиотизм как по мне.
>> No.39739 Reply
Увидел сегодня на ith????ns.ru очередной высер. Суть примерно такова: в древние лохматые времена программисты писали код для БК-0010, им приходилось экономить каждый байт и каждый такт, поэтому даже имена переменных были односимвольными. Теперь же, во времена мощных, ёмких и быстрых компьютеров программисты распоясались настолько, что в коде для 8-разрядных контроллеров с ничтожно малым количеством ПЗУ и ОЗУ используют - о ужас! - переменные с именами из 4 символов, потому что совсем разучились экономить, черти.
Поясни, анон, как длина имён переменных сказывается на размере готового бинарника? Разве компилятор не должен заменить имена переменных на их адреса в оперативе? Как вообще автор дошёл до таких рассуждений?
>> No.39740 Reply
File: wtf-jackie-chan.jpeg
Jpeg, 29.03 KB, 630×400 - Click the image to expand
edit Find source with google Find source with iqdb
wtf-jackie-chan.jpeg
>>39739
Картинка для привлечения внимания отклеилась. Хотя кому какая разница.
>> No.39741 Reply
>>39739
Байка - пиздеж. Мы с посонами в школе писале на бейсике под эти машинки, никакой блядской экономии памяти не применяли.
>> No.39742 Reply
>>39739
Автор - хуй и наркоман, очевидно же. Естественно имя переменной ни на что не влияет - это просто обозначение участка памяти, к которому надо обращаться и он будет записан простым числом в итоговом коде. Осло, на асме вообще работают только с фиксированным числом регистров, всё ручками, никаких переменных.
>> No.39743 Reply
>>39739
Хуита ололо-кодера. Можно экономить разве что для коньпеляции на самой восьмибитной машинке, там всего 64к адресуемо и ещё часть отъедает пзу/экран и прочие дела. Но опять же можно побить на части и не парить мозг.
>> No.39748 Reply
>>39739
Нет, ну в ДРЕВНИЕ ВРЕМЕНА экономия буковок имела место быть, даже в программировании серьезных машин на производстве. Просто потому, что были ограничения весьма суровые на это дело. Но в наш-то век это уже давно не актуально.
>> No.39750 Reply
>>39739
> Поясни, анон, как длина имён переменных сказывается на размере готового бинарника?
Никак, разумеется, какая-то байка. В настолько лохматые переменных скорее всего вообще не было, были конкретные числовые адреса конкретных ячеек. Когда вместо адреса идёт переменная с именем, то уже никак. В бинарнике снова идёт указание на конкретные числовые адреса ячеек уже. Они, правда, не так чтобы прям совсем конкретные сейчас на многозадачных компах, операционка даёт некую абстракцию со своим диапазоном адресов для каждого бинарника, то есть отображает адреса бинарника на реальные по-своему.
>> No.39756 Reply
>>39750
> В бинарнике
> лохматые времена
> повсеместный бейсик
>> No.39757 Reply
>>39756
Троль в другом месте или говори нормально.
>> No.39758 Reply
>>39757
Был бейсик, он интерпретатор. Софт получался как бы и в исходниках, но делались всякие интересные защиты от LIST, например. Однобуквенные переменные использовались, насколько я знаю, из-за скорости поиска в таблице символов. Были еще лимиты на максимальную длину имени.
Что касается второй части истории, то я сравнительно недавно (2009) видел программу для военных (DOS, C++), написанную в каком-то НИИ, там были переменные типа a12, где буква - назначение, а цифры - номер. Номера расшифровывались на бумаге, причин выяснить не удалось, кроме того, что автор программы - женщина.
>> No.39762 Reply
>>39758
> он интерпретатор
Вопрос был задан о бинарниках и я забыл упомянуть, что имел в виду случай компилируемый в бинарник программ. Интерпретатор бейсика был популярен? Правда?
>> No.39763 Reply
>>39762
Интерпретатор бейсика был сорт оф ОС в очень многих восьмибитных машинках. Ну и в целом он создавался для обучения, так что интерпретатор предпочтительнее, очевидно. Это потом, когда уже выучили, решили конпелять для прикладного применения, лол.
мимо
>> No.39764 Reply
>>39763
> для обучения
Я думал, мы говорим о промышленной практике. При чём тут обучение? И вообще, зачем что-то экономить для обучения.
>> No.39765 Reply
>>39764
> Вопрос был задан о бинарниках и я забыл упомянуть, что имел в виду случай компилируемый в бинарник программ.
Но в истории из >>39739 не бинарник, поэтому мы и разговариваем о переменных в бейсике.
> Я думал, мы говорим о промышленной практике.
Я думал, мы говорим об истории на сайте. Специально сходил ее прочитать. Бейсик, значимая длина имени переменной - 2 символа (ты можешь написать numberofnuclearweapons=0, nuclearweaponready=1, и, сюрприз, numberofnuclearweapons станет 1, потому что в таблице символов у интерпретатора будет лежать только NU).
> > Разве компилятор не должен заменить имена переменных на их адреса в оперативе?
Ты прав, но не все так просто. Когда компилятор создает объектные файлы, и в них обязательно есть таблица символов, в которой в числе прочего лежат имена внешних переменных и функций (extern). Сравнивая эти имена, линкер связывает объектные файлы между собой, создавая исполняемый файл. Кстати, стандарт сишечки разрешает линкеру сравнивать только первые 6 символов имени в C89 и 31 символ в C99, и какой-нибудь древний линкер имеет право точно так же, как и бейсик, "перепутать" nuclearweaponcount с nuclearweaponready счастливой отладки. Впрочем таких линкеров давно не делают.
> > Поясни, анон, как длина имён переменных сказывается на размере готового бинарника?
Прямо сказывается, если используется динамическая линковка. Скомпилируй int __declspec(dllexport) very_long_НЕСКОЛЬКО_КИЛОБАЙТ_ПОДЧЕРКИВАНИЙ_name = 1; майкрософтовым компилятором. Если хочешь заметной прибавки размера, сделай много таких переменных. А еще есть отладочная информация, кстати.

39758
>> No.39770 Reply
>>39765
> Ты прав, но не все так просто. Когда компилятор создает объектные файлы, и в них обязательно есть таблица символов, в которой в числе прочего лежат имена внешних переменных и функций (extern).
То есть имена всех функций и глобальных переменных, видимых извне (т.е. объявленные в заголовочнике), попадают в бинарник как есть?
> Прямо сказывается, если используется динамическая линковка.
Окей, но в истории упоминается микроконтроллер, управляющее термостатом. Может быть, в коде для МК действительно возможна динамическая линковка, но лично я об этом не слышал. Да и смысл в динамической линковке при гарвардской архитектуре и памяти программ, в общем случае доступной только для чтения.
> А еще есть отладочная информация, кстати.
Но в память микроконтроллера она не попадёт же (по крайней мере, на AVR не попадает), и объём использованной памяти программ и оперативы останется прежним.
>>39739-кун
>> No.39773 Reply
>>39770
> То есть имена всех функций и глобальных переменных, видимых извне (т.е. объявленные в заголовочнике), попадают в бинарник как есть?
Имена попадают в объектник, в статическую либу. В бинарник в идеале попадают только символы, необходимые для динамической линковки и отладочные символы.
> в истории упоминается микроконтроллер, управляющее термостатом
Недостаточно кофейной гущи, чтобы понять, что там за переменные в термостате. Точно не реальные имена переменных - они становятся адресами, ты прав. Но могу предположить, что автор либо о тексте, отображаемом на ЖК-индикаторе при настройке (типа TEMP:52°C), либо об именах параметров в конфиге, который загружается внутрь устройства. По идее, конфиг обычно преобразуется из текста в блоб перед загрузкой, но, может быть, у автора конфиг грузится текстом и парсится прямо на термостате? Тогда там мог бы быть какой-нибудь массив пар "имя_параметра_в_конфиге", смещение_или_адрес_переменной_в_памяти для парсера. В любом случае, это вряд ли можно назвать именами переменных.
>> No.39825 Reply
Попал в руки файлик .c с экзешником. Нужно изменить там одну строчку так, чтобы переписанный кот исполнялся. Как это сделать быстро и без двухдневных ритуальных танцев?
>> No.39833 Reply
почему многие любят анальные игры с чернокожим си когда есть светлый си шарп?
>> No.39834 Reply
>>39833
смищно
>> No.39835 Reply
>>39833
Няшным Си редко пользуются джля игор. Обычно для высокопроизводительных тридэ игор пользуют кресты. По крайней мере для движка точно.
> светлый си шарп
Лучше уж JVM тогда.

Вообще для разных частей игор можно разные ЯП использовать. Если нужны тонны оптимизаций, то следует обратить внимание на C++. Если нужно писать сервер под ММО, то нечто вроде Scala или Go лучше подойдёт. Если нужны всякие фенечки для создания контента то можешь выбирать любой ЯП. Если ты пишешь простую двадэ, то можешь хоть на питоне писать. Если конечно платформа поддерживает.
>> No.39841 Reply
>>39825
А теперь то же самое, но по-русски.

>>39833
Каждый, кто пробовал работать, например, с гигабайтами бинарных данных в светлом сишарпе, однажды задумывался, такой ли он светлый на самом деле. И даже без гигабайтов жизнь тоже не мед.
местный обратно-инженер
>> No.39867 Reply
>>39841
Ну и как часто в XXI веке приходится работать с гигабайтами бинарных данных?
>> No.39870 Reply
>>39867
Каждый день.
>> No.39871 Reply
>>39841
субд не инкапсулирует эту работу в основном? И разве разница будет значительна на таких данных?
>> No.39872 Reply
>>39870
Ну и зачем?
>> No.39873 Reply
>>39872
Во благо всех добрых людей.
>> No.39876 Reply
>>39873
Нет, реально. Зачем нужно каждый день работать с гигабайтами бинарных данных?
>> No.39879 Reply
>>39876
Навскидку: самописная СУБД, (де)кодирование чего-нибудь (например, видео), обработка каких-нибудь данных с адовой горы датчиков.
>> No.39882 Reply
>>39876
Фотограмметрия (упрощенно говоря, 3D-сканирование с высоким разрешением). Неприятный формат файлов - вперемешку битсеты, текст, бинарные структуры без выравнивания, кое-что пожато. Софт свой. Интерфейс на C#, бэкенд (чтение, модификация, преобразование файлов и очень-очень много разнообразной обработки) - на C и асме (правда, уже почти все переписали на интринсиках). Софт постоянно дорабатывается. Показательно, что C#-бэкенд тоже был, но заброшен несколько лет назад (насколько я знаю, из-за тормозов и общей сложности кода), зато все чаще возникают разговоры об интерфейсе на Qt.
>> No.39883 Reply
>>39882
Также отказался от c# в пользу крестов. От модного .NET Remoting перешел к простому протоколу на http запросах. Время разработки и впиливания новых фич уменьшилось в разы. И это при том что гуй я сделал в виде html странички с кучей js кода и ajax вызовами, и вот что я скажу wpf даже рядом не стоит. Казалось бы я должен много времени тратить на выискивание проблем с утечками, но нет умные ссылки спасают.
>> No.39885 Reply
>>39883
Лол, и эти люди потом говорят, что .NET Framework тащит с собой много лишнего, неоптимально решает задачи и слишком ресурсоёмок. Что за упорки, прости г-споди.
>> No.39886 Reply
>>39885
А что не так с моим решением? Скорость разработки увеличилась, простота поддержки выросла, тормоза ушли. Или ты думаешь я сам сокеты мучаю? boost::asio решает эту проблему. Единственное по чем скучаю это интерфейсы как конструкция языка.
>>39876
Камера шлет на сервер видео поток например.
>> No.39887 Reply
>>39886
> динственное по чем скучаю это интерфейсы как конструкция языка.
#define class interface
>> No.39889 Reply
>>39886
> А что не так с моим решением?
То, что вместо бинарных данных, передаваемых в .NET Remoting, ты замутил громоздкий текстовый HTTP, потеряв по пути server-push уведомления (или клиенты теперь тоже работают HTTP-серверами, обрабатывающими POST-запросы от сервера?). Кроме того, потерялась встроенная сериализация объектов (готов поспорить, у тебя вместо неё JSON, свой костыль вместо RTTI и фабрика классов, создающая всё подряд) и MarshalByRefObject, реализующий RPC - вместо них теперь тоже вкорячены твои костыли, которые ты будешь ещё кучу времени дописывать, отлаживать и править.
BTW, вылезай из криокамеры - в дотнет-мире появился WCF, у которого есть куча опций для организации канала между сервером и клиентом. В том числе, внезапно, и HTTP (повторюсь, всего лишь в виде одной из опций). По настраиваемости конечного продукта без перекомпиляции приложения он натянет твой велосипед и порвёт его в клочья.

Про HTML для гуя даже комментировать не буду - из присущего WPF compile-time, так горячо любимого и ценимого всеми плюсоёбами, ты зачем-то перенёс всё построение, валидацию и логику в рантайм. Пусть диагностикой и лечением твоего фимоза головного мозга занимаются специалисты, я здесь бессилен.
>> No.39890 Reply
>>39889
> (или клиенты теперь тоже работают HTTP-серверами, обрабатывающими POST-запросы от сервера?)
Вообще то вроде бы да. Веб-сокеты же хуё-моё. Или я что-то путаю.
>> No.39891 Reply
>>39887
Рассмешил.

>>39889
Да клиенты тоже работают как http сервера, не вижу в этом чего-то плохого, например я могу посмотреть настройки, результаты профилирования, логи и некоторые другие вещи просто сходив по нужному урлу.
> > готов поспорить, у тебя вместо неё JSON
угадал json и boost::json для серелизации. MarshalByRefObject лол, как там с NAT-ом уже все пофиксили? И что восстановление связи тоже теперь беспроблемное?
> > По настраиваемости конечного продукта без перекомпиляции приложения он натянет твой велосипед и порвёт его в клочья.
Без перекомпиляции? Покажи мне как ты добавишь новую команду(в твоих терминах вызов удаленной процедуры) в протокол без перекомпиляции? А самое интересное временные затраты на добавление протягивание связей туда сюда.
Вернись в реальный мир простой текстовый протокол проще для понимания, проще для изменения и проще для поддержки. Кстати с WCF я смогу подружить программку на питоне, а на bash? Понимаешь если мы будем общаться не по HTTP логика взаимодействия все равно поменяется и код придется править даже с WCF. В реальном мире стоимость поддержки моего велосипеда меньше а скорость написания выше. Конечно он проще только внезапно мало кому приходит в голову идея менять протокол в уже написанной и отлаженной клиент серверной системе. Гуй другое дело, там важна возможность кастомизации.
> > Про HTML для гуя даже комментировать не буду - из присущего WPF compile-time, так горячо любимого и ценимого всеми плюсоёбами, ты зачем-то перенёс всё построение, валидацию и логику в рантайм.
И что? Зато теперь я могу хоть с телефона рулить хоть с планшета хоть с пекарни. И да с wpf ты точно также валидируешь ввод. Только теперь у меня надежно гуй отвязан от логики. Ах да я могу на лету поменять весь гуй.
И даже школьник может построить свою версию внешнего вида.
>> No.39957 Reply
File: 1384285507760.jpg
Jpg, 59.45 KB, 600×600 - Click the image to expand
edit Find source with google Find source with iqdb
1384285507760.jpg
Читаю C++ Faq на английском и не могу понять один из рассматриваемых вопросов, а именно этот: http://www.parashift.com/c++-faq/virtual-inheritance-ctors.html
Я так понимаю, там описывается правило, по которому устраняется неопределённость при вызове конструктора базового класса при виртуальном наследовании, но я не могу понять это правило. Что значит выражение "most-derived-class's constructor"? Поясните мне это всё на русском, пожалуйста.
>> No.39959 Reply
>>39957
Всё, помогли разобраться. Просто конструктор базового класса вызывается из списка инициализации конечного класса, а не из тех классов, которые наследуются от базового. Вот, набросал иллюстрирующий пример, если кому-то интересно.
#include <iostream>

class A
{
public:
	A(int i): i_(i) {}
	int geti()const {return i_;}
private:
	int i_;
};

class B: public virtual A
{
public:
	B(): A(5) {}
};

class C: public virtual A
{
public:
	C(): A(7) {}
};

class D: public B, public C
{
public:
	D(): A(6) {} // если не вызвать здесь явно конструктор A, то не откомпилируется
};

int main()
{
	D x;
	std::cout << "D::i_ == " << x.geti() << '\n'; // выведет D::i_ == 6
	return 0;
}
>> No.40069 Reply
>>39959
Ну вот и зачем нужно было всё так усложнять?..Какую задачу решает этот костыль?
>> No.40070 Reply
>>40069
Какую задачу может решать код с классами А, B, C и D? Или что ты имел в виду?
>> No.40071 Reply
>>40070
>>40069
Это же пример, ему не обязательно решать какую-то задачу. Какую задачу решает хэллоуворлд? - Правильно, это просто пример.
>> No.40072 Reply
>>40070
>>40071
Конечно же, я имел в виду виртуальные базовые классы, а не абстрактный код. Хотя ответ, наверное, будет очевиден: чтобы не плодить клонов объектов. Но это и так можно не делать, без введения костыля в язык.
Вот, если бы класс C ещё наследовался от другого виртуального класса, скажем, Z, то классу D пришлось бы вызывать конструкторы и для класса А, и для класса Z. А он может и не иметь для него нужных данных, хотя те, кто будут использовать только класс C, будут их иметь.
>> No.40082 Reply
>>40072
> Конечно же, я имел в виду виртуальные базовые классы
> Но это и так можно не делать, без введения костыля в язык.
Каким образом не поведаешь? Можно на абстрактном или реальном примере (типа basic_iostream).
>> No.40083 Reply
>>40082
Конечно. Тебе слово агрегирование о чём-нибудь говорит? Будет немного печально, если ты попросишь меня привести пример, как это сделать с помощью агрегирования.
Может, ты объяснишь мне, как избежать проблем с использованием классов, в примере, который я описал? Только не говори, что так напишет только даун и вообще проблемы в архитектуре классов, а не в языке.
>> No.40084 Reply
>>40072
Я так понимаю, ты не слышал про проблему ромба. Вот уж в виртуальном наследовании очевидного совсем ничего нет, не зря его и множественное наследование вообще так часто ругают. Виртуальное наследование решает проблему ромба, когда ты отнаследовался от двух классов одновременно, которые имеют общего предка. Если ты не включишь виртуальное, то в объекте будет содержатся "дед" объекта дважды, по одной линии и по другой. Это значит, что и значения там разные будут.

Например, ты добавил в класс фич таких и таких, создав ему двух наследников. А потом решил соместить все фичи в одном наследнике. Но добавляя фичи, тебе не нужно ещё и сами поля сдваивать. А то у тебя при использовании фич из того и другого "отца" будут разные значения "дедов" использоваться.

Причём добавляет байтоёбский принцип плюсов, что ничто, что ты не используешь, не должно налагать накладные расходы. Виртуальное наследование влечёт немножко накладных расходов. Ты ставишь virtual руками, чтобы дать расписку, что ты официально согласен на расходы. То же и со словом virtual у функций по поводу расходов.

virtual у виртуальных функций и virtual же у наследования никак между собой не связаны, хотя слово одно и то же. То что слово virtual может иметь абсолютно разное значение тоже вызывает по поводу С++ много негодования.
>> No.40089 Reply
>>40084
Я знаю про проблему ромба. Если ты хочешь, чтобы я написал код, который её обходит, не используя виртуального наследования, то: http://ideone.com/fork/6U9lDy. Но, по-моему, проблема решается изменением архитектуры классов. Сколько раз тебе приходилось сталкиваться с ромбовым наследованием? Если больше одного, то случай из жизни для дискасса в студию!
Напомню, что вся библеотека QT, которая посроена просто на QObject'ах, не разрешает использовать виртуальное наследование для QObject, у moc'а parser error случается. И ничего, живут же как-то люди. Как?
>> No.40090 Reply
>>40089
Нет, не больше. Я просто изложил теорию. Я никогда бы не стал херачить ромб, если бы мог обойти его. Такой звёр вообще же только в крестах водится, так?
>> No.40091 Reply
>>40090
Все нормальные языки отказываются от множественного наследования и идут к светлым интерфейсам, я надеюсь.
>> No.40096 Reply
>>40083
Что за дурацкая привычка - вилять жопой и отвечать вопросом на вопрос?

>>40089
> http://ideone.com/fork/6U9lDy
Вот так бы сразу... Код великолепный просто! Мало того, что надо писать синглтон-прокладку SubA на каждый такой класс с кучей геттеров\сеттеров (ибо до полей A не добраться), дык еще B и C требуют модификации. new А не освободил, а если бы попробовал (без подсчета ссылок) - деструктор SubA будет вызван дважды со всеми выползающими. D неприводим к A, A* SubA::m_a = NULL; - лол. Полный абзац, ты сделал почти то же самое, что делает за тебя компилятор при виртуальном наследовании, только на порядок хуже. Поздравляю :3
>> No.40097 Reply
>>40096
Хотя какое в жопу "почти", тут все экземпляры D разделят твой сраный синглтон между собой... Это даже близко не решение.
>> No.40100 Reply
File: 1243769791689.jpg
Jpg, 94.61 KB, 745×554
Your censorship settings forbid this file.
unrated
Котаны-котаны. Есть одна прога на крестах, консольная. В этой проге есть чтение из файла и из консоли. С чтением из файла здорово. В памяти у строки адекватный, читаемый вид. Беда начинается, когда я читаю из консоли — вместо кириллицы выходят какие-то странные символы. Что при выводе, что в памяти. Не знаю, могла ли на это повлиять "setlocale", или ещё что-нибудь. Ввод-вывод потоковый, все дела. Пробовал использовать wstring и соответствующие потоки, но что-то не катит. Каким костылём образом заставить консольный ввод принимать кириллицу?
>> No.40101 Reply
>>40100
> Каким образом заставить консольный ввод принимать кириллицу?
В голых крестах вроде нет уникода, он считывает только ansi. Я помню мне давно еще в паскале пришось решать эту проблему ручным считыванием кодов символов и переводом их в кириллические.
>> No.40104 Reply
>>40101
> нет уникода
> > Пробовал использовать wstring и соответствующие потоки, но что-то не катит.
wstring и wchar_t хранят юникодовые символы. И, что примечательно, их применение ничем мне не помогло.
> считывает только ansi
Так я ему уже и setlocale(LC_ALL,"Russian") прописал, и пробовал трюки с cin.imbue вытворять, что, скорее всего, было бесполезно. Есть предположение, что консольный ввод обрабатывается по cp866, хотя вывод организован в win1251. Проверю и отпишусь.
>> No.40105 Reply
Так оно и есть. Когда прописал wcin.imbue(locale("RussianRussia.866")) оно реально было кириллицей. Осталось переписать методы под работу с wchart. Костыли-костылики...
>>40104-кун
>> No.40106 Reply
>>40104
> Есть предположение, что консольный ввод обрабатывается по cp866, хотя вывод организован в win1251.
Именно так и есть. И это проблема не крестов, а сраной виндовой консоли.
>> No.40107 Reply
>>40106
P.S. Только там и ввод и вывод в 866.
>> No.40109 Reply
>>40107
После setlocale вывод в win1251, я гарантирую это. Потому как исходник в ней, выводимые данные в ней, а кракозябр нет.
>> No.40130 Reply
>>40091
Есть ещё различные промежуточные варианты: миксины, трейты, бихейвиоры. Они всё же позволяют множественно наследовать реализацию, но всё равно не позволяют наследовать и переопределять, что попало.
>> No.40147 Reply
File: o291028.jpg
Jpg, 324.02 KB, 1440×900 - Click the image to expand
edit Find source with google Find source with iqdb
o291028.jpg
>>39226
Есть программа, которая получает длинную строку и работает с ней разбирая ее на части. Ясное дело, что лучше будет, если функции будут общаться не кусками строки, которые будут постоянно копироваться, а а позициями start и end исходной строки. Так вот, есть ли в стандартной библиотеке для этого специальный тип?
Что то вроде этого
struct StringRange
{
std::string::iterator start;
std::string::iterator end;
};
>> No.40157 Reply
>>40147
> в стандартной библиотеке
Нету.

Но, возможно, тебя заинтересует boost::string_ref.
>> No.40170 Reply
>>40157
Очень хорошо, спасибо.
>> No.40252 Reply
File: 1410266975874.png
Png, 0.90 KB, 300×20
edit Find source with google Find source with iqdb
1410266975874.png
File: Raisins_Face.jpeg
Jpeg, 57.92 KB, 680×408
edit Find source with google Find source with iqdb
Raisins_Face.jpeg

>> No.40256 Reply
>>40252
Ну что тебе не так?
>> No.40274 Reply
>>40256
Все так. Если будет бесплатная версия после релиза, все остальные иде станут не нужны, а их авторы сопьются с горя.
>> No.40288 Reply
>>40274
Сомневаюсь, но иде не плоха, на первый взгляд, даже захотел попробовать.
>> No.40329 Reply
File: cygwin-logo.png
Png, 34.38 KB, 341×422 - Click the image to expand
edit Find source with google Find source with iqdb
cygwin-logo.png
>> No.40373 Reply
>>40274
> Если будет бесплатная версия после релиза
И сразу соснул.
Стоить будет как AppCode, а именно сотню зелени за персональную лицензию. Для трудоустроенного профессионала - копейки, но падаваны и прочие интересующиеся соснули.
>> No.40374 Reply
>>40373
Ватевер. Идею до ввода бесплатной версии элементарно было спиратить, сейчас не знаю мне стыдно пиратить в таких условиях. Студию тоже многие пиратскую используют из-за плагинов.
>> No.40375 Reply
File: like-a-boss.jpg
Jpg, 52.16 KB, 500×361 - Click the image to expand
edit Find source with google Find source with iqdb
like-a-boss.jpg
>>40374
А я лицензионным вимом пользуюсь.
>> No.40376 Reply
>>40375
Подразумевая, что бывает пиратский вим.
>> No.40380 Reply
>>40376
Будто нельзя нарушить VIM LICENSE.
>> No.40382 Reply
>>40380
Нельзя.
>> No.40417 Reply
File: pic.jpg
Jpg, 379.49 KB, 986×1500 - Click the image to expand
edit Find source with google Find source with iqdb
pic.jpg
>>39226
Какие комментарии принято писать при определении функций класса? Просто поделить на public/private methods?
>> No.40420 Reply
>>40417
> при определении
Не нужно. Ну либо копировать из объявления, чтоб не скакать по файлам.
Приватные методы стоит описывать, если есть вероятность передачи этого кода другим людям, публичные всегда. Описать что делает и что ожидает в качестве параметров. Посмотри описание к любому апи же. Разные системы документации умеют автоматически собирать комментарии над методами и классами, от этого бывает специфический синтаксис.
>> No.40421 Reply
>>40420
> Приватные методы стоит описывать, если есть вероятность передачи этого кода другим людям
И если есть шанс, что к этому коду вернешься через полгода.
>> No.40440 Reply
Аноны, подкиньте пожалуйста годных книг/серий туториалов по DirectX/OpenGL с C++. Желательно, чтобы они были сравнительно новые, чтоб все работало с последним VS без проблем.
>> No.40505 Reply
>>40375
Да у вас же ДЕТИ УГАНДЫ
>> No.40506 Reply
>>40374
EAP License. Хоть и есть idea купленная, но почти всегда на EAP сижу.
>> No.40688 Reply
File: H7Ri8MGbtOk.jpg
Jpg, 26.71 KB, 604×569 - Click the image to expand
edit Find source with google Find source with iqdb
H7Ri8MGbtOk.jpg
Поясните за регулярные выражения в С++.
Не могу нагуглить внятного разъеснения.
В учебнике всё идёт в ключе С#, но смысла браться за него не вижу.
С синтаксисом выражений ,вроде бы, проблем не видно.
Непонятно, как работать с библиотекой.
Попробовал, элементарно, запустить кусок кода из интернета:
http://msdn.microsoft.com/ru-ru/library/t8t0w9hz.aspx
Но он не идёт.
Работаю в VS 2012.
>> No.40690 Reply
>>40688
В C++11 есть std::regex. По идее, в VS 2012 должен поддерживаться.
Если доступен только олдовый C++, то boost::regex или pcre (сторонние либы).

C++/CLI (и предшествующий ему Managed [Extensions for] C++) - штука своеобразная, обычно используется для написания прослоек native/managed и чуть более быстрого портирования старого добра под .NET. Отличается от C++ принципиально - там не отдельные отклонения от стандарта, а практически другой язык. Если нацелен именно на .NET, то все-таки посмотри в сторону C#.
>> No.40691 Reply
>>40688
> В учебнике всё идёт в ключе С#, но смысла браться за него не вижу.
И зря не видишь. Судя по тенденциям и скорости развития C++, этот язык всего через полвека будет практически полной копией C# 4.0. Да, я опять толсто сравниваю C++ и другие языки и намекаю на безнадёжное отставание C++.
>> No.40693 Reply
>>40691
Не волнуйся ты просто не понимаешь плюсов крестов с опытом придет.
>> No.40694 Reply
>>40691
Единственные альтернативы С++ - это С и раст, который далёк от какой-либо реальной возможности юзать его. Все остальные собирают мусор, смысл сравнивать.
>> No.40701 Reply
>>40690
А для чего вообще нужен .NET?
Из Википедии не понял
>> No.40703 Reply
Вроде бы, разобрался с regex, но теперь обнаружил, что синтаксис как-то не согласуется с тем, что я нашел.
Этот код выдаёт 3 пустые строки:

using namespace std;
#include "stdafx.h"
#include <regex>
#include <iostream>

typedef std::tr1::match_results<const char*> cmatch;

int main()
{
std::tr1::cmatch res;
   std::string str = "14 5";
   std::tr1::regex rx("[0-9]");
   regex_search(str.begin(), str.end(), rx);
  
   std::cout << res[1] << "\n";
   std::cout << res[2] << "\n";
   std::cout << res[3] << "\n";
   system ("pause");
}

Подскажите список элементов регулярных выражений для С++.
>> No.40704 Reply
>>40693
"У C++ по сравнению с C несколько плюсов. Точнее, два".
>> No.40706 Reply
>>40704
А чем С лучше С++?
Ничего не утверждаю, просто, интересуюсь.
>> No.40707 Reply
>>40706
Меньше оверхед и бинари компактнее, теоретически.
>> No.40711 Reply
>>40706
Я не говоил, что они лучше, я сказал, что это единственные, кто в той же нише, что и он. Всё, больше серьёзных и популярных ныне или грозящих ими стать в будущем языков с неуправляемым кодом без сборки мусора нету.
>> No.40714 Reply
>>40711
Обжект поцкаль?
>> No.40717 Reply
>>40714
Или кобол.
> серьёзных и популярных ныне или грозящих ими стать в будущем
>> No.40718 Reply
>>40707
Объекты в стеке, а не в хипе, практически.

мимотрололо
>> No.40719 Reply
>>40718
1. Что мешает создавать C++ объекты без слова new?
2. Где, по-твоему, выделяет память вполне себе сишная функция malloc?
>> No.40721 Reply
>>40719
Ну и не стоит забывать, что C++ до недавнего времени был всего лишь нагромождением костылей над сишечкой и сохранял с ней обратную совместимость.
>> No.40730 Reply
>>40721
И всё-таки доске нужен отдельный языкосрачей тред специально для таких вот поездов.
>> No.40731 Reply
File: 137736427603977.jpg
Jpg, 22.10 KB, 518×474 - Click the image to expand
edit Find source with google Find source with iqdb
137736427603977.jpg
>>40711
> или грозящих ими стать
R? D? У них есть сборка мусора, но её можно переписать по своему вкусу или отключить. Да и синтаксис местами более вменяемый. Вин.
Вообще мне кажется, что лучшим решением на будущее станут композитные ЯП, состоящие из нескольких разных кусочков.
   Хочешь неуправляемый код? Держи такой синтаксис.
   Хочешь расчёты на стадии компейляции? Вот тебе такой синтаксис.
   Хочешь скрипты без компейляции? Получи@расспишись.
   И т.д.
И всё это довольно плотно интегрировано должно быть и содержать все необходимые утилитки и либы на все случаи жизни и смерти изкаропки.

>>40730
Прям джля вас делал >>40630
>> No.40734 Reply
>>40731
> Хочешь неуправляемый код? Держи такой синтаксис.
> Хочешь расчёты на стадии компейляции? Вот тебе такой синтаксис.
> Хочешь скрипты без компейляции? Получи@расспишись.
И ничего нормально при этом не работает, ага
>> No.40736 Reply
>>40731
Про R не слышал, но в D, насколько я слышал, с отключённой сборкой ничего в либах толком не работает. Возможность отключить чисто номинальная.
>> No.40749 Reply
>>40731
> R?
R это вообще такой язык для статистических вычислений, причём тут С++? Или ты имеешь в виду раст?
>> No.40823 Reply
>>40749
> Или ты имеешь в виду раст?
Да.
>> No.40826 Reply
File: regexp.png
Png, 81.21 KB, 851×1185 - Click the image to expand
edit Find source with google Find source with iqdb
regexp.png
Всё же решил разобраться с std::regex.
Разбираюсь по пикрелейтед, но пока не очень успешно.
Например, как описать выражение вида (...)+(...).
А затем (...), но не (...)+(...).
>> No.40827 Reply
>>40826
> выражение вида (...)+(...). А затем (...), но не (...)+(...)
Што
>> No.40828 Reply
>>40827
Показалось, что понятно описал.
Имею в виду, что на месте многоточия находится произвольное выражение.
Если конкретнее, то там могут быть:
- знаки + и *;
- константы, в том числе в экспоненциальном виде (например, 1e+18);
- название переменной из букв и цифр;
- могут быть и другие выражения в скобках.
>> No.40829 Reply
>>40827
Это про первый случай.
А второй не нужен, пожалуй.
>> No.40831 Reply
>>40828
Можешь привести пример, что от куда ты хочешь выбрать и чего выбраться не должно?
>> No.40833 Reply
>>40826
У тебя поехало понимание. Термин константа тут не применим. По крайней мере так. В строке, которую ты проверяешь нет констант или операторов. У тебя мета-символы(посмотрел это название по твоей памятки, не знаю, как они называются) типа плюса и звёздочки в реулярном выражении, а не в строке. То есть у тебя есть строка и регулярное выражение. Регулярное выражение позволяет определить, соответствует ли ему строка, а так же найти все (непересекающие) подстроки, соответствующие регулярному выражению и т.п.

Если хочешь под мета-символом типа плюса подразумевать сам этот символ, а не его специальное назначение, то его надо экранировать, то есть предварять "\"(обратный слеш). Например, регексу \++ соответствует "+", "++", "+++" и т.д.
>> No.40836 Reply
>>40831
Мне нужно описанное в >>40828 разложить на дерево с помощью одного регулярного выражения.
> В учебнике написано так: Ищем в строке знаки операций, не заключенные в скобки, в порядке приоритета. Наименьший приоритет у присваивания («=»), средний у сложения («+»), наивысший — у умножения («*»).
Собственно, это оно и должно делать.
Вообще, попробую сам составить.

Остаётся только вопрос. После сравнения нужно получить номер символа, которым является найденный знак (если он есть).
>> No.40837 Reply
>>40836
Собственно, как его можно получить мосле сравнения?
>> No.40838 Reply
>>40837
> после
>> No.40853 Reply
>>40836
>>40837
Лол, я наконец понял, что ты имел в виду. Вообще, это неправильный подход.
Надо забирать один элемент за раз и потом решать, что с ним делать, а не искать многоэлементные конструкции.
>> No.40854 Reply
>>40853
Теперь я тебя не понял.
>> No.40855 Reply
>>40853
Имеешь в виду польскую нотацию (или как она называется).
>> No.40856 Reply
>>40853
Если что, в задании сказано "построить дерево с помощью регулярного выражения".
>> No.40944 Reply
File: -.jpg
Jpg, 14.25 KB, 315×223 - Click the image to expand
edit Find source with google Find source with iqdb
-.jpg
Анон, есть одно число double, которое мне нужно вывести с точностью до 10^-9.
Делаю вот так:
double a;
    a=999999999.828427129988;
    cout.precision(10);
    cout << fixed << a << endl;
   А выводит мне 999999999.8284270763
ЧЯДНТ и как мне заставить выводить число с необходимой точностью без округления?
>> No.40945 Reply
>>40944
Никак. У дабла 52 бита. Разбивай число на части.
>> No.40947 Reply
File: wallpaper-370710.jpg
Jpg, 338.35 KB, 1920×1200
edit Find source with google Find source with iqdb
wallpaper-370710.jpg
File: -.png
Png, 87.03 KB, 749×286
edit Find source with google Find source with iqdb
-.png

>>40945
А long double? Какая у него максимальная длина значимой части? Целая часть должна быть меньше 10^6. Собственно, проблема в удовлетворении условию на пикрилейтед.
>> No.40948 Reply
>>40944
Что за задача? Где, чёрт возьми, задача, которая решается? Если бы надо было бы только вывести число, которое де, дано, то можно было бы и строкой обойтись, не связываясь с числами. Числа с плавающей точкой, коими являются даблы, всё время по всякому округляются и могут округляться довольно непредсказуемым образом.
>> No.40950 Reply
File: -.pdf
Pdf, 0.11 KB, 595×842 - Click the image to get file
-.pdf
>>40948
Вот задача целиком, если нужно.
>> No.40951 Reply
>>40947
> Какая у него максимальная длина значимой части?
Этот вопрос является безграмотным. Точные границы точности типов определяются реализацией. Это значит, что они будут разные на разных устройствах и компиляторах.(не уверен про компиляторы, но от устройство точно зависит). long double не меньше чем double. Это всё.
>> No.40952 Reply
>>40951
> Точные границы точности типов определяются реализацией. Это значит, что они будут разные на разных устройствах и компиляторах.(не уверен про компиляторы, но от устройство точно зависит).
Спасибо, анон.
>> No.40954 Reply
>>40947
log2((9+6)^15) ~= 50
Должно хватить.
>> No.40955 Reply
File: -.jpg
Jpg, 81.76 KB, 1280×909 - Click the image to expand
edit Find source with google Find source with iqdb
-.jpg
>>40953
> Если я правильно понял, все расстояния считаются суммированием чисел вида x+y*sqrt(2).
Да, именно так.
> Если так, то идеально было бы хранить эти числа как пары тупо целых, количество единиц и количество корней из двух.
>>40951-пост привёл в итоге к той же мысли.
Спасибо, анон. Пойду кодить тогда.
>> No.40956 Reply
>>40955
Я удалил пост, так как неправильно посчитал цифры, забыв целую часть. 52 бит таки не хватит на столько цифр и надо ещё разделять как-то целую и дробную часть или как-то так. В конце концов я не уверен, что потеря точности там большая.
>> No.40957 Reply
File: IEEE754_2008.pdf.pdf
Pdf, 0.90 KB, 612×792 - Click the image to get file
IEEE754_2008.pdf.pdf
>>40948
> и могут округляться довольно непредсказуемым образом
Неправда. На то есть стандарт IEEE 754 и смежные.

мимо js-кун
>> No.40977 Reply
>>40957
Ну непредсказуемым не значит же, что рандомным. Если сложить много чисел в разном порядке, то у ответ разный может быть.
>> No.40987 Reply
>>40977
15-16 чисел (если дабл) будут предсказуемыми, это и есть стандарт.
>> No.40988 Reply
>>40987
Хотя у некоторых иногда и бывают свои заморочки на каких нибудь 0.4999999999...
http://ideone.com/XWI7xn
>> No.40990 Reply
File: 59175ee2cf40.jpg
Jpg, 149.53 KB, 1200×900 - Click the image to expand
edit Find source with google Find source with iqdb
59175ee2cf40.jpg
>>40977
> Если сложить много чисел в разном порядке, то у ответ разный может быть.
И результат чотко оговаривается стандартом. Такой чоткости любой гопник позавидует. А ещё там даются рекомендации по тому, как должны себя вести стандартные математические функции.
>>40987
>>40988
Фишка в том, что предсказуемы ВСЕ цыферки. Иначе зачем стандарт?
>> No.41003 Reply
>>40990
Вы уходите от задач.
>> No.41067 Reply
File: bremz.jpg
Jpg, 36.58 KB, 450×337 - Click the image to expand
edit Find source with google Find source with iqdb
bremz.jpg
>>40988
А мы храним дробные числа в виде "X/Y" и у нас всё хорошо.
>> No.41068 Reply
>>41067
И корни тоже извлекаем в таком виде, умник?
>> No.41213 Reply
>>41068
А корень приближаем с заданной точностью ¯\(ツ)
>> No.41214 Reply
>>40944
Ох уж эти школьники, в условии указана относительная точность в 1e-9. И только если правильный ответ меньше 1, то нужно выводить с абсолютной точностью. Короче, нужно правильно вывести первые 9 значащих цифр, ты можешь написать своё решение и сдать его с cout.precision(20) и всё.
кажется, я немного слоу
>> No.41325 Reply
File: MEzWatqsxNE.jpg
Jpg, 44.85 KB, 465×604 - Click the image to expand
edit Find source with google Find source with iqdb
MEzWatqsxNE.jpg
Поясните, если мне дали регулярное выражения, якобы для .net под C#, можно ли его точно таким же образом использовать с C++, если я работаю в Visual Studio 2012?

Дали такой вот кусок кода:
Regex r = new Regex(@"\([^()]+\)|(([a-z]|\*)+)");
string s = "(a+b)+c";
bool f = false;
Console.WriteLine(s);
MatchEvaluator me = delegate(Match m) {
   f = true;
   return new String(' ', m.Length);
};
do { f = false; s = r.Replace(s, me); } while (f);
Console.WriteLine(s);
>> No.41326 Reply
>>41325
И можно ли как-то конвертировать выражение?
>> No.41328 Reply
>> No.41333 Reply
>>41328
Что?
Мне надо это выражение загнать в regex для С++.
>> No.41339 Reply
>>41325
Понятия не имею, насколько M$VC 2012 поддерживает с++11 (в том же gcc, емнип, регулярки более-менее заработали только с 4.9+), и не уверен, правильно ли я понял задачу, но как-то так:

http://pastebin.com/XsN64ggq
>> No.41342 Reply
>>41339
И бустятинка, раз уж обещал: http://pastebin.com/VBKGP8Hc
C++98 версия бустятинки: http://pastebin.com/UeFkmtXA
>> No.41347 Reply
>>41339
Большое спасибо. Выручил.
Добра тебе.
>> No.41349 Reply
File: Безымянный.png
Png, 12.70 KB, 420×240 - Click the image to expand
edit Find source with google Find source with iqdb
Безымянный.png
>>41339
Ох вейт.
Попробовал запустить, а тут такая вот картина.
Неужели, синтаксис регулярок таки не совпал?
>> No.41350 Reply
>>41349
На R"" оно ругается на самом деле.
>> No.41351 Reply
>>41350
В смысле?
>> No.41354 Reply
>>41351
> 4 IntelliSense: идентификатор "R" неопределен
>> No.41355 Reply
>>41349
Ну значит raw литералов из c++11 там нету. Придётся экранировать слеши:

"\\([^()]+\\)|(([a-z]|\\*)+)"
>> No.41401 Reply
>>41355
А теперь заработало.
Спасибо тебе большое.
>> No.41402 Reply
>>41355
Я вдруг осознал, что мне нужно убрать только содержимое скобок (вместе с самими скобками).
Т.е., по твоему тесту: http://pastebin.com/pRjKbKS4
Никак не пойму, как в этом выражении обозначены скобки.
>> No.41403 Reply
>>41355
Может быть, подскажешь, где можно почитать хорошо разобранные материалы по регулярным выражениям для С++ regex?
>> No.41404 Reply
>>41355
http://dobrochan.com/src/png/1407/regexp.png
Эта картинка подходит?
>> No.41405 Reply
>>41402
Ю> Никак не пойму, как в этом выражении обозначены скобки.
\\( и \\)
>> No.41416 Reply
>>41405
То есть, скобки и всё, что между ними.
>> No.41462 Reply
http://www.codeproject.com/Articles/24684/How-to-create-Linked-list-using-C-C
node *temp;                                      // create a temporary node
temp = (node*)malloc(sizeof(node));  // allocate space for node
temp = head;                   // transfer the address of 'head' to 'temp'
head = temp->next;      // transfer the address of 'temp->next' to 'head'
free(temp);
> Transfer the address of head to temp
во второй строчке ошибка?
>> No.41464 Reply
>>41462
> во второй строчке ошибка?
Ошибка в том, что статью писал долбоёб, не умеющий в указатели. Не читай её, поищи какую-нибудь другую.

malloc там нахрен не сдался, только утечку памяти создаёт:

// удаление первой ноды из списка
node *temp = head;
head = temp->next;
free(temp);

Все пункты ниже зафейлены аналогичным образом и текут как сучки весной.
>> No.41540 Reply
File: WWL294dMMl0.jpg
Jpg, 40.57 KB, 604×604 - Click the image to expand
edit Find source with google Find source with iqdb
WWL294dMMl0.jpg
Посоветуйте толковую полноценную IDE для С++, с которой не возникло бы проблем у новичка (или это компенсировалось бы хорошей документацией).
Беда в том, что в Visual Studio 2012 криво реализован regex, который мне крайне необходим.
>> No.41541 Reply
>>41540
> IDE для Windows
Забыл добавить.
>> No.41542 Reply
>>41540
Требования к иде в студию лол. Последнее время я писал в Code::blocks. Крупных конкурентов у студии нет, CLion в разработке, QtCreator ничерта не настраивается и вообще придаток к qt.
>> No.41547 Reply
Такой вопрос.

Можно ли как-то прикрутить vkapi в с++?
Если да, то как?
>> No.41557 Reply
>>41547
А что такое vkapi?
>> No.41558 Reply
>> No.41559 Reply
>>41558
Зачем запускать жаваскриптовый движок? Дерни урл через буст азио. Ну или ищи билиотеку для с++ которая будет дергать урлы за тебя как в js.
>> No.41618 Reply
>>41540
Лучше visual studio только текстовый редактор, настроенный под себя.
>> No.41631 Reply
>>41559
То есть, дергать урлы через либы или руцями - вариант для мазохистов велосипедников. И парсить что эти урлы выдают?
>> No.41637 Reply
>>39226
Посоветуйте динозавру что-нить из книг по чистому си (с2011) -- интересуют отличия в синтаксисе от версии с89. Заранее спс.
>> No.41666 Reply
char s[N], *t;
FILE *fp;
fp = fopen("file.txt", "r");
t = fgets(s, N, fp);
if (t == NULL)
    printf("[%d: %s]\n", strlen(s), s);
-------
$ wc file.txt
0 0 0 file.txt
$ cc main.c
$ ./a.out 
[1: v]
$
чяднт?
>> No.41669 Reply
>>41666
> чяднт?
Не читаешь документацию, очевидно же.
http://www.cplusplus.com/reference/cstdio/fgets/
> Return Value
> If the end-of-file is encountered while attempting to read a character, the eof indicator is set (feof). If this happens before any characters could be read, the pointer returned is a null pointer (and the contents of str remain unchanged).
Проверяй не только результат fgets, но и результат feof: http://www.cplusplus.com/reference/cstdio/feof/
>> No.41670 Reply
>>41666
Алсо, по-моему, у тебя проблемы с использованием массива s - во многих, если не во всех, случаях, его нужно передавать в функции по указателю, а не по значению. Впрочем, я бог управляемых языков и поэтому могу не разбираться во всяких байтоёбских штуках.
>> No.41673 Reply
>>41670
странное поведение.
>>41670
имя массива - указатель
>> No.41676 Reply
>>41666
> чяднт?
Используешь s после фейла fgets(). Как выше правильно пишет >>41669-кун: the pointer returned is a null pointer (and the contents of str remain unchanged). Т.е. fgets() ничего не записал в s, вернул null, и программа пошла работать с мусором, который там остался.

>>41669
> но и результат feof
Нафиг-нафиг. Насоветуете анону всякой дряни, а потом у него будет последняя строка теряться, если в конце '\n' не оказалось... Сишный feof() практически бесполезен.

Я тупо вот так поступал:
while (fgets(s, N, fp)) {
    // делаем что-нибудь с прочитанной строкой
    // не забываем, что в конце всех строк (кроме, возможно, последней) будет '\n'
}
// для лаб эта проверка нафиг не нужна, но приведу для полноты
if (ferror(fp)) {
    // цикл остановился из-за ошибки (диск сломался, сеть отпала и т.п.)
}
>>41673
> имя массива - указатель
Скажем так - имя массива можно использовать как указатель.
>> No.41677 Reply
File: 1.png
Png, 62.09 KB, 516×399 - Click the image to expand
edit Find source with google Find source with iqdb
1.png
>> No.41678 Reply
>> No.41679 Reply
>>41678
если бы fgets так же работала, проблемы бы не возникло у меня
>> No.41680 Reply
>>41679
> если бы fgets так же работала, проблемы бы не возникло у меня
Если бы у бабушки был хуй, она была бы дедушкой... Я вот вообще всю жизнь думал, что содержимое массива не определено, если fgets() вернул NULL, благодаря этому никаких мифических проблем с fgets() у меня не возникало (возникали другие, но они к теме не относятся).

Кстати, приведенный тобой код, видимо, взятый из книжки 80-х годов, прямо противоречит стандарту C89, который гласит: If end-of-file is encountered and no characters have been read into the array, the contents of the array remain unchanged and a null pointer is returned. If a read error occurs during the operation, the array contents are indeterminate and a null pointer is returned.

Добро пожаловать в мир undefined behavior'ов и implementation defined'ов, няша.
>> No.41688 Reply
>>41680
По чистому Си никто ничего не знает, что ли? >>41637
>> No.41689 Reply
>>41688
Википедия, лол. enwiki://C99 enwiki://C11 Там в самом низу всегда есть всякие Further reading и External links. Ну ты понел.

А по поводу всяких там fgets можно читнуть сами стандарты или исходники некоторых stdlib. Например:
https://sourceware.org/git/?p=glibc.git;a=blob;f=libio/iofgets.c;h=f00[...]=HEAD
http://hg.pdclib.e43.eu/pdclib/src/a82b02d0c7d4ed633b97f2a7639d9a10b1c[...]fault
https://sourceware.org/viewvc/src/newlib/libc/stdio/fgets.c?view=markup
Разумеется придётся повытягивать оттуда всякого. Зато видно, как риальные пацаны пишут стандартные библиотеки. Код легко читается и понимается же.

js-кун
>> No.41752 Reply
File: говно.png
Png, 18.10 KB, 647×304 - Click the image to expand
edit Find source with google Find source with iqdb
говно.png
Ребята, кто-нибудь может объяснить маминому недопрограммисту, почему мой код http://pastebin.com/MGb4E24Y так странно себя ведет?
VS2008.
>> No.41753 Reply
>>41752
У тебя '\r' записывается в Edges и только потом происходит выход из цикла.
>> No.41754 Reply
>>41752
Можно покритиковать немного заодно?
> if ((ch != ' ') && (ch != ','))
Как правильно пишет анон выше, из-за этой фигни '\r' пролезает в Edges. И много другого мусора может пролезть. Сделай нормальную проверку, например такую: if (ch >= 'a' && ch < 'a' + vertices).
> #include "iostream"
Подключать "чужие" хедеры (не из текущего проекта) через "кавычки" - моветон. Поменяй на <iostream>.
> void main()
Не делай так. Правильная сигнатура - int main(). И return 0, да, хоть компилятор его и не требует.
> using namespace std;
Для лабы само собой сойдёт, но в реальных проектах не стоит так делать. Потом чёрт ногу сломит из какого неймспейса что взято.
> void GetGraph(vector<vector<char>> &Graph, int &vertices)
Вот тут vertices нинужно (ты даже сам ей не пользуешься). Утащи ее в локальные переменные GetGraph'а, там ей самое место.
> char(97 + i)
Да не парься ты с этими кодами, напиши 'a' вместо 97, будет проще и понятней.
> vector<vector<char>> Graph;
> for (vector<vector<char>>::iterator i = Graph.begin(); i != Graph.end(); i++)
Раз уж юзаешь c++11 (а без него ты бы написал vector<vector<char> >) можно попробовать и новый цикл из c++11, в котором не надо вручную работать с итераторами.
>> No.41756 Reply
>>41754
И, раз уж подключаешь stdafx.h, то, в теории, надо все системные #include перетащить в него. Иначе затея с precompiled headers не сработает, и #include "stdafx.h" можно с чистой совестью выкинуть.

P.S. Надеюсь вижуалко-куны меня поправят, если я в чем-то ошибся.
>> No.41762 Reply
>>41754
> Сделай нормальную проверку, например такую: if (ch >= 'a' && ch < 'a' + vertices).
Безопасно ли считать, что все буквы в кодировке идут подряд? И ещё эти финты с char(97 + i). Это сильно понижает отказоустйчивость и гибкость, если вдруг кодировка другая. Лучше cделать map<int, char> или функцию отображения между числами и буквами. Проигрыша в произодительности много не будет.
> \r
Для справки, в шиндошс перевод строки обозначается двумя подряд идущими символами: \r\n. На линухе, маках и прочих юних-подобных - просто \n, \r не юзается. Так что прямое ожидание в коде \r тоже не очень хорошо.
Ну и да, перед выходом из цикла \r успевает записаться.
>> No.41763 Reply
>>41762
> Безопасно ли считать, что все буквы в кодировке идут подряд?
Все - нет. ascii'шные - вполне. Во всех популярных кодировках они подряд и даже на одном месте. Так что мап тут только гемора добавит, имхо.

А вот мысль про функцию мне нравится. Инкапсуляция еще никому не повредила.
> \r
Да я хотел про это написать в том посте... Но поскольку ОП юзает вижуалку с ее stdafx.h, непереносимый getch(), и "RUSSIAN" в локали - не стал его пугать кроссплатформопроблемами. Я бы, на месте ОП'а, вообще читал строки std::getline'ом и разбирал их в цикле. Куча проблем сразу уйдёт.

>>41754-кун
>> No.41764 Reply
>>41754
> Правильная сигнатура - int main()
Тогда уж int main(int argc, char­­­ argv). Вкусовщина.
> И return 0
Зачем делать то, что можно не делать?
> в реальных проектах не стоит так делать
Один написал, все повторяют. Нет ничего плохого, а если что, всегда можно явно указать, откуда брать. Тот же парень имел в виду, что нельзя писать using в хедерах, но кому теперь что докажешь.
> можно попробовать и новый цикл из c++11
Его студия в него не умеет, если я ничего не путаю.
>>41763
Кроме "ё".
>> No.41765 Reply
>>41764
> Кроме "ё".
Откуда в ascii ё? Если кириллицу считать подряд идущей, то проблем точно будет много.
>> No.41766 Reply
>>41764
> вкусовщина
Версия без аргументов тоже в стандарте есть. А вот с воидом - нету. ЕМНИП, гцц воид не компилит вообще.
> нет ничего плохого
Есть, даже не в хедерах. Потом без подсказки ИДЕ хрен поймешь, откуда взялась эта функция/класс. Ну и сборка может внезапно поломаться (вспомни boost::sharedptr и std::sharedptr). В using ничего плохого нет, плох только using namespace.
> его студия в него не умеет
Ну тут х.з. Я последний раз студию серьезно юзал лет 5 назад.
>> No.41771 Reply
>>41753>>41754
Благодарю, помогло.
Различие между "" и <> знаю, естественно. Просто идиотская привычка. Обычно изменяю, в этот раз забыл.
> Утащи ее в локальные переменные GetGraph'а
Просто во многих алгоритмах на графах требуется знать количество вершин Данная программа состояла не только из ввода и вывода графа, но и из нескольких других алгоритмов. Мне показалось легче завести для нее отдельную переменную, чем каждый раз писать Graph.size(). Можно исправить, в принципе.

Про новый цикл совершенно ничего не знаю. Да и полезно это, понять итераторы. Пока они для меня как обычные счетчики, а это плохо.
>> No.41773 Reply
>>41771
> Мне показалось легче завести для нее отдельную переменную, чем каждый раз писать Graph.size().
Ну, если в каком-то алгоритме она требуется часто, ты в нём заведёшь локальную переменную и закешируешь в нее Graph.size(). Вот и всё. Некрасиво сваливать эту обязанность на пользователя алгоритмов и заставлять его хранить и передавать эту переменную. Нарушение инкапсуляции как бы. Ну и да, вместо vector<vector<char>> &Graph стоило бы сделать класс для графов, ну или хотя бы typedef, чтобы кишки реализации не лезли в код, который пользуется графами. Вдруг тебе захочется представить граф по-другому, или даже сделать несколько разных представлений? Не переписывать же из-за этого весь код, который юзал эти функции.

Сравни:
vector<vector<char>> graph;
int vertices;
GetGraph(graph, vertices);
vector<char> path = FindMinimalPath('a', 'd', graph, vertices);
// vs
Graph graph;
GetGraph(graph);
Path path = FindMinimalPath(graph, 'a', 'd');
> Про новый цикл совершенно ничего не знаю.
Вот тут можешь посмотреть как он выглядит: http://en.cppreference.com/w/cpp/language/range-for Это всего лишь сахарок, и работает оно на тех же самых begin(), end() и итераторах. Просто немного удобней.
> void ShowGraph(vector<vector<char>> Graph)
Вот про это еще забыл написать - при каждом вызове этой функции граф будет копироваться целиком. Лучше написать вот так, если используешь граф только для чтения:
void ShowGraph(const vector<vector<char>> & Graph)
>> No.41774 Reply
>>41771
> Пока они для меня как обычные счетчики, а это плохо.
А оно так и есть. Это просто чуть более абстрактная фигня, чем указатели. Если указатель всегда указывал на какую-то область памяти, ++ его двигал на sizeof(T) байт вперёд и т.п., то у итератора этих ограничений нет, элементы, на которые он указывает, могут не то что не по порядку лежать, они могут вообще не существовать и генериться на лету. Набор операций, в принципе, тот же самый, что и указателей (но обычно урезан, см. ниже).

Итераторы имеют разные возможности: некоторые умеют только разадресацию и движение вперед (forward iterator), некоторые крутятся в обе стороны (bidirectional iterator), а некоторые - могут быстро прыгнуть на произвольный элемент (random access iterator). Разным алгоритмам нужны разные итераторы: к примеру, для последовательного поиска хватит и forward'а, а вот для сортировки желателен random access. В доках по алгоритмам можно узнать требования, а в доках по контейнерам ты увидишь, какие именно итераторы они предоставляют.

Вот в общем-то и всё.
>> No.41775 Reply
>>41774
P.S. Ну и да, есть особые итераторы, не привязанные к контейнерам - istreamiterator, insertiterator и т.п.
>> No.41777 Reply
>>41764
> Вкусовщина.
Вкусовщина говоришь?
1.cpp:5:11: error: ‘::main’ must return ‘int’
>> No.41778 Reply
File: Capture.PNG
Png, 55.85 KB, 882×540 - Click the image to expand
edit Find source with google Find source with iqdb
Capture.PNG
>> No.41779 Reply
>>41778
Это кому из нас цитата? Если мне (>>41777), то я с тобой согласен - гарантированно работают только int main() и int main(int argc, char *argv[]), а все остальные, включая void main(), зависят от компилятора и лучше их не юзать. И никакой вкусовщины тут нет.
>> No.41780 Reply
>>41773
А у меня и сделано классом. GetGraph (на самом деле он назывался просто Graph) был неработающим конструктором. Но мне привычнее процедурный стиль, поэтому я вырезал данный метод класса и переписал как подпрограмму — надеялся, это поможет найти ошибки. Не помогло, пришлось спрашивать.
Вот за это
> void ShowGraph(const vector<vector<char>> & Graph)
замечание спасибо. Знал же, что без "&" подпрограмма копирует граф в новую переменную. А о том, что это может занять кучу места и времени, не подумал.
>> No.41781 Reply
>>41779
> кому
Всем. Никто не читает Стандарт, несмотря на то, что Стандарт - единственное, во что вообще можно верить в этой жизни.
>> No.41782 Reply
>>41778
main(c, v)
char **v;
{/*...*/}
>> No.41783 Reply
>>41782
Сишник, ты чего тут забыл?
>> No.42285 Reply
http://www.reddit.com/r/C_Programming/comments/2vq315/freeing_a_2d_array/cok0q7g
void* p = malloc(4 * sizeof(int) * 5 * sizeof(int)); // Allocate int[4][5] array
int (*m)[5] = p;
тут есть ошибка?
>> No.42288 Reply
>>42285
Разви sizeof(int) не должно быть один раз?
>> No.42289 Reply
>>41781
Но ведь стандарт
1) Могут не реализовать
2) Реализовать больше чем стандарт
3) Баги вообще чихали на него
Потому никто и не читает, ибо это ж Филькина грамота.
>> No.42290 Reply
>>42289
Разве те, кто поступает подобным бесстыдным образом, не являются хуями?

мимокрокодил
>> No.42291 Reply
>>42290
Ну да, но мир не идеален. В С++ хоть со стандартами получе чем с SQL и вебом.
>> No.42335 Reply
лол
>> No.42340 Reply
>>42291
А что не так со стандартами SQL и веба?
>> No.42351 Reply
>>42340
В вебе действуют "де-факто" стандарты. То есть можно напидорасить нестандартного странного синтаксиса html, чтобы поддерживать какие-нибудь нужные штуки в одном браузере (последний известный мне пример - адаптивность через meta content="width=device-width", первый - подключение css через link, href), этот синтаксис начинают поддерживать другие браузеры, потом его стандартизируют. Приходится помнить, как реализовывать какие-то конкретные вещи. Стандартизация всегда отстаёт и приходится возиться с де-факто велосипедами и трендами.
>> No.42354 Reply
>>42351
> странного синтаксиса html
То, что ты перечисляешь это не синтаксис html.
> первый - подключение css через link, href
Не знаю, как там в твоём, но в моём стандате есть: https://html.spec.whatwg.org/multipage/semantics.html#the-link-element
> Стандартизация всегда отстаёт и приходится возиться с де-факто велосипедами и трендами.
Так и должно быть. Придумываем костыль, запиливаем его, тестим, запиливаем в стандарт.
>> No.42355 Reply
File: 14203999371010.jpg
Jpg, 16.75 KB, 251×249 - Click the image to expand
edit Find source with google Find source with iqdb
14203999371010.jpg
>>42285
Сначала выделить под *p, потом в цикле для p[i].
Освобождать память, соответственно, в обратном порядке - сначала для каждой линии чисел p[i], потом для верхнего массива.
>> No.42356 Reply
>>42355
**p, *p[i] Всё время забыват про разметку.
>> No.42357 Reply
>>42354
> То, что ты перечисляешь это не синтаксис html.
Тэг meta - часть синтаксиса html. Тэг link - часть синтаксиса html. Атрибуты content, href - часть синтаксиса html. Я где-то ошибаюсь?
> Не знаю, как там в твоём, но в моём стандате есть
Ну конечно есть. Сколько ему лет уже. А когда-то он был нестандартным.
>> No.42358 Reply
Рано пост отправил.
>>42354
> Так и должно быть. Придумываем костыль, запиливаем его, тестим, запиливаем в стандарт.
Окей, тот же link.
В стандарте есть тэг style. Совместно с src он мог бы быть использован для загрузки стилей. Но сейчас для этого используется link href="url", который делает неочевидно что. Приходится лезть и читать и каждый раз, возвращаясь к вёрстке после перерыва в пару месяцев, спотыкаться об это.
С meta[name=viewport] абсолютно та же самая история. Вместо meta width='device-width' сделана какая-то ерунда.
Стандартизация опирается на реализацию в браузерах, которая может выглядеть как угодно убого. И это раздражает.
>> No.42365 Reply
>>42340
Каждый вендор делает только то, что он сам захочет. Половина html5 не реализовано. Вообще не один стандарт html никто не реализовал полность. Ослики с мобилками делают, что могут, без стандартов, как сами хотят. SQL куча стандартов, реализованы только несколько старых и то не полностью. В мускуле, вон, даже фул джойна нет.
>> No.42382 Reply
>>39226
Я почитал этот блог с картинки, и как для незнакомого с плюсами человека, он выглядит как сборник страшилок. Почему вы еще не перешли на какой-нибудь гоу?
>> No.42383 Reply
>>42382
> гоу
Прекрати уже форсить это мертворожденное говно.
>> No.42384 Reply
>>42383
Я вообще мимоскриптовик, и на полном серьезе спрашиваю, почему вместо использования более современных и продуманных инструментов, люди кушают кактус. Гоу просто первый в голову приходит. Почему он мертворожденный?
>> No.42385 Reply
File: concurrency.svg
Svg, 0.05 KB, 2×1
concurrency.svg
File: funfast.svg
Svg, 0.04 KB, 2×1
funfast.svg

>>42383
https://github.com/golang/go/wiki/GoForCPPProgrammers
Это неон форсит, это я форсированием занимаюсь. Go хороший ЯП для некоторого круга задач. В основном для прикладных. Если требуется чуть больше удобства на хардкорных задачах, то есть будет rust.
Мотивирующие картинки из http://talks.golang.org/2014/gocon-tokyo.slide#16

Главное, что мне нравится в go: он маленький, простой и быстрый. Мне не нужно держать в голове тысячи разных мелочей.

Кресты хороши только тогда, когда ты их знаешь очень хорошо. Когда ты знаешь, что отстрелив себе ногу, тотчас отрастишь новые две. В ином случае ты просто остаёшься без ноги. Это очень неплохой ЯП, если всё, что тебе нужно - это скорость выполнения программы. Пусть даже в ущерб удобству и скорости написания.
>> No.42386 Reply
File: 06.jpg
Jpg, 25.44 KB, 510×352 - Click the image to expand
edit Find source with google Find source with iqdb
06.jpg
>>42385
> В основном для прикладных.
Ясно. Пойду пока на полу полежу.
Когда в Go появятся исключения, зови.
>> No.42388 Reply
>>42386
Чем panic/defer/recovery не исключения?
>> No.42389 Reply
>>42385
> Go хороший ЯП для некоторого круга задач. В основном для прикладных.
Прости, но NO GENERICS делает его непригодным задач с алгоритмами сложнее, чем сортировка массива.
>> No.42390 Reply
>>42389
Как ты собрался делать сортировку массива без дженериков/шаблонов/ватевер?
>> No.42391 Reply
>>42389
Ну давай пример такой задачи.
>>42390
https://golang.org/pkg/sort/
>> No.42392 Reply
>>42391
> The sort is not guaranteed to be stable.
Знаешь как это называется? Подсказка: FAIL
Не говоря уже о том, что оно не может сортировать по разным параметрам и требует интоподобности от структуры. С IntSlice и FloatSlice вообще проиграл. Современный язык, ага. Проблемы си почти 50-летней давности решить не могут. Пиздуйте-ка в свою резервацию со своим убожеством.
>> No.42393 Reply
File: 845.gif
Gif, 602.54 KB, 250×150
edit Find source with google Find source with iqdb
845.gif
File: Dobro_bleat.jpg
Jpg, 80.19 KB, 600×500
edit Find source with google Find source with iqdb
Dobro_bleat.jpg
File: Emma_Ai.gif
Gif, 693.24 KB, 500×281
edit Find source with google Find source with iqdb
Emma_Ai.gif

>>42392
> Знаешь как это называется?
Quick Sort это называется. Сложность O(n log n), худший случай O(n²), память в зависимости от реализации O(1), O(log n).
Есть везде. qsort из stdlib.h в няшном, std::sort из algorithm в крестах, Array.prototype.sort в js, и так далее. Самая распространённая сортировка. Про конкретно go-вариацию можно почитать вот тут http://cs.fit.edu/~pkc/classes/writing/papers/bentley93engineering.pdf
Впрочем стабильная сортировка там тоже есть прям рядом https://golang.org/pkg/sort/#Stable
> С IntSlice и FloatSlice вообще проиграл.
Начнём с того, что в go в отличии от крестов и няшной оче строгая типизиця.
var (
	x int32   = 5
	y int     = x          // выдаст ошибку: cannot use x (type int32) as type int in assignment
	z float64 = float64(x) // однако явное преобразование сработает
)
> Не говоря уже о том, что оно не может сортировать по разным параметрам и требует интоподобности от структуры.
Это как минимум неправда. Может. Интоподобности не требует но очевидно требует сравнимости. Кроме того строки вполне себе тоже имеют операторы сравнения.
IntSlice, FloatSlice, StringSlice это тип сортировки. Это то, как мы задаём возможность сравнить что-то.
Вот так это делается со структурами: https://play.golang.org/p/Eab2XPjgcC

Нечто, что можно сортировать должно удовлетворять интерфейсу:
type Interface interface {
        // Len is the number of elements in the collection.
        Len() int
        // Less reports whether the element with
        // index i should sort before the element with index j.
        Less(i, j int) bool
        // Swap swaps the elements with indexes i and j.
        Swap(i, j int)
}
Обрати внимание на то, как там делается сортировка в обратном порядке https://golang.org/src/sort/sort.go?s=4653:5053#L203
>> No.42394 Reply
>>42391
> Ну давай пример такой задачи.
Очень просто: двоичная куча. inb4: цирк с interface{}.
>> No.42395 Reply
>> No.42396 Reply
>>42395
> https://golang.org/pkg/container/heap/
Ох лол.

Давай рассмотрим очень простую структуру данных — связанный список. Ты конечно же скажешь про https://golang.org/pkg/container/list/
С первого взгляда кажется, что FAIL не произошёл, но затем начинаются проблемы:
- Первый SOSNOOLEY начинается, если в список положить элементы разных типов — компилятор это никак не ограничивает. Sojaleyu, u vas dynamicodristnya.
- Второй SOSNOOLEY происходит при попытке достать элемент из списка: ты получаешь interface{} вместо типа.
- Желание хранить данные и ссылки в одном блоке памяти (дабы избежать излишней косвенной адресации) влечёт за собой третий SOSNOOLEY
- Четвёртый SOSNOOLEY заключается в неизбежной динамической диспетчеризации, так как компилятор в общем случае не может знать тип, скрывающийся за интерфейсом

Нужно понимать, что параметрический полиморфизм — одна из наиболее важных вещей в языке со статической типизацией, и ad-hoc полиморфизм её никак не заменяет.

PS: ты, возможно, спросишь, как же тогда пишут всякие штуки на С. Правильный ответ: через жопу. А именно: жонглирование void'ами и смещениями, макромагия, добавление в структуру меток для типа и проверка их во время выполнения, тонны копипасты и многое другое. Но С прощает то, что это язык 70-х и «портируемый ассемблер».
>> No.42397 Reply
File: shot0352.png
Png, 2709.11 KB, 1280×720
edit Find source with google Find source with iqdb
shot0352.png
File: talking_captcha.png
Png, 1.49 KB, 300×20
edit Find source with google Find source with iqdb
talking_captcha.png

>>42396
> - Первый SOSNOOLEY начинается, если в список положить элементы разных типов — компилятор это никак не ограничивает.
Если оное требуется, то пишем обвязку в пару строчек. Кроме того разные типы туда пихать можно разве что специально.
> - Второй SOSNOOLEY происходит при попытке достать элемент из списка: ты получаешь interface{} вместо типа.
И я просто дописываю преобразование типов. Например есть ф-я fn, которая даёт некий интерфейс на выходе. И я вызываю её вот так: a := fn().(myAwesomeType) и соответственно получу ошибку времени исполнения, ежели там что-то нето лежит. Или делаю разную работу в зависимости от типа при помощи type switch. Или делаю обработку только если тип именно тот, который нужен, а остальное игнорирую.
> - Желание хранить данные и ссылки в одном блоке памяти (дабы избежать излишней косвенной адресации) влечёт за собой третий SOSNOOLEY
Монописуально. Оптимизациями низкого уровня должен заниматься компейлярот, а не человек. Тем более, что у компейлятора обычно лучше получается.
> - Четвёртый SOSNOOLEY заключается в неизбежной динамической диспетчеризации, так как компилятор в общем случае не может знать тип, скрывающийся за интерфейсом
Я конечно не копал исходники самостоятельно, но знаю, что там есть серьёзные оптимизации на этот счёт.
> Нужно понимать, что параметрический полиморфизм — одна из наиболее важных вещей в языке со статической типизацией, и ad-hoc полиморфизм её никак не заменяет.
А я не понимаю. Объясни. В go есть утиные интерфейсы. Чем они не подходют?
> ты, возможно, спросишь, как же тогда пишут всякие штуки на С.
Ты так говоришь, будто я няшный не знаю.
> Но С прощает то, что это язык 70-х и «портируемый ассемблер».
Последний актуальный стандарт вполне себе позволяет писать нормальный человекочитаемый код.
>> No.42398 Reply
>>42396
> Нужно понимать, что параметрический полиморфизм — одна из наиболее важных вещей в языке со статической типизацией, и ad-hoc полиморфизм её никак не заменяет.
Если я правильно тебя понел, то как раз таки ad-hoc в golang нет в пользу утиной типизации.
>> No.42399 Reply
>>42396
Ты не преувеличваешь? Это же натуральный пиздец хуже жавы. Зачем вообще совмещать dynamic dispatch и типизации. Есть какая-нибудь статья, где объясняются вот эти вот tradeoffы?
>> No.42400 Reply
File: shot0475.png
Png, 2709.11 KB, 1280×720 - Click the image to expand
edit Find source with google Find source with iqdb
shot0475.png
>>42399
Он преувеличивает.
> Зачем вообще совмещать dynamic dispatch и типизации.
Чтоб не было попаболи при программинге. Заимствуем все плюшки одновременно.
> Есть какая-нибудь статья, где объясняются вот эти вот tradeoffы?
http://golang.org/doc/faq
>> No.42401 Reply
>>42400
Потыкал документацию. Я правильно понял, что у вас нету акторов и какая-то хуита вместо них для асинхронщины\concurrency?
>> No.42402 Reply
>>42401
> что у вас нету акторов
Нет. У нас же не Erlang какой нибудь.
> какая-то хуита вместо них для асинхронщины\concurrency
Зелёные потоки и каналы. Можно любой функции сказать пойти нахуй отложить свои дела на завтра. При этом эти функции будут общаться посредством трубочек для сока каналов. Разумеется обычные методы синхронизации никто не отменял и их можно использовать вместо или вместе с каналами. В зависимости от ситуации.
>> No.42407 Reply
>>42397
> Если оное требуется, то пишем обвязку в пару строчек.
Костыли с рефлексией, выполняющиеся в рантайме, ты хотел сказать?
> a := fn().(myAwesomeType)
Ещё больше костылей.
> Оптимизациями низкого уровня должен заниматься компейлярот, а не человек.
Это простейшая вещь, которую умеет даже Haskell. А вот компиляторы, как правило, таким не занимаются.
> Я конечно не копал исходники самостоятельно, но знаю, что там есть серьёзные оптимизации на этот счёт.
Оптимизации могут многое, но они неспособны творить магию. Особенно учитывая, что компилятор го — не монстр уровня LLVM.
> В go есть утиные интерфейсы.
Это называется ad-hoc полиморфизмом. Он сводится к использованию одного имени для различных функций, плюс возможная динамическая диспетчеризация этого добра.
Параметрический полиморфизм же позволяет параметризовать функции и типы каким-либо типом. Различные типы данных, функции вроде append, и многое другое.
У этих видов полиморфизма, вообще говоря, разная область применения. Читай http://fprog.ru/2009/issue3/roman-dushkin-haskell-polymorphism/ и ruwiki://Полиморфизм_(информатика)

>>42399
> Ты не преувеличваешь?
Нет. Вообще, разработчики языка понимают наличие проблемы, но до сих пор не придумали, как её лучше решить.
> Зачем вообще совмещать dynamic dispatch и типизации.
Это обычная практика, таблицу виртуальных методов так или иначе многие языки таскают.
>> No.42409 Reply
>>42398
> Если я правильно тебя понел, то как раз таки ad-hoc в golang нет в пользу утиной типизации.
Это скорее «интерфейс считается реализованным автоматически, если тип имеет соответствующие методы». Но при этом проверка на то, что тип реализует интерфейс, происходит во время компиляции.
>> No.42411 Reply
>>42409
> Но при этом проверка на то, что тип реализует интерфейс, происходит во время компиляции.
Тащемто можно и в рантайме проверить. Правда это сильное колдунство в 99% случаев никому не нужно.
>> No.42413 Reply
>>42411
Можно, но это уже будет динамическая типизация.
>> No.42424 Reply
Аноны, подскажите хорошую книгу/гайд по быстрому изучению особенностей актуального C++ (какой там сейчас стандарт? C++14?)

Программировал на плюсах несколько лет назад, сейчас возникла необходимость пособеседоваться на позицию плюсовика, в компании используются по возможности новые фичи компилятора (т.е. C++0x нужен, C++14 - скорее нужен, чем нет)
>> No.42429 Reply
>>42424
Погугли вложенные функции ("nested functions") и лямбды. Алсо, что-то было у хабрамакак, типа статья там или вроде того.

Лямбды используются в задачах вроде поиска или сортировки:
int val = ini::read_integer (V_LEVEL_OF_CONFIDENCE);
int* min = search::min_element (array, [=](int x) { return abs (x - val); });
>> No.42430 Reply
>>42429

Но лямбды — это же только малая часть того, что добавили!
>> No.42432 Reply
>>42430
Ну ему же собеседование нужно пройти...
Всякие pure virtual functions вряд ли спрашивать будут.
>> No.42434 Reply
>>42432
> Всякие pure virtual functions вряд ли спрашивать будут.
Как раз такие простые мелочи в основном и спрашивают у начинающих плюсовиков. "Чем отличается интерфейс от абстрактного класса?", "Какие виды кастов бывают и чем они отличаются?", "Как отработает этот код с бумажки и что он при этом выведет?", "Напишите на бумажке какую-нибудь типовую вещь типа бинарного поиска" и т.п.
>> No.42435 Reply
>>42432
Что за "всякие pure virtual functions"? Что именно из этого "всякого" сорта было добавлено? Один хрен, попробуй нади компилятор, который бы полностью поддерживал все супер-мелочи из новомодного стандарта.
>> No.42438 Reply
>>42435
> Что за "всякие pure virtual functions"? Что именно из этого "всякого" сорта было добавлено? Один хрен, попробуй нади компилятор, который бы полностью поддерживал все супер-мелочи из новомодного стандарта.
Эм, а что актуальным gcc не поддерживается-то?

Всякого добавили: чуть менее чем полностью перекочевала работа с потоками из буста, изменилась модель памяти, добавились списки инициализации, move-semantic
(И это я ещё только начал разбираться во всём этом, лол).

>>42424-кун
>> No.42439 Reply
>>42438
> актуальным gcc
Не только ж gcc бывает. И я про синтаксис.
>> No.42440 Reply
>>42439
> Не только ж gcc бывает.
http://en.cppreference.com/w/cpp/compiler_support
Отсутствие поддержки от HP aCC (боже, что это) и Borland Embarcadero C++ Builder я переживу. Все переживут
>> No.42442 Reply
>>42434
>>42435
Ясно, и давят их по зарплате. 163, 165, 330 УК РФ в действии.
YouTube: Высоцкий.Уголовный кодекс..
>> No.42451 Reply
File: boromir22_b.jpg
Jpg, 31.62 KB, 568×335 - Click the image to expand
edit Find source with google Find source with iqdb
boromir22_b.jpg
>>42434
Я б за незнание, чем отличается интерфейс от абстрактного класса вообще гнал бы в шею. Но речь идёт о гораздо менее очевидных и базовых вещах. И у меня, на смотря на зелёную табличку, всё равно подозрения, вот ну нельзя просто так взять и начать применять стандарт, которому только года четыре или, тем более, год. Хорошо быть крестовиком, если и впрямь можно уже. Щас окажется, что стодонние либы, фреймворки, тулзы мета-компиляторы или ещё что-нибудь не поддерживает.
>> No.42452 Reply
>>42449
> вот ну нельзя просто так взять и начать применять стандарт, которому только года четыре или, тем более, год
Да почему бы и нет.
Два года назад на своей первой работе синтаксические плюшки вроде range-based for и auto команда использовала везде, где могла (why not?).
Кусок буста про многопоточность (который теперь в стандарт практически без изменений перекочевал) + бустовые же умные указатели (то же самое) использовали все ещё задолго до.

Сейчас-то, я думаю, можно смело даже initialization lists использовать и прочие плюшки.
>> No.42596 Reply
File: programming_by_fredzz-d78224u.jpg
Jpg, 119.93 KB, 1024×683 - Click the image to expand
edit Find source with google Find source with iqdb
programming_by_fredzz-d78224u.jpg
Анон, а посоветуй какую-нибудь интересную книгу по C++. Собственно плюсы я знаю на уровне среднего ОО-языка, но, чувствую, многое упускаю. Собственно, было бы интересно узнать о плюсоспецифичных тонкостях - в общих чертах узнать о сборке программ и роли в этом деле препроцессора/компилятора/линкера, о манипуляциях с объектами (ссылки/указатели, всякие умные указатели, константные ссылки, касты из одного в другое...), о возможностях новых стандартов, ну ты понимаешь. Будет очень здорово, если авторы обойдутся без долгих вступлений "что такое классы", "из чего состоит программа" и "как работать в Visual Studio" - всё это я и так уже узнал за несколько лет с C#.
>> No.42609 Reply
File: x_eafb710c.jpg
Jpg, 64.70 KB, 500×409 - Click the image to expand
edit Find source with google Find source with iqdb
x_eafb710c.jpg
>>42596
В тред врывается ванноби_С++_волшебник
  • Sutherland B. - Learn C++ for Game Development
C++ Помещается в жерновы практики с применением шаблонов, stl, блекджека и шлюх, а в конце заливается в твою голову в виде написания текстовой игрушки.
  • Meyers S. - Effective Modern C++
Тут уже крутой чувак по хардору поясняет как нужно писать на С++(11\14)
  • Прата С. - Язык программирования С++.Лекции и упражнения.
Там в основном введение в язык, но есть и те моменты, которые ты мог упустить\незнать.
>> No.42828 Reply
А почему я хочу написать цикл, for (x=4;x<14;x++) допустим, а у меня есть много переменных, которые зависят от икс и они не меняются, после первого прохода цикла?
>> No.42829 Reply
>>42828
Переменные в программировании ни от чего не зависят... Это же не функции. Они меняются только тогда, когда ты напрямую им что-то присвоишь. Это же не тетрадный листок... Тебе нужно использовать функции, чтобы выражать зависимости от х. Либо городить вокруг х объект и приделывать ему методы(до этого тебе ещё далеко).
>> No.42830 Reply
>>42829
Ну предположим я написал в цикле y=x+2. Он это значение 6 запомнил и дальше не менял почему то
>> No.42831 Reply
>>42830
напиши пример. Сам цикл.
>> No.42832 Reply
>>42831
  
for (x=421;x<720;x++)
   { int y1=(2/25)*(x1-10)^2;
int y2=(x1^2-100)*(2/25) ;
int f1=-30*y1+270    ;
int f2=-30*y2+270     ;
   for(f2=30;f2<f1;f2++)
  {
Canvas->Pixels[x][f2]=color;
  }
               }
>> No.42833 Reply
>>42832
х и х1 - это разные переменные.
>> No.42834 Reply
>>42833
Я потерял строчку int x1=30*x+420;
>> No.42835 Reply
>>42834
В смысле потерял, когда сюда копировал.
>> No.42836 Reply
>>42835
Молодец. Теперь я буду догадываться, где была эта строчка. Твои переменные не так меняются из-за того, что у тебя перед глазами туман вместо программы. Запусти дебагер.
>> No.42839 Reply
File: Подпрограмма.PNG
Png, 37.79 KB, 1029×506 - Click the image to expand
edit Find source with google Find source with iqdb
Подпрограмма.PNG
Помогите найти ошибку в функции, пожалуйста.
Программа должна делать ровно то же, что происходит в игре 2048 при нажатии влево. Примеры:
{1,0,1,2} -> {2,2,0,0}
{1,1,1,1} -> {2,2,0,0}
{1,0,0,0} -> {1,0,0,0}
И так далее. Думаю, все знают.

Проблема в том, что вместо объединения двух элементов происходит их объединение. То есть:
{1,1,1,0,} -> {0,0,1,0}
За первую итерацию цикла.

Извините за дурацкое объяснение, пишу эту простенькую программу (2048) с прошлого утра.Уже даже не могу нормально сформулировать, что мне надо.
>> No.42840 Reply
>>42839
minnotnull работает верно, я гарантирую.
10 (размер массива) там просто так. Должно быть 4, конечно.
>> No.42841 Reply
>>42839
Ну разумеется, оно обнуляет ячейки. Смотри сам:
// a = { 1, 1, 1, 0 }
// i = 0, mnn1 = 0, mnn2 = 1

// ...
if (a[mnn1] == a[mnn2]) // (a[0] == a[1]), или (1 == 1) - истина
{
    a[i] = 2 * a[mnn1];    // a[0] = 2 * a[0] = 2
    a[mnn1] = a[mnn2] = 0; // a[0] = a[1] = 0, данные испорчены.
}
// ...
Теперь несколько вопросов:
1. Почему ты не пользуешься пошаговой отладкой? С ней ты за первый же проход увидел бы, где именно портятся твои данные.
2. Почему ты запостил код в виде скриншота, а не в виде копипасты на pastebin или фрагмента кода прямо в посте? Так было бы гораздо удобнее комментировать его работу.
3. Что заставляет людей до сих пор использовать шрифт Courier New? Есть же винрарные Consolas, DejaVu Sans Mono и Ubuntu Mono, которые гораздо однозначнее выглядят и лучше читаются.
>> No.42842 Reply
>>42841
> Что заставляет людей до сих пор использовать шрифт Courier New?
Он охуенен, например.
> Consolas
Нашел, блеать, что советовать. Пиздецки высокое ужатое говно, в капсе буквы натурально сливаются друг с другом.
>> No.42843 Reply
>>42842
> Он охуенен, например.
Очевидно, ты не знаешь разницы между словами "охуенен" и "хуёвый". Зачем в нём такие конские засечки? Что мешало нормально нарисовать символы Il1, а ещё O0? Почему штрихи такие тонкие?
> Нашел, блеать, что советовать.
Некоторым нравится, например. Убунту-моно тоже не идеален из-за символов M и W, но у него почему-то тоже много фанатов. Лично я пользуюсь DejaVu Sans Mono - вот он охуенен, в отличие от Courier New.
>> No.42844 Reply
>>42843
Очевидно, что ты петросян и лицемер.
> Зачем в нём такие конские засечки?
> Что мешало нормально нарисовать символы Il1
Так ты определись, есть в нем засечки или нет. Потому что без засечек I и l действительно не отличаются.
> O0
У меня они почему-то различаются. А вот делать их абсолютно одинаковыми, но засунуть внутрь нолика точку, которая выглядит как битый пиксель или пылинка на экране - ни разу не круто.
> Некоторым нравится, например.
И при этом ты наезжаешь на любителей курьера. Браво!
> вот он охуенен
Лолнет:3
>> No.42845 Reply
>>42843
Лиспачую DejaVu Sans Mono.
>> No.42847 Reply
File: такие-дела.PNG
Png, 40.30 KB, 986×439 - Click the image to expand
edit Find source with google Find source with iqdb
такие-дела.PNG
>>42841
Спасибо, няша. Такая дурацкая ошибка.
> Почему ты не пользуешься пошаговой отладкой?
Пользовался. Просто я всратый: нашел строку ошибки, а суть не понял.
> Что заставляет людей до сих пор использовать шрифт Courier New?
Привычка. Кстати, когда хотел стать маминым хакиром (а мамины хакиры, как известно, обязаны пользоваться Линуксом), очень долго не мог привыкнуть к тамошнему шрифту по умолчанию. Он ужасно убог.

В общем, я первый раз в жизни собрал что-то из нескольких файлов: отдельно класс, вспомогательные функции и мэйн. Примерно то же самое нужно будет написать в линуксе (плюс мэйкфайл и краткий рассказ, что сделает препроцессор, компилятор и линковщик). И я получу зачет.
Только получилось отвратно. При каждом нажатии клавиши экран меркнет на долю секунды. Поэтому не дам исходники.
>> No.42849 Reply
>>42847
> При каждом нажатии клавиши экран меркнет на долю секунды.
Это потому, что при каждом нажатии клавиши ты очищаешь консоль и рисуешь игровое поле заново, хотя мог бы, перемещая курсор, затирать и перерисовывать только числа в ячейках. Для перемещения курсора в шарпике, например, есть метод Console.SetCursorPosition(int, int) (https://msdn.microsoft.com/ru-ru/library/system.console.setcursorposit[...].aspx); у плюсоводов-нативщиков наверняка есть какие-нибудь закреплённые стандартом кроссплатформенные функции, которые делают то же самое.
>> No.42853 Reply
File: Symantec_C++.png
Png, 13.78 KB, 800×600 - Click the image to expand
edit Find source with google Find source with iqdb
Symantec_C++.png
>>42841
> Что заставляет людей до сих пор использовать шрифт Courier New? Есть же винрарные Consolas, DejaVu Sans Mono и Ubuntu Mono, которые гораздо однозначнее выглядят и лучше читаются.
Они недостаточно винрарны.
>> No.42854 Reply
>>42849
Кросплатформенных нету, потому что никакой консоли нету, есть только потоки ввода-вывода, а за ними может быть хоть принтер с перфокартами.
>> No.42859 Reply
>>42854
Вообще-то есть...
Посмотри, как работает LAME, сбросив его вывод в текстовый файл. Увидишь там
>> No.42865 Reply
>>42859
Я видел, как делают цвета в виндовой консоли. Руками делают.

мимо
>> No.42867 Reply
>>42865
https://msdn.microsoft.com/en-us/library/system.console.foregroundcolo[...].aspx
https://msdn.microsoft.com/en-us/library/system.console.backgroundcolo[...].aspx
Руками, да - кто ж ещё, кроме программиста, полезет менять значения этих двух свойств.
>> No.42868 Reply
>> No.42869 Reply
>> No.42870 Reply
>>42869
Так делают грязные маргиналы-извращенцы, которые из-за своих грязных пристрастий не могут ни дня прожить без грязного содомирования байтов, указателей и хендлов. Серьёзно, какой упорок будет в XXI веке работать с чистым Win32 API, если есть прекрасное окружение, которое далеко-далеко скрывает винапи, попутно избавляя программиста от кучи проблем?
>> No.42871 Reply
File: n3s1t.jpg
Jpg, 7.28 KB, 360×202 - Click the image to expand
edit Find source with google Find source with iqdb
n3s1t.jpg
>>42870
А если приложение изначально написано под *nix и пользует escape-последовательности? И его надо запустить под cmd.exe с цветами, очисткой экрана/строки и прочего.
>> No.42872 Reply
>>42871
> А если приложение изначально написано под *nix и пользует escape-последовательности?
Значит, перед переносом этого приложения на винду нужно запилить между твоим кодом и консолью человечную прослойку с человечным API, а не пытаться дословно адаптировать Win32 API к линуксовым вызовам и потом возиться с escape-последовательностями по всему UI.

Вообще, попытки точно адаптировать API редко кончаются успехом. Если интересно, погугли, как ребята из Borland в отчаянной попытке сделать VCL кроссплатформенным запилили проект Kylix и чем у них там всё закончилось. (Спойлер: всё умерло.)
>> No.42873 Reply
>>42872
> Значит, перед переносом этого приложения на винду нужно запилить между твоим кодом и консолью человечную прослойку с человечным API, а не пытаться дословно адаптировать Win32 API к линуксовым вызовам и потом возиться с escape-последовательностями по всему UI.
А приложение и не использует линупсовые вызовы джля вывода цветов. Оно просто пишет в стандартный вывод. Попробуй заставить вот что-то такое работать: while(1) printf("\033[2J\033[0;31mfuck win\033[0m");
>> No.43142 Reply
Вопрос за возвращение ссылок в с++.
Допустим, есть локальный объект, созданный в функции. Если сохранить ссылку на этот объект вне функции, то по идее после выхода из функции этот объект должен уничтожиться, а ссылка станет битой? Что тогда будет при вызове метода объекта?

Object o;
Object& ref = o;
void foo()
{
Object temp;
ref = temp;
}
ref.method();
>> No.43143 Reply
>>43142
Ты какую-то хуйню написал в качестве примера.
> Что тогда будет
Неопределенное поведение.
>> No.43144 Reply
>>43143
> Ты какую-то хуйню написал в качестве примера.
Догадываюсь, лол.
>> No.43145 Reply
>>43142
> Допустим, есть локальный объект, созданный в функции. Если сохранить ссылку на этот объект вне функции, то по идее после выхода из функции этот объект должен уничтожиться, а ссылка станет битой?
Если объект создан на стеке - да, он будет уничтожен, и его память может быть заполнена какими-то другими данными.
> Что тогда будет при вызове метода объекта?
Если тебе очень (не) повезёт, то ничего - метод отработает как обычно. "Не" стоит потому, что тебе может понадобиться отлаживать это говно, и такие успешные отрабатывания могут сильно осложнить диагностику и решение проблемы. В остальных случаях данные объекта будут заполнены мусором - к чему это может привести, решать тебе самому. Если среди данных объекта были указатели на функции, то при обращении к методу, вызвающему эти функции, может случиться вообще всё что угодно.
>> No.43148 Reply
>>43145
И еще новый вопрос. Какие есть рекомендации по использованию "умных" указателей? Имеет ли смысл все обычные указатели заменять "умными"?
>> No.43149 Reply
>>43143
Segmentation fault будет наверно.
>> No.43150 Reply
>>43148
Да вроде бы это и был один из основных краеугольных камней C++ тогда, в 90-е...
Имеет смысл пойти ещё дальше и заменить указатели на дескрипторы переменных, как в жаббашарпах.
>> No.43152 Reply
>>43150
Имеет смысл пойти ещё дальше и заменить C++ на жаббашарпы.
>> No.43153 Reply
>>43152
Если ты берёшься за кресты, разве у тебя не должна быть какая-то определённая причина браться за них?
>> No.43154 Reply
>>43153
Многие начинающие крестолюбы и сами не знают, почему они выбрали кресты, а не, например, C#. Обычно в качестве причин говорят что-нибудь вроде "Нам в универе говорили только про плюсы", или "Мне тут кто-то говорил, что плюсы - это круто", или красноглазые вскукарекивания про открытость-надёжность-скорость (что, тащемта, не мешает этим людям писать однопоточные синхронные тормозные велосипеды, которые к тому же ещё и сегфолтятся на каждый чих).
>> No.43155 Reply
>>43153
Ну на них много что написано, компиляторы, трансляторы, интерпретаторы, движки; это основа, которую нужно знать, но писать можно на чем угодно другом.
>> No.43157 Reply
>>43155
Основа - это асм и алгоритмы.
>> No.43158 Reply
>>43155
Причём здесь, что на них написано, причины какие-то более конкретные, причины использовать именно ручное управление и указатели и т.д. Рассуждение на каком-то чисто энциклопедическом уровне на высоте 1000 метров от практики.
>> No.43159 Reply
>>43158
Ну на шарпе, например, не попишешь без дот нета, на джаве без жвм. Чем не причина?
>> No.43160 Reply
>>43159
> жвм
Есть везде.
>> No.43161 Reply
>>43159
А на плюсах не попишешь без компилятора. Мало того, многие плюсовые программы тащат с собой, например, Microsoft Visual C++ Redistributable. В чём тогда принципиальная разница?
>> No.43162 Reply
>>43159
Обычно это причина, связанная с производительностью, так что у тебя будут места, где ты будешь специально писать каким-то конкретны образом с учётом самого алгоритма.
>> No.43168 Reply
>>43150
> дескрипторы переменных
В с++? Можно подробнее нубу.
>> No.43169 Reply
>>43152
> жаба
Тормозит, по сравнению с плюсами. Но запускается там где есть жвм.
> шарп
Хз как с его тормознутостью, но он не кроссплатформенный.
>> No.43170 Reply
>>43169
Любой язык с GC медленней языка без оного. Так-то факт давно известен, что жава\шарпы хуже плюсов, плюсы хуже ассемблера.
>> No.43171 Reply
>>43168
Это т.н. HANDLE-значения, обычно их выбрасывают функции API, т.е. они доступны для любого языка.
У меня есть безумный пример на сишке, где вместо функции malloc() вызывается функция alloc() и она заполняет переданное ей HANDLE-значение. Потом с помощью функций get() и set() с ним можно выполнять какие-то действия... не думаю, что нубу это будет полезно, т.к. это обыкновенная хеш-таблица и она есть в любом современном языке.
В те стародавние времена поверх них делали примитивные сборщики мусора, т.е. за каждым дескриптором скрывался указатель и счётчик ссылок.
А сейчас вроде бы в C++ есть unique_ptr<> и другие им подобные. А ещё из буханки хлеба можнозделоть троллейбус!
>> No.43172 Reply
>>43169
>>43170
Всё это чрезвычайно упрощённо. Такого рода оптимизация может быть эффективной только в каких-то узких местах на особо прожорливых задачах. Просто так взять и бездумно, потому что "я хочу", написать на С++ вместо джавы даст в итоге прирост производительности в один процент и будет тебе "хуже плюсов, плюсы хуже ассемблера", бла-бла-бла. Вы думаете, что сможете писать быстрый код просто потому, что выучите сложный синтаксис С++ и сможете не забыть ос\чистить всю дин. память, но это не вот так вот просто всё.
>> No.43173 Reply
>>43172
Алсо, есть даже шанс, что твоя программа на С+ будет даже на один процент хуже из-за ололо-оптимизаций джавы или шарпа. Иногда у них это получается.
>> No.43174 Reply
>>43170
Почти начался языкосрач. Но развивать не буду.

>>43171
Окей, про это я слышал. И даже юзал, когда с winapi возился.

Алсо, в любом случае, бампаю свой вопрос выше.

Когда имеет смысл юзать "умные" указатели, а когда можно не париться и юзать обычный?
>> No.43175 Reply
>>43169
Давно уже кроссплатформенный, с 2004 года.
>> No.43177 Reply
>>43175
В теории. А на практике опыт было то?
>> No.43178 Reply
>>43174
Да я больше шутканул. В с++ ты можешь только с pointing reference играться и со своим алцгеймером, что ты ничего не забыл. А в джаве можно просто переключиться в режим mark and swap или в generational GC, более того GC щас запускается concurrently. Но я пошел еще дальше: я пишу на скале на кластере, акку конфигурю правильно, в итоге у меня скорость чуть похуже, чем cpython c гну-параллел, зато кода в сотни раз меньше. А когда дотти выйдет, так я вообще летать буду. Единственное, что нет параллельной линейной алгебры (но ее и на плюсах никогда не было) и выхода на gpu кластеры - так что плюсы пока забывать окончательно не буду.
>> No.43179 Reply
>>43178
Уааааааау, сугой, десу нэ!
>> No.43185 Reply
File: Netduino-plus2.jpg
Jpg, 148.47 KB, 700×525 - Click the image to expand
edit Find source with google Find source with iqdb
Netduino-plus2.jpg
>>43177
Очевидно, >>43175-кун имел в виду Mono - с ним у меня опыта не было, но могу рассказать про .NET Micro Framework. Синтаксически программы пишутся на том же самом C#, никакой разницы с десктопными приложениями. Стандартная библиотека порезана, но почти все необходимые вещи на месте. Если взять рандомное десктопное приложение и попытаться собрать его под .NET MF, оно, скорее всего, не соберётся (опустим вопрос о том, каким же упорком нужно быть, чтобы комплять десктопные приложения для запуска на голом железе микроконтроллера). Работает заметно медленнее, чем нативно-плюсовый код, а если у программиста кривые мозги, то ещё и фризится на сборках мусора. Но, чёрт побери, как же этот код божественно отлаживается! Можно написать программу в той же визуальной студии, в которой пишется десктопный код, скомпилять/задеплоить/запустить код по нажатию на F5 и начинать отлаживать его так же, как и десктопный код. Точки останова, стеки вызова, вотчи, всплывающие подсказки со значениями переменных - всё это работает без пердолинга с регистрами-памятью-стеком и без жертв на JTAG. Просто песня!
>> No.43186 Reply
>>43177
Кстати, анон, встречный вопрос к тебе: у тебя был опыт разработки кроссплатформенных приложений на C++? Ты познал радости #ifdef-driven development, неопределённых поведений и зоопарка с оптимизациями?
>> No.43187 Reply
>>43185
В то, что можно на C# прогать контроллеры я верю куда охотнее чем в то, что Моно можно использовать. Не верю и всё тут. И вообще, кроссплатформенность - городская легенда
>> No.43197 Reply
>>43187
> кроссплатформенность - городская легенда
Щито? А как же qt?
>> No.43203 Reply
>>43186
> неопределённых поведений и зоопарка с оптимизациями
Просто не выябывайся пиши говно, вызывающее неопределённое поведение. И не будет никаких проблем с оптимизациями (кроме редких случаев, когда в компиляторе баг). Это не так сложно, как кажется.

Не юзай компиляторозависимые фичи, которых нет в стандарте. Вообще. Никогда. Как бы они тебя не манили. Кроме случаев, когда без них задача вообще неразрешима.
> #ifdef-driven development
Без буста или Qt - ещё как познаешь, особенно с кодировками, датами и временем и прочими няшностями... А с этими либами всё-таки будет полегче. У Qt, как бы её не ругали, очень неплохая абстракция от ОС.

Ну а вместо ифдефоф, имхо, лучше файлы целиком переключать. Типа foowin.cpp, fooposix.cpp и т.п.

мимо-крестоблядь
>> No.43271 Reply
Гысспада, после прочтения книги Таненбаума про архитектуру я научусь так же хуярить на асме?

http://fadedead.org/museum/long-arithmetic-fft-algorithm-use
>> No.43272 Reply
>>43271
> я научусь так же хуярить на асме
Нет. Научишься только когда прочтёшь ещё 100500 книг, и напишешь 100500 подобных кусков. Это примерно как художник-ньюфаг, который прочёл книжку "как научиться рисовать за 20 дней" и художник-олдфаг, который двадцать лет хуярит картины сутками напролёт.

P.S. Ты ведь дочитал статью до конца и понял в чём мораль?
>> No.43275 Reply
File: КиР.jpg
Jpg, 50.40 KB, 689×463 - Click the image to expand
edit Find source with google Find source with iqdb
КиР.jpg
Анон, как называется вот эта смена состояний с OUT на IN и обратно? Конечный автомат, машина состояний?
>> No.43276 Reply
>>43275
State machine, конечный автомат. Машина состояний - упоротая калька со state machine, не говори так.
>> No.43277 Reply
>>43276
> Машина состояний - упоротая калька со state machine, не говори так
Тащемта это одно и то же по смыслу. State machine для англичанина - машина состояний.
>> No.43279 Reply
>>43275
При мне их называли «флажки состояния», что то же самое.
>> No.43285 Reply
>>39742
> Осло, на асме вообще работают только с фиксированным числом регистров, всё ручками, никаких переменных.
Фантазер, не говори о том, чего не знаешь.
>> No.43286 Reply
>>39742
> ни на что не влияет
Влияет на дебаг инфу и всяческие RTTI. Но они для таких применений один хер отключены и в прошивку не попадают.
> всё ручками, никаких переменных
Ну неправда же, анон. В ассемблерах тоже можно описывать переменные, удобства ради. Во многих можно даже алиасы регистрам дать, чтобы не запоминать, что в какой положил.
>> No.43287 Reply
>>43286
P.S. И даже структуры в асмах есть, чтобы не вспоминать по какому оффсету какое поле лежит.
>> No.43288 Reply
>>43286
Мы точно не путаем итоговый машинный код, который будет реально выполняться процом, о котором и шла речь, и синтаксический сахар, который ещё надо откомпилить? Я в танке, но просто предположение.
>> No.43289 Reply
>>43288
Ну если ты о машинном коде, то не надо его называть ассемблером. Ассемблер это по определению сахарный компилятор, позволяющий не кодить хексами и не высчитывать адреса руками.
>> No.43290 Reply
>>43289
Ну там выше по треду кто-то поднимал вопрос, как длина переменных влияет на производительность, а ему сказали, что никак, так как в машинном коде нет переменных. И назвали при этом машинный код ассемблером.
>> No.43291 Reply
>>43290
длина имён переменных* фикс
>> No.43292 Reply
Кто работает в Dev-Cpp? Выручайте.

1) У меня версия 5.4.2. Как отключить в ней автодобавление закрывающих скобок?
2) Старая версия мне не нравилась тем, что она ставила отступы в несколько табов, и это никак не настраивалось. Все говорят, что это был такой баг. Но в той версии было няшное маленькое окошко Compile Progress, а в 5.4.2 здоровенное ебаное окно. В какой версии табы ставятся нормальные, и при этом окошко прогресса няшное и маленькое?
>> No.43293 Reply
Анон, как сделать объявление очереди по приоритетам в хедере, используя template? Компилятор ругается на такое использование темплейта и не хочет компилировать код.
>> No.43294 Reply
>>43292
> У меня версия 5.4.2.
Нихуюшеньки старьё. Актуальная версия вроде 5.11 -> http://sourceforge.net/projects/orwelldevcpp/files/
>> No.43295 Reply
Пишу реализацию очереди с приоритетами.
Хедер: https://ideone.com/tnWS3d
Сорец: https://ideone.com/8bbz5v

Правильно ли я начал реализовывать методы шаблонного класса? Что я делаю не так в последнем методе? Ошибка:

error C2664: Item::Item(const Item &): невозможно преобразовать параметр 1 из "Item " в "const Item &"
1> Причина: невозможно преобразовать "Item " в "const Item"
1> Ни один конструктор не смог принять исходный тип, либо разрешение перегрузки конструктора неоднозначно

Пиздец, какой же вырвиглазный С++
>> No.43296 Reply
>>43293
Enjoy your C++! б ты пользовался нормальным языком с нормальными дженериками, проблем бы не было.
> Компилятор ругается на такое использование темплейта
Дай угадаю: ты объявил шаблонный класс/функцию в foo.h, реализовал его в foo.cpp, подключил foo.h в двух разных местах (или более) и пытаешься использовать с разными типами? Если так, то ругается наверняка не конпелятор, а линкер, но причиной ругани стал тупой плюсовый компилятор:
0. Ты описал шаблонную функцию test<T>() в файле foo.h и реализовал в файле foo.cpp.
1. Ты использовал foo.h в файле bar1.cpp (например, вызвал test<int>()) и bar2.cpp (например, test<unsigned long>()).
2. При компиляции кода компилятор дошёл до файла bar1.cpp, начал разбираться, что такое test<int>(), нашёл в foo.h объявление функции test<T>(), нашёл реализацию в foo.cpp, заменил T на int и скомпилил результат в foo.o.
3. Компилятор добрался до файла bar2.cpp, начал разбираться, что такое test<unsigned long>(), полез в foo.o и - вот ведь сюрприз! - нашёл там только test<int>(). Как результат, слинковать bar2.o и foo.o у него не получилось, и он начал крыть тебя матом.

В качестве решения можешь перенести реализацию шаблонного класса/метода в заголовочник - тогда реализация для bar1.cpp и bar2.cpp будет отличаться. Костыль, конечно, но плюсы - это один сплошной костыль, так что плюсоводам не привыкать.
>> No.43297 Reply
>>43296
Я пока нигде ничего не подключал, не компилируются даже хедер с исходником (из-за реализации последней функции getmax).
> Enjoy your C++! б ты пользовался нормальным языком с нормальными дженериками, проблем бы не было.
Жава еще большее говно. Жаль, что я плохо знаю чистый си для нормальной реалиазции пирамиды, иначе я бы не ебался с говном++.
>> No.43298 Reply
>>43297
Item PQ<class Item>::getmax(){
	return new Item();
}
1. Не уверен, что использование одного и того же имени для обозначения шаблонного класса и класса-реализации - это правильная мысль. Даже если компилятор поймёт, какой из Item ты имеешь в виду в каждом конкретном случае, не факт, что программисты, которым достанется твой код, не переебут тебя лопатой поперёк лица за такое.
2. Насколько я помню б-гомерзкие плюсы, new Item() в них возвращает Item* (указатель), а твой метод возвращает Item (экземпляр по значению). Отсюда и возникает твоя ошибка.

Сириусли, зачем тебе плюсы? Перекатывайся на жаву или решётку - там ты сможешь писать код, а не возиться с указателями и констами.
> Жава еще большее говно.
Очень спорное утверждение, да ещё и без пруфов.
>> No.43299 Reply
>>43298
> Сириусли, зачем тебе плюсы? Перекатывайся на жаву или решётку - там ты сможешь писать код, а не возиться с указателями и констами.
Я пока даже не знаю, чем легче будет зарабатывать. Мне нравится чистый Си, нравится схема (наворачиваю SICP), а С++ сильно утомляет. Вот я уже пару месяцев не писал на нем ничего, и не понимаю, почему вот в этом коде сравнение двух Item'ов по ключу дает оба раза 0?

https://ideone.com/WsTBW1

Почему?

В решетке очень не нравится слово using. В #include, #define, #pragma душа и дух олдскула, а С# просто решили сделать не таким как все без необходимости на то
>> No.43300 Reply
>>43299
Тьфу, блять, я же должен сравнивать ключи, а не данные. Уже засыпаю.
>> No.43301 Reply
>>43299
> почему вот в этом коде сравнение двух Item'ов по ключу дает оба раза 0?
Не могу сказать, почему твой код не работает, но рутинное заполнение полей в плюсах часто делают списками инициализации полей, как-то так:
class Item{
private:
	int m_key;
	int m_data;
public:
	Item(int data, int key) : m_data(data), m_key(key) {}

	// Можешь ещё раз насладиться плюсами, в которых до недавнего времени
	// нельзя было вызвать конструктор из другого конструктора класса.
	// В C# это выглядело бы так (без учёта разрывов строки):
	// public Item() : Item(0, 0) {}

	Item() : m_data(0), m_key(0) {}

	// ...
};
> В решетке очень не нравится слово using.
Ну и зря. В решётке using обычно несёт точно такой же смысл, что и в плюсах - он импортирует содержимое указанного неймспейса.
На самом деле у слова using в решётке есть ещё как минимум два назначения:
1. Назначение псевдонимов для классов:
using Point = System.Drawing.Point;
2. Использование ресурсов, для которых важен контроль времени жизни (костыль вместо плюсового RAII):
using (var d = new DisposableStuff())
{
    // ...
}
Но вряд ли ты имел в виду эти два применения - они встречаются гораздо реже, чем подключение неймспейсов.
>> No.43302 Reply
>>43301
С# мне нравится только тем, что в нем есть поддержка больших чисел из коробки. Моя специальность связана с криптографией и алгебраическим/алгебро-геометрическим кодированием информации и сжатием, а там везде используются огромные числа. В С++ для этого надо подключать сторонние либы. Алсо, на каком языке проще найти работу - С++ или С#?
>> No.43303 Reply
>>43302
> на каком языке проще найти работу - С++ или С#?
Сложно сказать, не зная твоего уровня, опыта и города. Открой авито или хедхантер, поищи вакансии в своём городе и сравни их количество и зарплату. Учти также, что у C++ выше порог вхождения, поэтому у плюсоводских вакансий может быть выше зарплата, но выше и требования к соискателям.
Алсо, я уже около 5 лет работаю решёткопрограммистом. В моём городе вакансий по C# полно, поэтому не могу сказать, что я страдал от их отсутствия. И да, я знаю плюсы на уровне типового ОО-языка и применяю их в наколенных ардуиноподелках, но я пока не готов связывать с ними свою профессиональную деятельность. Уж лучше простой, логичный и однозначный C#, чем это мозговыносящее инопланетное говнище.
>> No.43304 Reply
Удивительно, компилятор не заметил ошибку i+ вместо i++ в цикле и скомпилировал программу. А ошибка проявилась только когда я добавил вызов getmax().
>> No.43305 Reply
>> No.43306 Reply
>>43304
Заметил же:
compilation info

prog.cpp: In member function 'Item PQ<Item>::getmax()':
prog.cpp:34:27: error: expected primary-expression before ')' token
   for(int i = 1; i < n; i+)
                           ^
>> No.43307 Reply
>>43298
> Item PQ<class Item>::getmax(){
> return new Item();
> }
Нет, так тоже не работает.
>> No.43308 Reply
А что посоветуешь выбрать между явой и C#?
>> No.43309 Reply
> C++
> обсуждают жаву с шарпом
>> No.43310 Reply
>>43309
Ну там все ушли на сосач или вернулись на нульчан, а здесь сидят 2.5 анона, которые обсуждают одно и то же.
С++ для тех, кто заканчивает карьеру программиста. Не для начинающих.
>> No.43311 Reply
>>43308
Между Scala и F#
*fix
>> No.43312 Reply
>>43311
Как хочется дрочерам, чтобы их языки хоть кто-то ценил. Но никому не интересны кучка ущербных.
>> No.43313 Reply
Зачем вы навязываете свою борщевую маргинальщину, да еще кто во что горазд? Есть ведь хачкель, вот и обмазывайтесь им вместе с книжкой Алуффи. Зачем лезть в говно типа скалы и F#? Мужики на грантах повысирают подобных языков еще вагон и маленькую тележку.
>> No.43314 Reply
>>43307
Конечно, не работает, это я твой код скопипастил. Поменяй тип, который возвращает функция, с Item на Item*, тогда заработает.
>> No.43315 Reply
>>43310
> С++ для тех, кто заканчивает карьеру программиста. Не для начинающих.
Ну или для тех, кто учится, тоже хорошо, нет? Чтобы понимать, что там внутри.
Кроме того, многие же идут в С++ после каких-то крутых вузов, кафедр и т.п. Всякие там ололо-научные штуки. Я таких знаю. А ты знаешь людей, которые именно из бизнесовых крудов на яве и шарпе перешли в кресты?
>>43313
Ну Скала - это не чистый ФП язык. Там можно писать по-обычному сколько угодно. Во-вторых в скалу же можно легко джавовые либы интегрировать. И байткод запускать на реализациях джавы ещё.
>> No.43316 Reply
> Напишите реализацию основного интерфейса очереди по приоритетам, который использует упорядоченный массив в качестве базовой структуры данных.
Мне объяснили, что для поддержания массива отсортированным, нужно использовать принцип, по которому работает сортировка вставкой. Помогите лучше разобраться в этом алгоритме.

https://ideone.com/3JPrGg

Интересует работа внутреннего цикла. Первое условие гарантирует, что мы не выйдем за пределы массива влево. Второе условие - мы перебираем те элементы, которые больше нашего ключа. Так? И перед этими элементами мы вставляем ключ, который меньше этих элементов. Т.к. ключ мы запомнили, то на его место мы сдвигаем массив. Верно? Последняя строка:
> list[scanPos + 1] = key;
Мы добавляем к scanPos единицу потому, что отняли ее в цикле? Таким образом, ключ вставляется перед последним элементом, который больше ключа, но после элемента, который меньше ключа? Объясните вот эти все моменты, я в них плохо ориентируюсь.

Лень разбираться в новом языке, и сейчас мне важны прежде всего алгоритмы, поэтому продолжу писать на крестах

Как можно придумать алгоритм вставки нового элемента в отсортированную очередь?
>> No.43317 Reply
>>43316
Если я пытался добавлять новые элементы в очередь, в которой уже есть один и только один элемент, то цикл с условием не выполнялся, потому что условие цикла выглядело как 1 < 1. Добавил еще один if, и теперь добавление возрастающей последовательности работает правильно.

https://ideone.com/hKKMxe
>> No.43318 Reply
>>43315
> Чтобы понимать, что там внутри.
Нет. Для этого лучше сишку или асм раскурить.
>> No.43319 Reply
>>43298
> Насколько я помню б-гомерзкие плюсы, new Item() в них возвращает Item* (указатель), а твой метод возвращает Item (экземпляр по значению). Отсюда и возникает твоя ошибка.
Насколько я помню б-гомерзкие плюсы, new там вообще не связана напрямую с использованием ООП. Пара операторов new и delete там - это аналог malloc и free в С. Они просто резервируют и освобаждают участки памяти в куче.
int* a = new int;
int* b = new int[10];
MyClassName* c = new MyClassName;
MyClassName* d = new MyClassName(n, m);
int w;
int[10] = x;
MyClassName y;
MyClassName z(n, m);
В большинстве ОО языков new - это вызов конструктора. Но С++ конструктор и вообще классы тут ни при чём. Вот тут конструктор вызывает в 3-й, 4-й, 7-й, 8-й строчках. В 7-й и 8-й строчке и без new он прекрасно вызовется, а объекты создадутся не в куче, а на стеке. А 1-й и 2-й создаются указатели на обыкновенные инты в куче, тут вообще ООП нет никакого.

В жаве/шарпе, конечно, нет никакой кучи и стека, вот этого и нет.

И использовать указатели не обязательно, можно просто:
Item PQ<class Item>::getmax(){
	Item i;
	return i;
}
Но тогда учти, что при этой вызовется неявно конструктор копии класса Item, который начнёт копировать i в новую переменную. Так что, если в Item есть указатели и ты его грамотно не написал, то будет выстрел в ногу. Да и это скорее всего будет медленнее. Наверное. Смотря, сколько полей.

Надеюсь, ничего не перепутал, но ставить/искать компилятор и проверять лень. Rejoice your C++
>> No.43320 Reply
>>43319
New в шарпе - это убогая калька с крестов, учитывая, что ручного удаления не предусмотрено. В жабе вероятно тоже, но не уверен, автор жабы тот еще долбоеб, мог и сам додуматься ненужный оператор добавить.
В 11 стандарте появилась move-семантика, так что можно возвращать объекты по значению без особого оверхеда.
>> No.43321 Reply
>>43320
И тут я вспомнил о том, как все втирают про то, что php и javascirpt легче учить из-за того, что они похожи на C и C++, не то что все остальные скриптовые языки типа питона и руби, которые "основаны ни на чём", как кто-то сказал.
>> No.43322 Reply
>>43320
> можно возвращать объекты по значению без особого оверхеда
Да в общем-то оно у многих компиляторов и раньше без оверхеда работало за счёт небольшого костыля в соглашении о вызове (RVO и NRVO).
>> No.43324 Reply
>>43319
>>43320
Вообще-то куча (heap) есть и в Java и в C#. А ещё в шарпе есть стэк (в котором обычно живут value-типы) и ручное удаление (Dispose). За Java не скажу, ибо не видел её уже 9000 лет. Энивей, не грешите на языки, которых не знаете.
>> No.43325 Reply
>>43324
> Вообще-то куча (heap) есть и в Java и в C#.
Это точно куча в смысле дин. память, а не куча в смысле структура данных куча?
>> No.43326 Reply
Мой вариант функции insert, которая должна поддерживать упорядоченность массива. По идее все должно быть правильно, но эта функция не работает.

https://ideone.com/odn3tZ
>> No.43327 Reply
>>43324
> Dispose
Ну Dispose() это всё-таки не ручное удаление, а всего лишь команда освободить ресурсы, чтобы не ждать пока сработает финализатор. Этакий обобщённый Close(). Сам объект после вызова Dispose() всё ещё продолжает жить, пока его не подчистит GC.
>> No.43329 Reply
>>43326
А, я забыл n++. Теперь, похоже, все верно.
https://ideone.com/HAz2LX
>> No.43330 Reply
>>43325
Угу. Вот довольно неплохая статья про распределение памяти в CLR, зоть и не первой свежести (она также расскажет что я был не совсем прав относительно value-типов). http://blogs.msdn.com/b/ericlippert/archive/2010/09/30/the-truth-about[...].aspx
>> No.43332 Reply
>>43327
В смысле? Ресурсы высвобождаются при вызове Dispose(), а вызов Finalize() обычно подавляется. Из msdn:
> The Dispose method performs all object cleanup, so the garbage collector no longer needs to call the objects' Object.Finalize override. Therefore, the call to the SuppressFinalize method prevents the garbage collector from running the finalizer. If the type has no finalizer, the call to GC.SuppressFinalize has no effect.
Т.е. объект уже не "живёт". Но таки в памяти действительно занимает место до следующей чистки GC (если ты это имел ввиду). Щито поделать, desu. Хотя при желании можно попросить GC прибраться.
>> No.43333 Reply
>>43329
> Item *pq
> int n
Ну зачем, зачем, анон? Для этого же есть std::vector<T> и std::deque<T>, которые тебя избавят от всего этого геморроя с ручным управлением памятью. К примеру, ты забыл написать деструктор, который делает delete[] pq, из-за чего у тебя память потечёт.

К тому же ты max передать то передал, а сохранить его и сравнить с n в insert'е забыл. Жди беды.
> void insert(Item item){
void insert(const Item & item) { всё-таки, чтобы лишней копии не было.
> getmax(), getmin()
Странная реализация получилась. У тебя же массив уже отсортирован. Зачем ты ищешь в нём максимум? Положения максимума и минимума тебе известны. А потом ты swap()'ом портишь весь порядок в массиве. Так что или трусы надень или крестик сними...
> show(), print()
Для общности и соответствия STL можно переименовать обе функции в operator <<.
>> No.43334 Reply
>>43333
> К тому же ты max передать то передал, а сохранить его и сравнить с n в insert'е забыл. Жди беды.
А это для чего?
> Для общности и соответствия STL можно переименовать обе функции в operator <<.
Да, уже встретил проблему, когда создал очередь интов, и у int не нашлось функции print(). Так что удалил даже show, ничего лишнего не осталось.
>> No.43335 Reply
>>43333
> Зачем ты ищешь в нём максимум?
Это старая реализация. Она была такой до того, как я решил поддерживать упорядоченность массива.
>> No.43336 Reply
>>43334
> А это для чего?
Потому что залетишь на переполнение буфера, если в очередь напихать слишком много элементов. И закончится это UB (undefined behavior) со всеми вытекающими последствиями. В лучшем случае упадёт. В худшем - запорет какую-нибудь соседнюю переменную и доставит тебе море анальных наслаждений и гейзенбагов в процессе отладки.
>> No.43337 Reply
>> No.43338 Reply
>>43332
> Т.е. объект уже не "живёт".
Бред (возможно, из-за путаницы в терминологии). Dispose() - это самый обычный метод. Сам по себе его вызов не творит никакой магии, не выгружает объект и не освобождает занимаемую им память. Просто, если твой объект владеет какими-нибудь внешними и/или неуправляемыми ресурсами (подключения, картинки, хендлы, COM-объекты...), в методе Dispose() ты можешь их освободить и подавить вызов финализатора.
А можешь и не освобождать, если ты косорукий рукожоп. Можешь даже зачем-нибудь реализовать метод Dispose() для внутренних чисто-управляемых объектов, который будет, например, занулять поля - этим ты привнесёшь в код немного хаоса и энтропии, но практически никак не повлияешь на его исполнение.
tl;dr: после вызова метода Dispose() освобождаются только те ресурсы, которые были (внезапно!) освобождены в методе Dispose(). Сам объект при этом остаётся в живых, и им иногда даже можно продолжать пользоваться, если программист не предусмотрел проверки состояния и выброса ObjectDisposedException.
> Хотя при желании можно попросить GC прибраться.
За такое можно смело бить линейкой по рукам, а при последующих рецидивах - черенком от грабель. Если ты хочешь, чтобы твоя программа не жрала память - не создавай лишние объектов, очевидно же. Использование GC.Collect() - это не решение проблемы, а лишь попытка замаскировать её. Она приведёт не только к жору памяти до вызова GC.Collect(), но и к фризам на время сборки мусора. Нахуй так жить?
>> No.43339 Reply
>>43337
Ну как сказать... Всё ещё нету операторов копирования и присваивания, без которых ты потом наловишь весёлых багов... Тебе же выше писали, что c++ - не самый дружелюбный язык для новичка.
> if(n+1 < max)
Рассмотри ситуацию, в которой max = 4, n = 3. Вроде как ещё один элемент можно воткнуть, а ты его уже игноришь.

Олсо, структура из {pq, n, max} называется std::vector<T>, а строчки 28-31 очень близки к std::upper_bound().
>> No.43340 Reply
>>43338
> ты можешь их освободить и подавить вызов финализатора.
Ну да. Об этом и шла речь, собственно.
> Сам объект при этом остаётся в живых, и им иногда даже можно продолжать пользоваться, если программист не предусмотрел проверки состояния и выброса ObjectDisposedException.
А вот тут я похоже действительно обосрался. Пардон.
> Такое можно смело бить линейкой по рукам, а при последующих рецидивах - черенком от грабель
Согласен. Но ведь можно жи!
>> No.43341 Reply
>>43339
> Всё ещё нету операторов копирования и присваивания
В каком месте? По словам "оператор копирования" не понятно, где их не хватает.
>> No.43342 Reply
>>43341
Тьфу бля, спать пора, конструктор копирования.

Конструктор копирования: PQ(const PQ & other)
Оператор присваивания: PQ & operator = (const PQ & other)

Если ты их сейчас не напишешь, то код в духе a = b где a и b это очереди закончится UB'ом с кровь-кишками-двойным-освобождением-памяти.

P.S. С++ - это цундере. Лет 5 будет тебя бить и ругать, и только потом покажет свои истинные чувства :3
>> No.43343 Reply
File: SlowSonic.jpg
Jpg, 45.23 KB, 380×558 - Click the image to expand
edit Find source with google Find source with iqdb
SlowSonic.jpg
>>43342
> P.S. С++ - это цундере. Лет 5 будет тебя бить и ругать, и только потом покажет свои истинные чувства :3
Но ты уже к тому времени ебёшься с лолей, моэняшкой, милфочкой, подругой детства, кудерой, инвалидкой, умняшкой или своей систрой. Даже устраиваешь групповушки в самых невероятных ситуациях и позах. Ты понимаешь, что цундерка эта оказывается бревном в постели и временами норовит проявить свой дикий нрав с укосом под яндере. Все её мечты о том, чтоб ударить тебе в спину тогда, когда ты этого не ждёшь. Да и на горизонте маячат новые лица. Ты хочешь познакомится с ними, а они с тобой. Иногда тебе становится скучно и немного грустно от всего этого многообразия. В такие моменты ты предупреждаешь всех о долгом запое, запираешься в помещении, задёргиваешь шторы, включаешь пеку, запускаешь vi поверх "железной" консоли и натираешь голый си.
>> No.43344 Reply
>>43341
https://ideone.com/kxVx8s

Вот как-то так, если быстро и грязно.

size() и resize() - твой n, reserve() и capacity() - твой max
>> No.43345 Reply
>>43343
Именно так, анон... Всё именно так...
>> No.43346 Reply
> // По-хорошему, для реализации очереди с приоритетами надо юзать кучу
> // (см. вики по "куча структура данных")
> // но тебе будет сложно ее реализовать, раз с массивом уже проблемы
Как раз к реализации сортирующей кучи я и хочу подобраться, потому что мне надо реализовать не бинарную кучу, а d-арную.
>> No.43347 Reply
File: install-gentoo.gif
Gif, 2616.87 KB, 512×384 - Click the image to expand
edit Find source with google Find source with iqdb
install-gentoo.gif
>>43345
Осталось разобраться кто есть кто в этом гаремнике.
>> No.43348 Reply
>>43341
C++ обожает в неожиданных местах вызывать определённые функции. При этом эти функции он любит создавать автоматически. Но он их создаёт правильно только в некоторых случаях, которые ещё знать надо. Потому ты должен всё о них знать и писать их сам правильно. Иначе куча странных багов от их неявных неправильных вызовов. Прежде всего это оператор присвоения, конструктор копии и деструктор. Почти одно и то же, но надо обязательно и то, и то одновременно писать(кроме случаев, но ты либо пишешь их оба, либо не один, иначе каша будет). И того почти любой класс у тебя имеет как минимум три метода и почти никак не меньше.

При это ещё при использовании полиморфизма надо знать, когда к ним нужно добавлять слово virtual. Это ещё одна отдельная песня.

Да ещё плюс, если ты решишь вдруг сыграть в ромбовидное наследование, то проблем с ними станет в 8 раз больше, это ещё одна песня. Самая замечательная песня в плюсах, его бриллиант.
>> No.43349 Reply
>>43347
лолей - nim и d, т.к. возраст совсем маленький
моэняшкой - python, т.к. красиво, но порой с забавным видом спотыкается обо всякую фигню и падает, показывая свой бектрейс
милфочкой - c, тут всё просто
подругой детства - pascal
кудерой - java, наверное, потому что тихо работает и никого не трогает
инвалидкой - php однозначно
умняшкой - sql, наверное
своей систрой - тут я даже не знаю, что написать
> групповушки в самых невероятных ситуациях и позах
Эх, в каких только позах не приходилось их совмещать на работе... Ну кроме лолей, пока что.
>> No.43350 Reply
>>43348
> Почти одно и то же, но надо обязательно и то, и то одновременно писать(кроме случаев, но ты либо пишешь их оба, либо не один, иначе каша будет).
Это я про конструктор копии и оператор присвоения. Дескриптор другой.
>> No.43351 Reply
>>43348
> итого почти любой класс у тебя имеет как минимум три метода и почти никак не меньше.
Не. Это если сишка-с-классами, аля "C/C++". В нормальном крестоблядском коде деструкторы, конструкторы копирования и операторы присваивания в 99% случаев нинужны, ибо либо сгенерённый компилятором код делает всё как надо, либо класс вообще принципиально некопируемый, и эти операторы заныканы в приват. Реально эти операторы нужны только в низкоуровневых классах.

У меня вот на 90+ классов в проекте был всего один, где это понадобилось...

P.S. Кстати, с++11 добавляет ко всей этой вакханалии ещё и конструктор перемещения.
>> No.43352 Reply
>>43351
Ну это когда либы освоил нормально, так? А под капотом они же всё это юзают.
>> No.43353 Reply
Сегодня уже лениво улучшать свою очередь, я дописал только функции для работы с упорядоченным массивом.

https://ideone.com/QWuZzH

Хороша ли такая реализация getmin, или лучше при ее вызове запоминать нулевой элемент, сдвигать все элементы влево на один и возвращать тот, который запомнили? Первая работает за O(1), вторая, наверное, за O(n).
>> No.43354 Reply
>>43353
> Сегодня уже лениво
Ты, наверное, выпал в транс от того, что за один раз было много новой информации.
>> No.43355 Reply
>>43352
Ну да. Я же и говорю, что в низкоуровневых таки придется писать. Но если ты изучишь смартпоинтеры и контейнеры - это уже покроет почти все нужды. А всякие сокеты и файлы принципиально некопируемы, и можно смело порождать любые классы с ними от boost::noncopyable и не париться.
>> No.43356 Reply
>>43355
Но какой тогда выигрыш будет у С++ в сравнении с джавой и шарпом?
>> No.43357 Reply
>>43353
Ну ты почти запилил дек на основе массива...

Бага в том, что у тебя вставка не учитывает min_elem. И все развалится, если юзать инсерты вперемешку с гетмин, а это ведь основной юз кейс очереди с приоритетом.
>> No.43358 Reply
>>43356
Немного шустрее, немного больше контроля, нету спонтанных лагов от Гц, которые мешают в реалтайм задачах. На самом деле, с этими смартпоинтерами код иногда получается проще чем в жабе, т.к. не надо трай юзать, деструкторы сделают все сами...
>> No.43359 Reply
>>43358
А чем умные указатели выгодно отличаются от гц? Это ж тогда тот же гц получается. Или нет?
>> No.43360 Reply
>>43356
А вообще, выигрыш будет только у опытного крестовика. А у нуба запросто получится медленнее жабы, да ещё и падучее и текучее...
>> No.43361 Reply
>>43359
Не, там чуть больше контроля, чем с гц.

Вот возьмем самый простой смартпоинтер - std::unique_ptr. У него заблочено копирование, зато оверхеда от его использования... нет. Вообще нет. Он работает с той же скоростью, как и delete, расставленные вручную, но никогда не забывает его вызвать. И памяти он занимает ровно как обычный указатель.

С std::sharedptr и std::weakptr дела обстоят посложнее. У них реализован потокобезопасный подсчет ссылок. В отличие от Гц объект будет убит сразу, как только последняя ссылка умерла. Оверхед у них уже есть, и не нулевой. И Гц может их обогнать по производительности.

Ну и можно другие типы указателей сделать, в том числе gcptr с реальной сборкой мусора (правда для крестов сборщики пессимистичны и иногда не все убирают).

В общем суть в том, что можно подобрать или написать такие указатели, которые для данной ситуации будут лучше, чем более общий подход с Гц.
>> No.43362 Reply
>>43361
У Гц еще недостаток есть - он очень плохо работает, если памяти мало. Здесь же потребление и производительность получаются более менее предсказуемыми (хотя многое от аллокатора еще зависит, конечно).
>> No.43363 Reply
>>43357
> Бага в том, что у тебя вставка не учитывает min_elem
Что с ним надо делать?
>> No.43364 Reply
>>43363
Учитывать. :3

Подумай, что произойдет, если вставить 2 элемента, вынуть их гетмином, а затем вставить ещё элемент и вызвать гетмин. Вот тебе надо сделать, чтобы этот сценарий нормально работал. Ибо он часто встречается при реальном использовании очереди.
>> No.43365 Reply
http://www.intuit.ru/studies/courses/100/100/lecture/2927?page=4

По этой статье можно написать реализацию d-кучи? В ней нет алгоритмических ошибок и неправильных расчетов в функциях типа siftdown и minchild?

https://ideone.com/Zy2Xxl
>> No.43366 Reply
>>43365
Интересно, что в функции min_child2 управление никогда не передается в ветку else.

https://ideone.com/MbbvVv
>> No.43367 Reply
>>43365
На доброчане недавно уже писали d-кучу. Но я не помню, где.
>> No.43368 Reply
>>43367
Я помню. Завтра быстро найду тот тред. Меня просто очень удивляет, почему программа, написанная точно по этой статье, не работает.
>> No.43369 Reply
>>43368
Потому что ты отлаживать не умеешь. Запускай дебаггер и смотри. Ставь брейк-пойнты и пошагово иди. Или выводи просто промежуточные результаты. А ты вместо этого просто сверяешь сам код и всё.
>> No.43371 Reply
>>43365
Няш, в этой статье очень плохой код. И вообще, интуит - говнище. Поищи другой источник.
> if(i*d + 1 > n) return 0;
> int last_child = std::min((1 + i)*d - 1, n);
Вот здесь мы запросто вылетаем за пределы массива на единичку т.к. элемента a[n] не существует. Если n=3, то у нас есть только a[0], a[1] и a[2]. Обращение к a[3] - UB и кровь-кишки.
> for(int i = firstchild; i <= lastchild; i++)
Никогда не делай так. Компилятор, конечно, разберётся где какое i. А вот ты запутаешься. Назови переменную по-другому.
> if(a[i] > min_key)
Вроде минимум ищем, а сравниваем, какого то хрена, на "больше".

minchild() больше похож на правду, чем minchild2(). Но return s в нём слишком рано стоит, должен быть за циклом.

Что я могу тебе посоветовать - возьми лист бумаги, нарисуй на нём массив элементов на 10 и попробуй на нём аккуратно разобрать алгоритм и понять как он работает. Я всегда так делал в своё время, когда разбирался с новыми для меня структурами данных.

>>43368
> Меня просто очень удивляет
У меня в школе был аналогичный разрыв шаблона. Как же так, ведь учителя умные и не могут ошибаться... Как оказалось - могут. А на интуите добрая половина статей - непроверенное говно с косяками.
>> No.43373 Reply
>>43366
Это потому, что ты овердохуя элементов туда насувал, а у ideone вывод не резиновый и обрезается. У последних ячеек все дети за границей, вот для них в цикл и не входит. А ячейки с маленькими номерами в конце, и ты выхлоп о них не видишь. Запусти на 10-20 и увидишь, что ветка с else работает.
>> No.43374 Reply
>>43371
> И вообще, интуит - говнище. Поищи другой источник.
Щито поделать, но лучшего не нашел. Нарисовал 4-арное дерево в тетрадке, и, например, для узла с номером 5 родитель будет иметь номер 5/4 = 1, а для узла с номером 8 (у того же родителя) номер родителя будет 8/4 = 2, а должен быть равен 1. Что это за хуйня? Алсо, корень имеет номер 0.
>> No.43375 Reply
>>43374
Смотри:
Узел    : 0  1  2  3  4  5  6  7  8  9 10 11 12
Родитель: -  0  0  0  0  1  1  1  1  2  2  2  2
> Что это за хуйня?
Единичку отними :3

Формула для детей: firstchild = node * d + 1, lastchild = (node + 1) * d
Формула для родителя: parent = (node - 1) / d
>> No.43376 Reply
>>43375
Бля, опять подчёркивания в переменных распознались как курсив. Когда я уже привыкну к местному форматированию...
>> No.43377 Reply
На примере массива из 20 элементов видно, что функция построения кучи никак не изменяет этот массив. Ладно, с кодингом пока закончу и буду читать Седжвика.

https://ideone.com/aGgBuu

http://dobrochan.com/s/res/42967.xhtml
>> No.43379 Reply
>>43378
> Ты рандомных чисел туда набей и посмотри, так интересней будет.
Сделал вот так. Степени двойки по модулю 11. Вроде, я даже угадал, что двойка будет образующим этой группы, потому что все элементы получились разными без циклов.

Вход
1 2 4 8 5 10 9 7 3 6 1 2 4 8 5 10 9 7 3 6
Выход
1 2 4 8 5 10 9 7 3 6 1 2 4 8 5 10 9 7 3 6
>> No.43380 Reply
>>43377
Кстати, зачем ты такое зверское d взял? Там получается, что все элементы на одном родителе висят.

Вто при d=3 поинтересней: https://ideone.com/DRblj9
>> No.43381 Reply
>>43380
А кстати, в этот коде как происходит добавление нового элемента? Куда мы его вставляем - в корень или в одну из самых нижних ветвей? Судя по тому, что при вставке мы выполняем просеивание вниз, мы вставляем новый элемент в корень.
>> No.43382 Reply
>>43381
Вроде бы в самый конец вставлять надо, за последний элемент. А потом вызвать siftup(), чтобы вставленный элемент в направлении корня поднялся, пока свойство кучи не выполнится.
>> No.43383 Reply
File: седжвик.jpg
Jpg, 43.39 KB, 759×93 - Click the image to expand
edit Find source with google Find source with iqdb
седжвик.jpg
Почему здесь именно k/2, а не (k - 1)/2? Это из-за того, что корень имеет номер 1?
>> No.43384 Reply
>>43383
> Это из-за того, что корень имеет номер 1?
Да.
>> No.43385 Reply
File: седжвик.jpg
Jpg, 296.33 KB, 818×794 - Click the image to expand
edit Find source with google Find source with iqdb
седжвик.jpg
И что еще. Почему в цикле k > 1? Мы не заменяем корень, или во всей книге массивы начинаются с индекса 1? При чем тут тогда С++?
>> No.43386 Reply
>>43385
> И что еще
И вот еще. Конструктор предложений глючит и вытаскивает из памяти какие-то ненужные слова.
>> No.43387 Reply
>>43385
> Почему в цикле k > 1?
Мы не обрабатываем корень, который имеет индекс 1. У него же родителя нету, его просто не с чем будет поменять.
> начинаются с индекса 1
Если верить коду - да. Там разве в начале главы не показано, как элементы разложены по массиву?
> При чем тут тогда С++?
Я не знаю, няш. Я не читал эту книгу, к сожалению.
>> No.43388 Reply
Что я делаю не так в реализации d_ary функций?
https://ideone.com/PgFn3V
>> No.43389 Reply
>>43388
> #define d 3
Няш убери, пожалуйста, эту гадость. В плюсах нормальные константы есть. Из-за этого d потом такие баги полезут, о которых ты даже не задумывался... И если уж пишешь макросы - ты обязан называть их капсом.
> d_ary функций
Я правильно понимаю, что индексы ты делаешь с единицы, как в книжке? Тогда формулы там будут не совсем такие, а более страшные, если d > 2...
d = 2
node  : 1 2 3 4 5 6 7 8 9
parent: - 1 1 2 2 3 3 4 4

d = 3
node  : 1 2 3 4 5 6 7 8 9
parent: - 1 1 1 2 2 2 3 3

d = 4
node  : 1 2 3 4 5 6 7 8 9
parent: - 1 1 1 1 2 2 2 2
Вот как-то так, если я не затупил нигде. Проверь.

first_child = node * d + 1 - (d - 1)
last_child = node * d + 1
parent = (node + d - 2) / d

Т.е. во-первых в 29-31 строках тебе надо индекс родителя вычислить по другой формуле (положи его в переменную, кстати, чтобы не копипастить на 3 раза).

Во-вторых в 37-38 тоже формула другая (см. first_child). Ну и дальше в районе 40 у тебя по идее должен быть цикл, который ищет максимального из всех детей (d штук, если j ещё не упёрлось в n), а не только из первых двух, как сейчас. В общем-то тут логика точно такая же, как и в прошлом коде - ищем максимального ребёнка, если он есть и больше родителя - свопаем их и уходим фиксить ветку с ребёнком.
>> No.43390 Reply
>>43389
> И если уж пишешь макросы - ты обязан называть их капсом.
Формулы с большой D уродливо выглядят. Тогда лучше сделаю не макрос, а константу.
> Тогда формулы там будут не совсем такие, а более страшные, если d > 2
А как тогда изменить код, чтобы вершина была на нуле, и формулы были проще? В случае d = 2 мне понятно, почему формулы именно такие, а если d > 2, это понимание дается мне трудно. Тем более столько разных реализаций.
>> No.43391 Reply
>>43390
> Формулы с большой D уродливо выглядят. Тогда лучше сделаю не макрос, а константу.
Но их же тоже по правилам большими надо? Это же одно и то же, что и макрос.
>> No.43392 Reply
>>43390
> а константу
Доброчую. Первое правило о макросах в крестах - не пиши макросы.
> а если d > 2, это понимание дается мне трудно
Мне тоже оно с трудом далось... parent я вывел из firstchild, а firstchild из last_child, сдвинувшись влево на (d-1) элемент.
> А как тогда изменить код
Ну во-первых само собой внизу в insert и т.п. всё сделать с нуля. Во-вторых формулы поправить на те, которые мы где-то выше выводили для случая с нулём. В-третьих - один хрен сделать цикл в 40 строке, т.к. то что сейчас работает только с первыми двумя детьми. В четвёртых в fixUp поправить > 1 на > 0 или >= 1, как больше нравится. Вроде всё.

Кстати, в качестве fixdown можешь взять siftdown, который ты делал. Он вроде правильно работал в последней инкарнации.
>> No.43393 Reply
>>43391
> Но их же тоже по правилам большими надо?
В джаве разве что. В сишке и плюсах - нет.
> Это же одно и то же, что и макрос.
Не, макросы это пиздец. НИКОГДА не юзай их в крестах без причины и понимания. Они подставляются на уровне препроцессора, который вообще ничего не понимают в твоём коде. Препроцессор видит токен "d" и тупо заменяет его на "3". Во всех местах. Где надо и где не надо. И потом какая-нибудь функция в духе void test(int d, int n) после препроцессинга превратится в void test(int 3, int n) и компилятор выдаст невменяемую ошибку. Из-за этого и требование к капсу, чтобы макросы ни с чем не внезапно не пересеклись...

А константы это как переменные, только в них писать нельзя, и компилятор чуть-чуть лучше оптимизирует. Их и в неймспейсы можно загнать и в классы и куда-нибудь ещё. В общем от них нет вреда, как от макросов.

P.S. А вообще, это d лучше сделать не константой в глобалках, а передавать параметром в fixUp и fixDown (если это свободные функции). А если эти функции сделать членами класса PQ, то d тоже стоит сделать приватным членом. В этих случаях ты сможешь пользоваться кучами с разной арностью в одной проге.
>> No.43398 Reply
>>43393
> Не, макросы это пиздец. НИКОГДА не юзай их в крестах без причины и понимания
Я знаю, но константа - частный случай макроса, даже если там другой синтаксис и разбор кода лучше. Оптимизатор точно также протягивает конкретные значения на места всех констант заранее. Даже если это делает оптимизатор, а не препроцессор. Потому и капсом. Да и что в них хорошего, держать данные в коде и менять их там руками.
>> No.43399 Reply
>>43398
> константа - частный случай матроса
Няш, отсыпь мне той дури, которую ты куришь...
> да и что в них хорошего
Ну я собственно анону и подсказал, что лучше или параметр или член класса.
>> No.43400 Reply
Порешал задачи по теории групп и теперь пытаюсь исправить d-арные функции перестроения массива. Вот код:

https://ideone.com/3fbg11

С daryfixUp все понятно: мы поднимаемся вверх и при необходимости меняем потомка с родителем. А как работает функция fixDown? Я совершенно не понимаю, почему условия в ней именно такие, что содержится в j и почему в конце мы присваиваем node = j. Поэтому я не могу применить новые формулы получения индексов родителей и потомков.
>> No.43401 Reply
>>43400
Точно так же, как сифтдаун в старом коде. Ищет максимального ребенка, если он больше корня - свапает и повторяет процедуру уже для ребенка. Главная задача - восстановить свойство кучи "узел больше всех своих детей". От нее и строится этот алгоритм.

А условия там такие только из-за заточки под два ребенка. Тебе надо честный цикл от firstchild до lastchild.
>> No.43402 Reply
Я что-то запутался. Такая реализация зацикливается, хотя я старался сделать просеивание вниз так, как описано.
https://ideone.com/XXZnF8
>> No.43403 Reply
>>43402
Ты слишком много делаешь, как написано, попробуй уже понять что-нибудь.
>> No.43404 Reply
>>43403
Я и так понял, что мы проходим по дереву вниз, берем какой-то узел и первого и последнего его потомка, проходим циклом по всем этим потомкам слева направо и выбираем номер наибольшего. Если этот потомок больше своего родителя, меняем их местами. Теперь ту же операцию повторяем для узла, который был наибольшим потомком (сейчас он заменен своим родителем). Именно это я и реализовал в коде. Может быть, граничные условия не те?
>> No.43405 Reply
>>43389
Еще раз перечитал этот пост и написал такую реализацию. Она хотя бы не зацикливается, но максимальные элементы выбираются неверно.
https://ideone.com/FbsaMN
>> No.43406 Reply
>>43405
Ой, нет, вот так лучше. Такой бред на выводе был из-за того, что я в формуле для last_child написал node*d - 1 вместо node.d + 1. Теперь исправил эту опечатку, и вывод стал значительно более правильным.
https://ideone.com/RPkcDm
>> No.43407 Reply
А еще вот что непонятно. Мы же передаем в функцию node и ищем наибольшего потомка у этого нода. Далее надо обменять значения нода и этого потомка, если нужно. В коде у меня это делается так:
https://ideone.com/y6gQzi
> if(a[maxchild] > a[(maxchild + d - 2) / d])
max_child - наибольший потомок узла node
Так почему бы вместо a[(max_child + d - 2) / d] не использовать a[node]? Ведь это одно и то же. Но если так сделать, то вывод будет совсем беспорядочным.
maxchild + d - 2) / d - это родитель узла maxchild. А этот родитель - node.
>> No.43412 Reply
>>43407
Блин, няш, ну какого ж хрена ты эти формулы вставил в начале функции? У тебя же на каждой итерации while новая нода исследуется, и first_child и last_child у неё будут уже другие. Зачем там j - я вообще не понял.
> Ведь это одно и то же
Так точно. swap(a[max_child], a[node]) будет и нагляден и корректен. Т.к. мы меняем текущую ноду с её максимальным ребёнком, если он больше текущей ноды.

P.S. Такое ощущение, что ты пытаешься слепить код из кусков, как франкенштейна, а не сесть и подумать над тем, как он должен работать...
>> No.43413 Reply
>>43412
> Так точно. swap(a[max_child], a[node]) будет и нагляден и корректен. Т.к. мы меняем текущую ноду с её максимальным ребёнком, если он больше текущей ноды.
А ты попробуй запустить такой код и сделать трейс этих переменных. Будет видно, что, например, node = 2, а (maxchild + d - 2)/d = node = 1. Хотя даже если посмотреть на формулы, связывающие последнего потомка с его родителем, то видно, что они взаимно обратны.
>> No.43414 Reply
>>43413
Я даже сам это сделал (вчера), а сейчас повторил. Родитель max_child вычисляется верно почти всегда кроме нескольких случаев. И, думаю, из-за них возникают эти ошибки.
https://ideone.com/idEFMn
>> No.43416 Reply
>>43414
Дык у тебя вычисления firstchild и lastchild за циклом до сих пор валяются. На первой итерации они правильные будут, а на второй забагуют. Что мы в общем-то и видим в трейсах.
>> No.43417 Reply
>>43412
> У тебя же на каждой итерации while новая нода исследуется
Какая именно? Я представляю себе процесс обмена значениями нодов, но не могу определить, какую следующую ноду мы начинаем исследовать. Ту, которая была max_child? С нее начинаем? В таком случае в моем коде ошибка: node = j, где j - это первый потомок. Замена node = maxchild приводит к тому же неверному результату.

https://ideone.com/OLeOJf
Это нормально, что функция daryfixDown так увеличивается в объеме по сравнению с функцией для бинарного дерева?

Очень тяжелый алгоритм для первого раза. Зато теперь работа бинарной кучи полностью понятна.
>> No.43418 Reply
>>43417
max_child я скопипастил зря вместе со всем блоком. Но на результат программы это все равно не повлиялою
>> No.43419 Reply
>>43417
ideone что-то упал. Так что код пока почитать не смогу.
> Ту, которая была max_child?
Да. Она станет node (node = max_child), и будут исследоваться уже её дети. И тебе надо пересчитать firstchild и lastchild уже для новой ноды. А j вообще выкинь нахер.
> увеличивается в объеме
Ну да. Ты же переходишь от частного случая к общему.
>> No.43420 Reply
>>43419
> Она станет node (node = max_child)
Я так уже делал. После этого изменения программа зацикливается. Поэтому у меня с этим кодом столько проблем - вроде, делаю как надо, а получаются ошибки, поэтому сомневаюсь, что делаю как надо.

Весь код: http://pastebin.com/0b9mgwky
Функция: http://pastebin.com/Demk1Uy3
>> No.43421 Reply
>>43420
> Строки 20 и 21 в функции
Няш, ну ты что творишь то? Эти int minchild и int maxchild помрут на первой же закрывающей скобке. И на следующей итерации опять будут юзаться значения внешних. Убери из этих строк тип int, чтобы там остались только присваивания.

В свапе поменяй страшное выражение на node, node = j поменяй на node = maxchild. j вообще выкинь нахер.
>> No.43422 Reply
>>43421
Тьфу, firstchild и lastchild.
>> No.43423 Reply
>>43421
Ой черт, и правда ведь. Я объявил эти переменные в блоке, и поэтому они локальные для данного блока, и за его пределами программа о них не знает. Теперь функция такая, но вывод все еще неправильный.
Я тут отвлекаюсь, так что мог не все исправить. Но вроде бы исправил все.

http://pastebin.com/GYwddenb
>> No.43424 Reply
>>43423
Покажи состояния кучи после вставки элементов и после каждого гетмакса. Посмотрим, чего не так работает.
>> No.43425 Reply
>>43424
Почему-то в гетмаксе ничего не выводится.

https://ideone.com/BRympO
http://pastebin.com/Z3Qxe0Ke

0

1 0

2 0 1

3 0 1 2

4 3 1 2 0

5 4 1 2 0 3

6 5 1 2 0 3 4

7 5 6 2 0 3 4 1

8 5 7 2 0 3 4 1 6

9 5 8 2 0 3 4 1 6 7
7 6 9 4 3 8 2 1 5 0
>> No.43426 Reply
>>43425
Ну insert нормально работает. Это хорошо.
> Почему-то
Потому что кто-то за return'ом пытается выводить.
>> No.43427 Reply
>>43425
Ой. Это я торопился и сделал вывод после return.
https://ideone.com/fETSpW
>> No.43428 Reply
>>43427
В общем баги следующие:
1) Цикл от firstchild до lastchild иногда захватывает лишние элементы, лежащие дальше n. Можно пофиксить добавив в цикл && i <= n.
2) Цикл не прерывается если все дети меньше текущей ноды. Надо добавить else break к if(a[max_child] > a[node]).
>> No.43429 Reply
>>43428
Офигенно. Как красиво получилось. А не знаешь, для чего нужны сортирующие сети и где они применяются? Не слышал ни об одном языке, где бы они использовались для сортировки.
>> No.43430 Reply
Алсо, это же вроде ты говорил, что на крестах пишешь под ардуино? Сколько они стоят и что на них можно запрограммировать? Люблю чистый си, сейчас решаю задачи из КиР и хочу обмазаться чем-нибудь суровым и интересным.
>> No.43431 Reply
File: КиР.jpg
Jpg, 238.68 KB, 959×714 - Click the image to expand
edit Find source with google Find source with iqdb
КиР.jpg
Интересно, что произошло в функции str_cat, отчего случилось кровь-кишки и выход в чужую память? Мы установили указатель на конец строки, где расположен символ \0, переписали его символом из начала строки и далее многократно переписываем i-тый символ строки ее j-тым символом. Т.к. строка у меня имеет максимальную длину 15 символов, а i и j бесконечно увеличиваются, то мы залезли куда-то еще. А когда вышли за пределы типа переменных i, j, то произошел краш? В чем точно была причина краша?
>> No.43432 Reply
>>43431
Ты зачем-то копируешь символы из s в s (хотя хотел из t?). Это по определению будет бесконечным процессом. А крашнулось потому, что вышел за пределы выделенного куска памяти и словил page fault.
>> No.43433 Reply
>>43432
Да, опечатка, а потом мне стало интересно, что произошло.
>> No.43434 Reply
>>43433
Если посмотреть с точки зрения стандарта - то как только ты обратился к s[15] произошло UB (undefined behavior, неопределённое поведение). Оно может закончиться чем угодно, в том числе и крашем (но обычно вылезают более весёлые баги, от отладки которых волосы встают дыбом). Так что нужно очень внимательно относиться к длине буферов.

Если интересно, что происходит на более низком уровне - могу рассказать. Только не факт, что всё будет понятно с первого раза...
>> No.43435 Reply
>>43434
> Если интересно, что происходит на более низком уровне - могу рассказать. Только не факт, что всё будет понятно с первого раза...
Давай, расскажи. Я раньше много читал про низкоуровневое программирование и организацию памяти, но уже далеко не все помню. Может быть, сейчас кое-что вспомнится.
>> No.43436 Reply
>>43435
В общем, у современных процессоров есть MMU (memory management unit), который отображает виртуальные адреса (те, которые ты видишь, когда выводишь указатели) в физические (те, которые попадают на чипы памяти и некоторые другие железки). Отображает он их не байтами, а страничками. На x86 эти странички обычно по 4 килобайта. У страничек есть права доступа, показывающие что можно делать с ними - читать, писать, исполнять код. Если MMU не нашёл куда отображается страничка или соотв. действие запрещено (например запись в страничку с кодом), он генерирует прерывание page fault и обработчик в ядре операционки принимает решение, что делать дальше - подгрузить страничку с диска (к примеру, из свопа или экзешника) или вбросить в процесс сигнал (в линухе) или SEH исключение (в винде), которые убьют процесс, если он не повесил свой обработчик. Это ты и видишь как краш.

В итоге виртуальное адресное пространство получается не сплошное, а совсем дырявое: какая-то часть страничек занята самой экзешкой и библиотеками, какая-то - кучей, какая-то - стеками потоков. Остальные странички не используются, и любое обращение к ним приводит к крашу. Запись в странички с кодом тоже приводит к крашу. Исполнение кода из страничек с данными или стека - тоже, но только если операционка и проц достаточно современные.

Вот твой код, в процессе копирования, добрался до края последней странички стека или кучи (смотря где лежала s), попытался туда записать байт, вызвал page fault и был за это убит.
>> No.43438 Reply
Запостил сначала в треде для новичков, но он в бампе оказался :/ Так что спрошу здесь.
Решил начать изучать C++ с нуля. Как я понимаю, лучше начинать изучение языка с последней версии, а именно с 14ой. Существуют ли по этой версии достойные учебники?
>> No.43439 Reply
>>43438
Начни с 11й, няш. 14я ещё не совсем актуальна, имхо.
>> No.43440 Reply
>>43438
Мертвого страуса почитай.
>> No.43441 Reply
>>43440
Только новую книгу, а не старую. "Принципы и практика использования крестов", кажется.
>> No.43442 Reply
>>43439
> Начни с 11й, няш.
Ок, какую книгу посоветуешь?
>>43440
>>43441
> Мертвого страуса почитай.
> "Принципы и практика использования крестов"
Спасибо.
>> No.43449 Reply
И таки что же почитать нубу? Начинал в школе паскаль учить
>> No.43450 Reply
>>43449
Ты не особенный. То же, что и все.
>> No.43459 Reply
Решаю задачу из K&R.
> Write a function setbits(x,p,n,y) that returns x with the n bits that begin at position p set to the rightmost n bits of y, leaving the other bits unchanged.
Кажется, я не выполнил условие "leaving the other bits unchanged", но сейчас не это важно.
С какой цифры нумеруются биты в слове? С нуля или единицы? Это важно для выбора второго аргумента функции getbits: n или n-1.
Почему мы сдвигаем на p+1-n битов? Почему именно такая формула? Я не очень хорошо это понимаю. Здесь p - позиция, а почему от нее надо отнять n и прибавить 1?
>> No.43460 Reply
>> No.43461 Reply
>>43459
> С какой цифры нумеруются биты в слове
С какой договоритесь, тащемта. Но обычно младший бит считается нулевым.
> Почему мы сдвигаем на p+1-n битов?
Тебе лучше знать. ТЫ же этот код писал. Или опять откуда-то бездумно спиздил и пытаешься подогнать? Скорее всего, из-за того, что кто-то превратно понял условие, и отсчитал n бит в сторону младшего. Т.е. что-то в духе .XXX.... для p = 6, n = 3 (сдвиг как раз на 4 == 6 + 1 - 3.

Я бы как-то так наговнокодил:
int getbits(int x, int p, int n) {
    int mask = ~((~0) << n);
    return (x >> p) & mask;
}

int setbits(int x, int p, int n, int y) {
    int mask = (~((~0) << n)) << p;
    return x & (~mask) | (y << p) & mask;
}
>> No.43462 Reply
>>43461
> Или опять откуда-то бездумно спиздил и пытаешься подогнать?
Так это пример из книги. Зачем писать свой костыль, если можно использовать пример?
>> No.43463 Reply
>>43462
> можно использовать пример
Т.е. getbits() и setbits() дословно скопированы с книги?
>> No.43464 Reply
>>43462
Надо читать пример, разбираться и писать самому, а не переписывать его.
>> No.43465 Reply
>>43463
getbits из книги, setbits моя.
>> No.43466 Reply
>>43464
Мне в getbits понятно все кроме того, почему сдвиг вычисляется как p+1-n.
>> No.43467 Reply
>>43466
> почему сдвиг вычисляется как p+1-n
Няш, ну ты текст перед примерами читаешь же?

*As an illustration of some of the bit operators, consider the function getbits(x,p,n) that returns the (right adjusted)
n-bit field of x that begins at position p. We assume that bit position 0 is at the right end and that n and p are sensible
positive values. For example, getbits(x,4,3) returns the three bits in positions 4, 3 and 2, right-adjusted.*

Т.е. они действительно отсчитывают n бит вправо, в сторону младших. Старшим битом ответа будет бит p, а младшим - p - (n-1). Из-за этого и получаем сдвиг на p - (n-1). Нарисуй на картинке их, если на словах не понятно. Для примера из книги: "...432.."

P.S. Всю жизнь биты в слайсах считались в сторону старших. Чем K&R упарывались, когда писали эту главу - я х.з.
>> No.43468 Reply
>>43467
> We assume that bit position 0 is at the right end and that n and p are sensible
positive values
Ясно, вот в чем дело. В русской версии все эти детали проигнорированы. Зато ее читать немного быстрее, а тексты условий я все равно смотрю на английском, если в книге на русском у них перевод надмозга.
>> No.43469 Reply
>>43468
> В русской версии все эти детали проигнорированы.
Вот именно поэтому я последние лет 10 стараюсь всё техническое читать на инглише в оригинале...
>> No.43470 Reply
>>43461
> Я бы как-то так наговнокодил:
Чья программа неправильно работает?
https://ideone.com/ASHnca
>> No.43471 Reply
>>43470
Если по тому условию - то моя неправильная. У меня биты вырезаются как это принято везде, а не как в той задаче. Т.е. 4 бита начиная с четвертого это 0xF0, а не 0x0F. И я не понимаю, какого хрена k&r сделали вверх-ногами...
>> No.43472 Reply
File: u8.jpeg
Jpeg, 35.59 KB, 450×360 - Click the image to expand
edit Find source with google Find source with iqdb
u8.jpeg
>>43471
> И я не понимаю, какого хрена k&r сделали вверх-ногами...
Нет это были не мы.
>> No.43473 Reply
>>43472
А кто?
>> No.43474 Reply
>>43473
Сначала DEC перемешали байты в числах, потом Intel.
А в IBM так и просто неновидели AT&T лютой бешеной неновистью:
http://www.os2museum.com/wp/fantasy-history-at-ars-technica/comment-pa[...]68925
Из-за Фортрана-66.
>> No.43475 Reply
>>43474
Да не, я о том, что они p посчитали справа налево, а n - слева направо. Обычно всё-таки оба числа в одну сторону идут. Ну. По крайней мере, я ни разу не видел такой нумерации как в этом getbits(). Это всё равно что из строки "джигурда" взять 3 символа начиная с четвертого и получить "игу" вместо "урд". Очень странная логика, имхо. Я её не понимаю.
>> No.43476 Reply
>>43475
Там номер задаётся как название бита, походу, «нулевой бит — крайний справа, первый бит — первый справа» и т.д.
http://stackoverflow.com/questions/197614/
>> No.43477 Reply
>>43476
Няши, я прекрасно понимаю, что и как там считается. Я прекрасно понимаю битовые операции. Я прекрасно понимаю, что нулевой бит справа (в привычной записи, когда младший справа). Я просто не понимаю, в чем смысл такого описания слайса. И никогда на практике (а я постоянно работаю с сишкой) я не встречал подобной схемы. Всегда слайс описывался как младший бит и количество за ним, или как младший и старший. Но я ни разу не видел старший бит + длина в сторону младшего. Хоть убейте.
>> No.43478 Reply
>>43476
Если не понятно - еще раз расшифрую. 4 бита, начиная с восьмого это 0x00000f00 но никак не 0x000001e0, как выдаст их getbits(). Я не вижу никаких плюсов в их подходе. И рационального объяснения найти не могу.
>> No.43479 Reply
File: getbits.png
Png, 3.79 KB, 520×246 - Click the image to expand
edit Find source with google Find source with iqdb
getbits.png
>>43477
> Но я ни разу не видел старший бит + длина в сторону младшего.
Я всё-таки думаю, что это название бита + скоковзять.
«Уж как назвали», в общем.
>> No.43480 Reply
>>43479
Что за редактор?
>> No.43481 Reply
>> No.43482 Reply
>>43479
Почему это "сколько взять", раз уж длина тебе не нравится, считается в сторону, противоположную той, в которую мы биты считали? Если тебя попросят назвать три символа строки, начиная с четвертого, ты возьмешь 4, 5 и 6 или 2, 3 и 4? Так почему с битами не так? Чем они так разительно отличаются?
>> No.43484 Reply
> Write a function rightrot(x,n) that returns the value of the integer x rotated to the right by n bit positions.
Анон, не решай полностью эту задачу, а то мне станет скучно ее делать. Но помощь нужна, потому что хочу идти дальше, а тормозить на этом задании надоело. Дай намек, как ее делать? Надо как-то сделать так, чтобы бит, который выдвигается справа, вдвигался слева.
>> No.43485 Reply
>>43484
Написал такой вариант.
https://ideone.com/KCHdYw
Как будто работает, но есть недостатки:
Слева вдвигается лишний ноль здесь
0000 1111 1111 0011
0000 0111 1111 1001
И функция работает только с 16-битными интами, которые я не определил как 16-битные.
>> No.43486 Reply
>>43485
Сделал еще читерскую реализацию rightrot.
https://ideone.com/8DIMki
>> No.43487 Reply
>>43484
> Дай намек, как ее делать?
Классическая реализация вращения: бьёшь на две части; сдвигаешь одну влево, а другую вправо; склеиваешь.
>> No.43488 Reply
File: cplusplus-developer.jpg
Jpg, 77.89 KB, 1600×1106 - Click the image to expand
edit Find source with google Find source with iqdb
cplusplus-developer.jpg
Предлагаю оппик для следующего треда.
>> No.43489 Reply
>>43488
Боже, какая гениальная конструкция.
>> No.43490 Reply
>>43488
Соус, суть?
>> No.43491 Reply
Насоветуйте статей по ассемблеру. Не мануалы для бородатых профессоров, а статьи для людей, написанные так, чтобы можно было извлекать из них пользу, а не продираться через кучу лишней информации. Для примера приведу статьи Криса Касперски.
>> No.43494 Reply
>>43491
> статьи для людей
> ассемблер
Няш, ассемблеры, сами по себе, очень тупые. Список команд да ограничения на их аргументы. Там самое сложное - с архитектурой соотв. проца или контроллера разобраться. А остальное уже дело техники. Поэтому и книжки да статьи будут либо как введение в архитектуру, либо справочники на 1.5к страниц для бородатых дядек (Intel architecture в трех томах).

Почитай книжку Юрова. Мне в своё время очень понравилась.
>> No.43496 Reply
File: Yoba.jpg
Jpg, 158.96 KB, 639×479 - Click the image to expand
edit Find source with google Find source with iqdb
Yoba.jpg
>>43490
Суть проста. Средний «проект» на плюсах — нагромождение костылей, разбирать которые нанимают вчерашних студентов, обещая им нехилый карьерный рост и прокачку знаний. Проекты попильные, т.е. в стол пишутся, а как бабло распределили, так кодеров — пинком под зад.
Ах, да, и правоверные линуксоиды тут как тут: «всё есть объект, стандарт ++11 моделирует Окружающий Мир»... но это уже несколько другой диагноз, ага.
>> No.43497 Reply
>>43496
> всё есть объект
> C++
У тебя жир протёк.
>> No.43498 Reply
> Благодаря свойствам двоичной системы счисления выражение x &= (x-1) удаляет самый правый единичный бит в переменной x. Воспользуйтесь этим фактом для того, чтобы написать более быстрый вариант функции bitcount.
Вот мой вариант. https://ideone.com/BzfN7d
Выдает результат на единицу меньше, можно поправить, добавив в конце b++, но, по-моему, это будет слишком грубо и костыльно. Я решаю эту задачу вообще не так, как задумано?

Будет ли решение https://ideone.com/Sz2m9O неправильным?
>> No.43505 Reply
>>43498
> Выдает результат на единицу меньше
Потому что ты сначала бит выкалываешь, а потом проверяешь на 0 и увеличиваешь b. В итоге последний бит ты выкалываешь, но не учитываешь. Выбрось if и всё заработает.
> Будет ли решение <...> неправильным
Конечно будет. Запусти bitcount(0).
>> No.43512 Reply
File: 599716131.png
Png, 77.78 KB, 317×372 - Click the image to expand
edit Find source with google Find source with iqdb
599716131.png
Новый тред: >>43511
>> No.43681 Reply
>>43491
цикл статей с сайта wasm.ru
там тебе и вирусология, и написание кода под определенные процессоры и введение в крэкинг и т.д.
wasm.ru выбираешь архив статей
>> No.43893 Reply
File: 143860258622720.png
Png, 1558.10 KB, 766×1084 - Click the image to expand
edit Find source with google Find source with iqdb
143860258622720.png
Перетаскиваю из /b/.
Привет, доброчаньки. Кто кодит, подскажите среду разработки на C++ под Windows. Главное — как можно проще управление, я собираюсь на планшет ставить.
>> No.43897 Reply
>>43893
Если проекты уровня helloworld, то geany или подобный переблокнот\недо-иде, наверное.
Осло, на личном опыте - на виртуальной клавиатуре планшета вим очень удобен, так что если за иде не гонишься, то очень збс.


Password:

[ /tv/ /rf/ /vg/ /a/ /b/ /u/ /bo/ /fur/ /to/ /dt/ /cp/ /oe/ /bg/ /ve/ /r/ /mad/ /d/ /mu/ /cr/ /di/ /sw/ /hr/ /wh/ /lor/ /s/ /hau/ /slow/ /gf/ /vn/ /w/ /ma/ /azu/ /wn/ ] [ Main | Settings | Bookmarks | Music Player ]