[ /b/ /u/ /rf/ /dt/ /vg/ /r/ /cr/ /lor/ /mu/ /oe/ /s/ /w/ /hr/ ] [ /a/ /ma/ /sw/ /hau/ /azu/ ] [ /tv/ /cp/ /gf/ /bo/ /di/ /vn/ /ve/ /wh/ /fur/ /to/ /bg/ /wn/ /slow/ /mad/ ] [ /d/ /news/ ] [ Главная | Настройки | Закладки | Плеер ]

Ответ в тред 39226. [Назад]
 [ Скрыть форму ]
Имя
Не поднимать тред 
Тема
Сообщение
Капча Капча
Пароль
Файл
Вернуться к
  • Публикация сообщения означает согласие с условиями предоставления сервиса
  • В сообщениях можно использовать разметку wakabamark
  • На данной доске отображаются исходные имена файлов!
  • Разрешенные типы файлов: vector, code, image, video, music, flash, text, archive, pdf
  • Тред перестает подниматься после 500 сообщений.
  • Треды с числом ответов более 100 не могут быть удалены.
  • Старые треды перемещаются в архив после 40 страницы.

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

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

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

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

Ну да one и newone разные. Но лист то тот же.
> > Проходы хай-ордер функциями по циклической структуре - это скорее хак, чем реальный солюшен. Без трай-эксепшена из такого цикла не выйти. Но если вопрос конкретно про тюринг-полноту, то while так написать получится.
Если дать изменять элемент то думаю и без эксепшенов обойтись можно. Но это сорт оф извращение.
>> No.39415 Ответ
Кресты надо мной издеваются хнык-хнык. Есть такой код в 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 Ответ
>>39415
Таак, я разобрался с этой проблемой, но не разобрался с причиной. Чем отличаются template<typename T, typename U> и template<typename T> template<typename U>? Почему это даёт разные результаты? Причём это только в этой функции, когда я перегружаю операторы, скажем, +=, то в foо.h у меня эти template раздельные (один у определения класса, другой у прототипа функции), а в реализации я пишу template<typename T, typename U> и всё работает. А эта функция не работала, особая магия.
>> No.39503 Ответ
>>39375
> Но лист то тот же.
С чего бы он был "тот же"? Он в один момент равняется one, в другой - newone. list* - это не структура, это всего-лишь указатель.
>> No.39727 Ответ
Пишу на куте. Пока делал хелловорлд с интерфейсами, всё было ок. Заебенил охуенный шаблонный класс с частичной специализацией и всё поломалось. Выдаёт какую-то хуиту почти на каждую строчку вместо ошибок. Так и знал, что нельзя доверять этим мутным расширениям языка.
>> No.39728 Ответ
>>39727
> Заебенил охуенный шаблонный класс с частичной специализацией и всё поломалось. Выдаёт какую-то хуиту почти на каждую строчку вместо ошибок.
Теперь тебе остаётся только внимательно перечитывать каждую строчку своего класса и искать, где именно накосячил. Наслаждайся своим C++! Только здесь компилятор может под невнятным предлогом свалить проверку валидности грамматики на программиста.
>> No.39729 Ответ
>>39728
Там нормально все. Это куте выпендривается. Ошибки в крестовом синтаксисе компилятор нормально показывает, я их поправил, и он высрал какую-то чушь с рандомными буквами вместо названий переменных и функций.
>> No.39730 Ответ
>>39729
> высрал какую-то чушь с рандомными буквами вместо названий переменных и функций
Уверен, что это был компилятор, а не линкер? Если это линкер, то ты нарвался ещё на один известный отсос плюсов - линковка шаблонных классов, если: а) в твоей программе класс используется более чем с одним набором параметров (например, MyClass<int> и MyClass<bool>), и б) реализация шаблонных методов лежит не в *.h, а в *.cpp. Наименьший костыль для разрешения этой ситуации - это перенос реализации шаблонных методов в заголовочник.
>> No.39735 Ответ
>>39730
Таки да, линковка. Вообще проблема оказалась в том, что библиотека для работы с сетью линкуется отдельно, но шаблон я тоже вынес на всякий случай, так что не знаю, влиял ли он.
Ну и в итоге апогей - Error: Template classes not supported by Q_OBJECT
Больше копипаста богу копипасты. Ну либо выносить это всё в динамику, что идиотизм как по мне.
>> No.39739 Ответ
Увидел сегодня на ith????ns.ru очередной высер. Суть примерно такова: в древние лохматые времена программисты писали код для БК-0010, им приходилось экономить каждый байт и каждый такт, поэтому даже имена переменных были односимвольными. Теперь же, во времена мощных, ёмких и быстрых компьютеров программисты распоясались настолько, что в коде для 8-разрядных контроллеров с ничтожно малым количеством ПЗУ и ОЗУ используют - о ужас! - переменные с именами из 4 символов, потому что совсем разучились экономить, черти.
Поясни, анон, как длина имён переменных сказывается на размере готового бинарника? Разве компилятор не должен заменить имена переменных на их адреса в оперативе? Как вообще автор дошёл до таких рассуждений?
>> No.39740 Ответ
Файл: wtf-jackie-chan.jpeg
Jpeg, 29.03 KB, 630×400 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
wtf-jackie-chan.jpeg
>>39739
Картинка для привлечения внимания отклеилась. Хотя кому какая разница.
>> No.39741 Ответ
>>39739
Байка - пиздеж. Мы с посонами в школе писале на бейсике под эти машинки, никакой блядской экономии памяти не применяли.
>> No.39742 Ответ
>>39739
Автор - хуй и наркоман, очевидно же. Естественно имя переменной ни на что не влияет - это просто обозначение участка памяти, к которому надо обращаться и он будет записан простым числом в итоговом коде. Осло, на асме вообще работают только с фиксированным числом регистров, всё ручками, никаких переменных.
>> No.39743 Ответ
>>39739
Хуита ололо-кодера. Можно экономить разве что для коньпеляции на самой восьмибитной машинке, там всего 64к адресуемо и ещё часть отъедает пзу/экран и прочие дела. Но опять же можно побить на части и не парить мозг.
>> No.39748 Ответ
>>39739
Нет, ну в ДРЕВНИЕ ВРЕМЕНА экономия буковок имела место быть, даже в программировании серьезных машин на производстве. Просто потому, что были ограничения весьма суровые на это дело. Но в наш-то век это уже давно не актуально.
>> No.39750 Ответ
>>39739
> Поясни, анон, как длина имён переменных сказывается на размере готового бинарника?
Никак, разумеется, какая-то байка. В настолько лохматые переменных скорее всего вообще не было, были конкретные числовые адреса конкретных ячеек. Когда вместо адреса идёт переменная с именем, то уже никак. В бинарнике снова идёт указание на конкретные числовые адреса ячеек уже. Они, правда, не так чтобы прям совсем конкретные сейчас на многозадачных компах, операционка даёт некую абстракцию со своим диапазоном адресов для каждого бинарника, то есть отображает адреса бинарника на реальные по-своему.
>> No.39756 Ответ
>>39750
> В бинарнике
> лохматые времена
> повсеместный бейсик
>> No.39757 Ответ
>>39756
Троль в другом месте или говори нормально.
>> No.39758 Ответ
>>39757
Был бейсик, он интерпретатор. Софт получался как бы и в исходниках, но делались всякие интересные защиты от LIST, например. Однобуквенные переменные использовались, насколько я знаю, из-за скорости поиска в таблице символов. Были еще лимиты на максимальную длину имени.
Что касается второй части истории, то я сравнительно недавно (2009) видел программу для военных (DOS, C++), написанную в каком-то НИИ, там были переменные типа a12, где буква - назначение, а цифры - номер. Номера расшифровывались на бумаге, причин выяснить не удалось, кроме того, что автор программы - женщина.
>> No.39762 Ответ
>>39758
> он интерпретатор
Вопрос был задан о бинарниках и я забыл упомянуть, что имел в виду случай компилируемый в бинарник программ. Интерпретатор бейсика был популярен? Правда?
>> No.39763 Ответ
>>39762
Интерпретатор бейсика был сорт оф ОС в очень многих восьмибитных машинках. Ну и в целом он создавался для обучения, так что интерпретатор предпочтительнее, очевидно. Это потом, когда уже выучили, решили конпелять для прикладного применения, лол.
мимо
>> No.39764 Ответ
>>39763
> для обучения
Я думал, мы говорим о промышленной практике. При чём тут обучение? И вообще, зачем что-то экономить для обучения.
>> No.39765 Ответ
>>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 Ответ
>>39765
> Ты прав, но не все так просто. Когда компилятор создает объектные файлы, и в них обязательно есть таблица символов, в которой в числе прочего лежат имена внешних переменных и функций (extern).
То есть имена всех функций и глобальных переменных, видимых извне (т.е. объявленные в заголовочнике), попадают в бинарник как есть?
> Прямо сказывается, если используется динамическая линковка.
Окей, но в истории упоминается микроконтроллер, управляющее термостатом. Может быть, в коде для МК действительно возможна динамическая линковка, но лично я об этом не слышал. Да и смысл в динамической линковке при гарвардской архитектуре и памяти программ, в общем случае доступной только для чтения.
> А еще есть отладочная информация, кстати.
Но в память микроконтроллера она не попадёт же (по крайней мере, на AVR не попадает), и объём использованной памяти программ и оперативы останется прежним.
>>39739-кун
>> No.39773 Ответ
>>39770
> То есть имена всех функций и глобальных переменных, видимых извне (т.е. объявленные в заголовочнике), попадают в бинарник как есть?
Имена попадают в объектник, в статическую либу. В бинарник в идеале попадают только символы, необходимые для динамической линковки и отладочные символы.
> в истории упоминается микроконтроллер, управляющее термостатом
Недостаточно кофейной гущи, чтобы понять, что там за переменные в термостате. Точно не реальные имена переменных - они становятся адресами, ты прав. Но могу предположить, что автор либо о тексте, отображаемом на ЖК-индикаторе при настройке (типа TEMP:52°C), либо об именах параметров в конфиге, который загружается внутрь устройства. По идее, конфиг обычно преобразуется из текста в блоб перед загрузкой, но, может быть, у автора конфиг грузится текстом и парсится прямо на термостате? Тогда там мог бы быть какой-нибудь массив пар "имя_параметра_в_конфиге", смещение_или_адрес_переменной_в_памяти для парсера. В любом случае, это вряд ли можно назвать именами переменных.
>> No.39825 Ответ
Попал в руки файлик .c с экзешником. Нужно изменить там одну строчку так, чтобы переписанный кот исполнялся. Как это сделать быстро и без двухдневных ритуальных танцев?
>> No.39833 Ответ
почему многие любят анальные игры с чернокожим си когда есть светлый си шарп?
>> No.39834 Ответ
>>39833
смищно
>> No.39835 Ответ
>>39833
Няшным Си редко пользуются джля игор. Обычно для высокопроизводительных тридэ игор пользуют кресты. По крайней мере для движка точно.
> светлый си шарп
Лучше уж JVM тогда.

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

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

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

>>39889
Да клиенты тоже работают как http сервера, не вижу в этом чего-то плохого, например я могу посмотреть настройки, результаты профилирования, логи и некоторые другие вещи просто сходив по нужному урлу.
> > готов поспорить, у тебя вместо неё JSON
угадал json и boost::json для серелизации. MarshalByRefObject лол, как там с NAT-ом уже все пофиксили? И что восстановление связи тоже теперь беспроблемное?
> > По настраиваемости конечного продукта без перекомпиляции приложения он натянет твой велосипед и порвёт его в клочья.
Без перекомпиляции? Покажи мне как ты добавишь новую команду(в твоих терминах вызов удаленной процедуры) в протокол без перекомпиляции? А самое интересное временные затраты на добавление протягивание связей туда сюда.
Вернись в реальный мир простой текстовый протокол проще для понимания, проще для изменения и проще для поддержки. Кстати с WCF я смогу подружить программку на питоне, а на bash? Понимаешь если мы будем общаться не по HTTP логика взаимодействия все равно поменяется и код придется править даже с WCF. В реальном мире стоимость поддержки моего велосипеда меньше а скорость написания выше. Конечно он проще только внезапно мало кому приходит в голову идея менять протокол в уже написанной и отлаженной клиент серверной системе. Гуй другое дело, там важна возможность кастомизации.
> > Про HTML для гуя даже комментировать не буду - из присущего WPF compile-time, так горячо любимого и ценимого всеми плюсоёбами, ты зачем-то перенёс всё построение, валидацию и логику в рантайм.
И что? Зато теперь я могу хоть с телефона рулить хоть с планшета хоть с пекарни. И да с wpf ты точно также валидируешь ввод. Только теперь у меня надежно гуй отвязан от логики. Ах да я могу на лету поменять весь гуй.
И даже школьник может построить свою версию внешнего вида.
>> No.39957 Ответ
Файл: 1384285507760.jpg
Jpg, 59.45 KB, 600×600 - Нажмите на картинку для увеличения
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 Ответ
>>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 Ответ
>>39959
Ну вот и зачем нужно было всё так усложнять?..Какую задачу решает этот костыль?
>> No.40070 Ответ
>>40069
Какую задачу может решать код с классами А, B, C и D? Или что ты имел в виду?
>> No.40071 Ответ
>>40070
>>40069
Это же пример, ему не обязательно решать какую-то задачу. Какую задачу решает хэллоуворлд? - Правильно, это просто пример.
>> No.40072 Ответ
>>40070
>>40071
Конечно же, я имел в виду виртуальные базовые классы, а не абстрактный код. Хотя ответ, наверное, будет очевиден: чтобы не плодить клонов объектов. Но это и так можно не делать, без введения костыля в язык.
Вот, если бы класс C ещё наследовался от другого виртуального класса, скажем, Z, то классу D пришлось бы вызывать конструкторы и для класса А, и для класса Z. А он может и не иметь для него нужных данных, хотя те, кто будут использовать только класс C, будут их иметь.
>> No.40082 Ответ
>>40072
> Конечно же, я имел в виду виртуальные базовые классы
> Но это и так можно не делать, без введения костыля в язык.
Каким образом не поведаешь? Можно на абстрактном или реальном примере (типа basic_iostream).
>> No.40083 Ответ
>>40082
Конечно. Тебе слово агрегирование о чём-нибудь говорит? Будет немного печально, если ты попросишь меня привести пример, как это сделать с помощью агрегирования.
Может, ты объяснишь мне, как избежать проблем с использованием классов, в примере, который я описал? Только не говори, что так напишет только даун и вообще проблемы в архитектуре классов, а не в языке.
>> No.40084 Ответ
>>40072
Я так понимаю, ты не слышал про проблему ромба. Вот уж в виртуальном наследовании очевидного совсем ничего нет, не зря его и множественное наследование вообще так часто ругают. Виртуальное наследование решает проблему ромба, когда ты отнаследовался от двух классов одновременно, которые имеют общего предка. Если ты не включишь виртуальное, то в объекте будет содержатся "дед" объекта дважды, по одной линии и по другой. Это значит, что и значения там разные будут.

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

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

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

>>40089
> http://ideone.com/fork/6U9lDy
Вот так бы сразу... Код великолепный просто! Мало того, что надо писать синглтон-прокладку SubA на каждый такой класс с кучей геттеров\сеттеров (ибо до полей A не добраться), дык еще B и C требуют модификации. new А не освободил, а если бы попробовал (без подсчета ссылок) - деструктор SubA будет вызван дважды со всеми выползающими. D неприводим к A, A* SubA::m_a = NULL; - лол. Полный абзац, ты сделал почти то же самое, что делает за тебя компилятор при виртуальном наследовании, только на порядок хуже. Поздравляю :3
>> No.40097 Ответ
>>40096
Хотя какое в жопу "почти", тут все экземпляры D разделят твой сраный синглтон между собой... Это даже близко не решение.
>> No.40100 Ответ
Файл: 1243769791689.jpg
Jpg, 94.61 KB, 745×554
Ваши настройки цензуры запрещают этот файл.
unrated
Котаны-котаны. Есть одна прога на крестах, консольная. В этой проге есть чтение из файла и из консоли. С чтением из файла здорово. В памяти у строки адекватный, читаемый вид. Беда начинается, когда я читаю из консоли — вместо кириллицы выходят какие-то странные символы. Что при выводе, что в памяти. Не знаю, могла ли на это повлиять "setlocale", или ещё что-нибудь. Ввод-вывод потоковый, все дела. Пробовал использовать wstring и соответствующие потоки, но что-то не катит. Каким костылём образом заставить консольный ввод принимать кириллицу?
>> No.40101 Ответ
>>40100
> Каким образом заставить консольный ввод принимать кириллицу?
В голых крестах вроде нет уникода, он считывает только ansi. Я помню мне давно еще в паскале пришось решать эту проблему ручным считыванием кодов символов и переводом их в кириллические.
>> No.40104 Ответ
>>40101
> нет уникода
> > Пробовал использовать wstring и соответствующие потоки, но что-то не катит.
wstring и wchar_t хранят юникодовые символы. И, что примечательно, их применение ничем мне не помогло.
> считывает только ansi
Так я ему уже и setlocale(LC_ALL,"Russian") прописал, и пробовал трюки с cin.imbue вытворять, что, скорее всего, было бесполезно. Есть предположение, что консольный ввод обрабатывается по cp866, хотя вывод организован в win1251. Проверю и отпишусь.
>> No.40105 Ответ
Так оно и есть. Когда прописал wcin.imbue(locale("RussianRussia.866")) оно реально было кириллицей. Осталось переписать методы под работу с wchart. Костыли-костылики...
>>40104-кун
>> No.40106 Ответ
>>40104
> Есть предположение, что консольный ввод обрабатывается по cp866, хотя вывод организован в win1251.
Именно так и есть. И это проблема не крестов, а сраной виндовой консоли.
>> No.40107 Ответ
>>40106
P.S. Только там и ввод и вывод в 866.
>> No.40109 Ответ
>>40107
После setlocale вывод в win1251, я гарантирую это. Потому как исходник в ней, выводимые данные в ней, а кракозябр нет.
>> No.40130 Ответ
>>40091
Есть ещё различные промежуточные варианты: миксины, трейты, бихейвиоры. Они всё же позволяют множественно наследовать реализацию, но всё равно не позволяют наследовать и переопределять, что попало.
>> No.40147 Ответ
Файл: o291028.jpg
Jpg, 324.02 KB, 1440×900 - Нажмите на картинку для увеличения
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 Ответ
>>40147
> в стандартной библиотеке
Нету.

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

>> No.40256 Ответ
>>40252
Ну что тебе не так?
>> No.40274 Ответ
>>40256
Все так. Если будет бесплатная версия после релиза, все остальные иде станут не нужны, а их авторы сопьются с горя.
>> No.40288 Ответ
>>40274
Сомневаюсь, но иде не плоха, на первый взгляд, даже захотел попробовать.
>> No.40329 Ответ
Файл: cygwin-logo.png
Png, 34.38 KB, 341×422 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
cygwin-logo.png
>> No.40373 Ответ
>>40274
> Если будет бесплатная версия после релиза
И сразу соснул.
Стоить будет как AppCode, а именно сотню зелени за персональную лицензию. Для трудоустроенного профессионала - копейки, но падаваны и прочие интересующиеся соснули.
>> No.40374 Ответ
>>40373
Ватевер. Идею до ввода бесплатной версии элементарно было спиратить, сейчас не знаю мне стыдно пиратить в таких условиях. Студию тоже многие пиратскую используют из-за плагинов.
>> No.40375 Ответ
Файл: like-a-boss.jpg
Jpg, 52.16 KB, 500×361 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
like-a-boss.jpg
>>40374
А я лицензионным вимом пользуюсь.
>> No.40376 Ответ
>>40375
Подразумевая, что бывает пиратский вим.
>> No.40380 Ответ
>>40376
Будто нельзя нарушить VIM LICENSE.
>> No.40382 Ответ
>>40380
Нельзя.
>> No.40417 Ответ
Файл: pic.jpg
Jpg, 379.49 KB, 986×1500 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
pic.jpg
>>39226
Какие комментарии принято писать при определении функций класса? Просто поделить на public/private methods?
>> No.40420 Ответ
>>40417
> при определении
Не нужно. Ну либо копировать из объявления, чтоб не скакать по файлам.
Приватные методы стоит описывать, если есть вероятность передачи этого кода другим людям, публичные всегда. Описать что делает и что ожидает в качестве параметров. Посмотри описание к любому апи же. Разные системы документации умеют автоматически собирать комментарии над методами и классами, от этого бывает специфический синтаксис.
>> No.40421 Ответ
>>40420
> Приватные методы стоит описывать, если есть вероятность передачи этого кода другим людям
И если есть шанс, что к этому коду вернешься через полгода.
>> No.40440 Ответ
Аноны, подкиньте пожалуйста годных книг/серий туториалов по DirectX/OpenGL с C++. Желательно, чтобы они были сравнительно новые, чтоб все работало с последним VS без проблем.
>> No.40505 Ответ
>>40375
Да у вас же ДЕТИ УГАНДЫ
>> No.40506 Ответ
>>40374
EAP License. Хоть и есть idea купленная, но почти всегда на EAP сижу.
>> No.40688 Ответ
Файл: H7Ri8MGbtOk.jpg
Jpg, 26.71 KB, 604×569 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
H7Ri8MGbtOk.jpg
Поясните за регулярные выражения в С++.
Не могу нагуглить внятного разъеснения.
В учебнике всё идёт в ключе С#, но смысла браться за него не вижу.
С синтаксисом выражений ,вроде бы, проблем не видно.
Непонятно, как работать с библиотекой.
Попробовал, элементарно, запустить кусок кода из интернета:
http://msdn.microsoft.com/ru-ru/library/t8t0w9hz.aspx
Но он не идёт.
Работаю в VS 2012.
>> No.40690 Ответ
>>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 Ответ
>>40688
> В учебнике всё идёт в ключе С#, но смысла браться за него не вижу.
И зря не видишь. Судя по тенденциям и скорости развития C++, этот язык всего через полвека будет практически полной копией C# 4.0. Да, я опять толсто сравниваю C++ и другие языки и намекаю на безнадёжное отставание C++.
>> No.40693 Ответ
>>40691
Не волнуйся ты просто не понимаешь плюсов крестов с опытом придет.
>> No.40694 Ответ
>>40691
Единственные альтернативы С++ - это С и раст, который далёк от какой-либо реальной возможности юзать его. Все остальные собирают мусор, смысл сравнивать.
>> No.40701 Ответ
>>40690
А для чего вообще нужен .NET?
Из Википедии не понял
>> No.40703 Ответ
Вроде бы, разобрался с 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 Ответ
>>40693
"У C++ по сравнению с C несколько плюсов. Точнее, два".
>> No.40706 Ответ
>>40704
А чем С лучше С++?
Ничего не утверждаю, просто, интересуюсь.
>> No.40707 Ответ
>>40706
Меньше оверхед и бинари компактнее, теоретически.
>> No.40711 Ответ
>>40706
Я не говоил, что они лучше, я сказал, что это единственные, кто в той же нише, что и он. Всё, больше серьёзных и популярных ныне или грозящих ими стать в будущем языков с неуправляемым кодом без сборки мусора нету.
>> No.40714 Ответ
>>40711
Обжект поцкаль?
>> No.40717 Ответ
>>40714
Или кобол.
> серьёзных и популярных ныне или грозящих ими стать в будущем
>> No.40718 Ответ
>>40707
Объекты в стеке, а не в хипе, практически.

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

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

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

Остаётся только вопрос. После сравнения нужно получить номер символа, которым является найденный знак (если он есть).
>> No.40837 Ответ
>>40836
Собственно, как его можно получить мосле сравнения?
>> No.40838 Ответ
>>40837
> после
>> No.40853 Ответ
>>40836
>>40837
Лол, я наконец понял, что ты имел в виду. Вообще, это неправильный подход.
Надо забирать один элемент за раз и потом решать, что с ним делать, а не искать многоэлементные конструкции.
>> No.40854 Ответ
>>40853
Теперь я тебя не понял.
>> No.40855 Ответ
>>40853
Имеешь в виду польскую нотацию (или как она называется).
>> No.40856 Ответ
>>40853
Если что, в задании сказано "построить дерево с помощью регулярного выражения".
>> No.40944 Ответ
Файл: -.jpg
Jpg, 14.25 KB, 315×223 - Нажмите на картинку для увеличения
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 Ответ
>>40944
Никак. У дабла 52 бита. Разбивай число на части.
>> No.40947 Ответ
Файл: wallpaper-370710.jpg
Jpg, 338.35 KB, 1920×1200
edit Find source with google Find source with iqdb
wallpaper-370710.jpg
Файл: -.png
Png, 87.03 KB, 749×286
edit Find source with google Find source with iqdb
-.png

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

мимо js-кун
>> No.40977 Ответ
>>40957
Ну непредсказуемым не значит же, что рандомным. Если сложить много чисел в разном порядке, то у ответ разный может быть.
>> No.40987 Ответ
>>40977
15-16 чисел (если дабл) будут предсказуемыми, это и есть стандарт.
>> No.40988 Ответ
>>40987
Хотя у некоторых иногда и бывают свои заморочки на каких нибудь 0.4999999999...
http://ideone.com/XWI7xn
>> No.40990 Ответ
Файл: 59175ee2cf40.jpg
Jpg, 149.53 KB, 1200×900 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
59175ee2cf40.jpg
>>40977
> Если сложить много чисел в разном порядке, то у ответ разный может быть.
И результат чотко оговаривается стандартом. Такой чоткости любой гопник позавидует. А ещё там даются рекомендации по тому, как должны себя вести стандартные математические функции.
>>40987
>>40988
Фишка в том, что предсказуемы ВСЕ цыферки. Иначе зачем стандарт?
>> No.41003 Ответ
>>40990
Вы уходите от задач.
>> No.41067 Ответ
Файл: bremz.jpg
Jpg, 36.58 KB, 450×337 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
bremz.jpg
>>40988
А мы храним дробные числа в виде "X/Y" и у нас всё хорошо.
>> No.41068 Ответ
>>41067
И корни тоже извлекаем в таком виде, умник?
>> No.41213 Ответ
>>41068
А корень приближаем с заданной точностью ¯\(ツ)
>> No.41214 Ответ
>>40944
Ох уж эти школьники, в условии указана относительная точность в 1e-9. И только если правильный ответ меньше 1, то нужно выводить с абсолютной точностью. Короче, нужно правильно вывести первые 9 значащих цифр, ты можешь написать своё решение и сдать его с cout.precision(20) и всё.
кажется, я немного слоу
>> No.41325 Ответ
Файл: MEzWatqsxNE.jpg
Jpg, 44.85 KB, 465×604 - Нажмите на картинку для увеличения
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 Ответ
>>41325
И можно ли как-то конвертировать выражение?
>> No.41328 Ответ
>> No.41333 Ответ
>>41328
Что?
Мне надо это выражение загнать в regex для С++.
>> No.41339 Ответ
>>41325
Понятия не имею, насколько M$VC 2012 поддерживает с++11 (в том же gcc, емнип, регулярки более-менее заработали только с 4.9+), и не уверен, правильно ли я понял задачу, но как-то так:

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

"\\([^()]+\\)|(([a-z]|\\*)+)"
>> No.41401 Ответ
>>41355
А теперь заработало.
Спасибо тебе большое.
>> No.41402 Ответ
>>41355
Я вдруг осознал, что мне нужно убрать только содержимое скобок (вместе с самими скобками).
Т.е., по твоему тесту: http://pastebin.com/pRjKbKS4
Никак не пойму, как в этом выражении обозначены скобки.
>> No.41403 Ответ
>>41355
Может быть, подскажешь, где можно почитать хорошо разобранные материалы по регулярным выражениям для С++ regex?
>> No.41404 Ответ
>>41355
http://dobrochan.com/src/png/1407/regexp.png
Эта картинка подходит?
>> No.41405 Ответ
>>41402
Ю> Никак не пойму, как в этом выражении обозначены скобки.
\\( и \\)
>> No.41416 Ответ
>>41405
То есть, скобки и всё, что между ними.
>> No.41462 Ответ
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 Ответ
>>41462
> во второй строчке ошибка?
Ошибка в том, что статью писал долбоёб, не умеющий в указатели. Не читай её, поищи какую-нибудь другую.

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

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

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

Можно ли как-то прикрутить vkapi в с++?
Если да, то как?
>> No.41557 Ответ
>>41547
А что такое vkapi?
>> No.41558 Ответ
>> No.41559 Ответ
>>41558
Зачем запускать жаваскриптовый движок? Дерни урл через буст азио. Ну или ищи билиотеку для с++ которая будет дергать урлы за тебя как в js.
>> No.41618 Ответ
>>41540
Лучше visual studio только текстовый редактор, настроенный под себя.
>> No.41631 Ответ
>>41559
То есть, дергать урлы через либы или руцями - вариант для мазохистов велосипедников. И парсить что эти урлы выдают?
>> No.41637 Ответ
>>39226
Посоветуйте динозавру что-нить из книг по чистому си (с2011) -- интересуют отличия в синтаксисе от версии с89. Заранее спс.
>> No.41666 Ответ
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 Ответ
>>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 Ответ
>>41666
Алсо, по-моему, у тебя проблемы с использованием массива s - во многих, если не во всех, случаях, его нужно передавать в функции по указателю, а не по значению. Впрочем, я бог управляемых языков и поэтому могу не разбираться во всяких байтоёбских штуках.
>> No.41673 Ответ
>>41670
странное поведение.
>>41670
имя массива - указатель
>> No.41676 Ответ
>>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 Ответ
Файл: 1.png
Png, 62.09 KB, 516×399 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
1.png
>> No.41678 Ответ
>> No.41679 Ответ
>>41678
если бы fgets так же работала, проблемы бы не возникло у меня
>> No.41680 Ответ
>>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 Ответ
>>41680
По чистому Си никто ничего не знает, что ли? >>41637
>> No.41689 Ответ
>>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 Ответ
Файл: говно.png
Png, 18.10 KB, 647×304 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
говно.png
Ребята, кто-нибудь может объяснить маминому недопрограммисту, почему мой код http://pastebin.com/MGb4E24Y так странно себя ведет?
VS2008.
>> No.41753 Ответ
>>41752
У тебя '\r' записывается в Edges и только потом происходит выход из цикла.
>> No.41754 Ответ
>>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 Ответ
>>41754
И, раз уж подключаешь stdafx.h, то, в теории, надо все системные #include перетащить в него. Иначе затея с precompiled headers не сработает, и #include "stdafx.h" можно с чистой совестью выкинуть.

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

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

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

Про новый цикл совершенно ничего не знаю. Да и полезно это, понять итераторы. Пока они для меня как обычные счетчики, а это плохо.
>> No.41773 Ответ
>>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 Ответ
>>41771
> Пока они для меня как обычные счетчики, а это плохо.
А оно так и есть. Это просто чуть более абстрактная фигня, чем указатели. Если указатель всегда указывал на какую-то область памяти, ++ его двигал на sizeof(T) байт вперёд и т.п., то у итератора этих ограничений нет, элементы, на которые он указывает, могут не то что не по порядку лежать, они могут вообще не существовать и генериться на лету. Набор операций, в принципе, тот же самый, что и указателей (но обычно урезан, см. ниже).

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

Вот в общем-то и всё.
>> No.41775 Ответ
>>41774
P.S. Ну и да, есть особые итераторы, не привязанные к контейнерам - istreamiterator, insertiterator и т.п.
>> No.41777 Ответ
>>41764
> Вкусовщина.
Вкусовщина говоришь?
1.cpp:5:11: error: ‘::main’ must return ‘int’
>> No.41778 Ответ
Файл: Capture.PNG
Png, 55.85 KB, 882×540 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
Capture.PNG
>> No.41779 Ответ
>>41778
Это кому из нас цитата? Если мне (>>41777), то я с тобой согласен - гарантированно работают только int main() и int main(int argc, char *argv[]), а все остальные, включая void main(), зависят от компилятора и лучше их не юзать. И никакой вкусовщины тут нет.
>> No.41780 Ответ
>>41773
А у меня и сделано классом. GetGraph (на самом деле он назывался просто Graph) был неработающим конструктором. Но мне привычнее процедурный стиль, поэтому я вырезал данный метод класса и переписал как подпрограмму — надеялся, это поможет найти ошибки. Не помогло, пришлось спрашивать.
Вот за это
> void ShowGraph(const vector<vector<char>> & Graph)
замечание спасибо. Знал же, что без "&" подпрограмма копирует граф в новую переменную. А о том, что это может занять кучу места и времени, не подумал.
>> No.41781 Ответ
>>41779
> кому
Всем. Никто не читает Стандарт, несмотря на то, что Стандарт - единственное, во что вообще можно верить в этой жизни.
>> No.41782 Ответ
>>41778
main(c, v)
char **v;
{/*...*/}
>> No.41783 Ответ
>>41782
Сишник, ты чего тут забыл?
>> No.42285 Ответ
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 Ответ
>>42285
Разви sizeof(int) не должно быть один раз?
>> No.42289 Ответ
>>41781
Но ведь стандарт
1) Могут не реализовать
2) Реализовать больше чем стандарт
3) Баги вообще чихали на него
Потому никто и не читает, ибо это ж Филькина грамота.
>> No.42290 Ответ
>>42289
Разве те, кто поступает подобным бесстыдным образом, не являются хуями?

мимокрокодил
>> No.42291 Ответ
>>42290
Ну да, но мир не идеален. В С++ хоть со стандартами получе чем с SQL и вебом.
>> No.42335 Ответ
лол
>> No.42340 Ответ
>>42291
А что не так со стандартами SQL и веба?
>> No.42351 Ответ
>>42340
В вебе действуют "де-факто" стандарты. То есть можно напидорасить нестандартного странного синтаксиса html, чтобы поддерживать какие-нибудь нужные штуки в одном браузере (последний известный мне пример - адаптивность через meta content="width=device-width", первый - подключение css через link, href), этот синтаксис начинают поддерживать другие браузеры, потом его стандартизируют. Приходится помнить, как реализовывать какие-то конкретные вещи. Стандартизация всегда отстаёт и приходится возиться с де-факто велосипедами и трендами.
>> No.42354 Ответ
>>42351
> странного синтаксиса html
То, что ты перечисляешь это не синтаксис html.
> первый - подключение css через link, href
Не знаю, как там в твоём, но в моём стандате есть: https://html.spec.whatwg.org/multipage/semantics.html#the-link-element
> Стандартизация всегда отстаёт и приходится возиться с де-факто велосипедами и трендами.
Так и должно быть. Придумываем костыль, запиливаем его, тестим, запиливаем в стандарт.
>> No.42355 Ответ
Файл: 14203999371010.jpg
Jpg, 16.75 KB, 251×249 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
14203999371010.jpg
>>42285
Сначала выделить под *p, потом в цикле для p[i].
Освобождать память, соответственно, в обратном порядке - сначала для каждой линии чисел p[i], потом для верхнего массива.
>> No.42356 Ответ
>>42355
**p, *p[i] Всё время забыват про разметку.
>> No.42357 Ответ
>>42354
> То, что ты перечисляешь это не синтаксис html.
Тэг meta - часть синтаксиса html. Тэг link - часть синтаксиса html. Атрибуты content, href - часть синтаксиса html. Я где-то ошибаюсь?
> Не знаю, как там в твоём, но в моём стандате есть
Ну конечно есть. Сколько ему лет уже. А когда-то он был нестандартным.
>> No.42358 Ответ
Рано пост отправил.
>>42354
> Так и должно быть. Придумываем костыль, запиливаем его, тестим, запиливаем в стандарт.
Окей, тот же link.
В стандарте есть тэг style. Совместно с src он мог бы быть использован для загрузки стилей. Но сейчас для этого используется link href="url", который делает неочевидно что. Приходится лезть и читать и каждый раз, возвращаясь к вёрстке после перерыва в пару месяцев, спотыкаться об это.
С meta[name=viewport] абсолютно та же самая история. Вместо meta width='device-width' сделана какая-то ерунда.
Стандартизация опирается на реализацию в браузерах, которая может выглядеть как угодно убого. И это раздражает.
>> No.42365 Ответ
>>42340
Каждый вендор делает только то, что он сам захочет. Половина html5 не реализовано. Вообще не один стандарт html никто не реализовал полность. Ослики с мобилками делают, что могут, без стандартов, как сами хотят. SQL куча стандартов, реализованы только несколько старых и то не полностью. В мускуле, вон, даже фул джойна нет.
>> No.42382 Ответ
>>39226
Я почитал этот блог с картинки, и как для незнакомого с плюсами человека, он выглядит как сборник страшилок. Почему вы еще не перешли на какой-нибудь гоу?
>> No.42383 Ответ
>>42382
> гоу
Прекрати уже форсить это мертворожденное говно.
>> No.42384 Ответ
>>42383
Я вообще мимоскриптовик, и на полном серьезе спрашиваю, почему вместо использования более современных и продуманных инструментов, люди кушают кактус. Гоу просто первый в голову приходит. Почему он мертворожденный?
>> No.42385 Ответ
Файл: concurrency.svg
Svg, 50.08 KB, 2×1
concurrency.svg
Файл: funfast.svg
Svg, 43.10 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 Ответ
Файл: 06.jpg
Jpg, 25.44 KB, 510×352 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
06.jpg
>>42385
> В основном для прикладных.
Ясно. Пойду пока на полу полежу.
Когда в Go появятся исключения, зови.
>> No.42388 Ответ
>>42386
Чем panic/defer/recovery не исключения?
>> No.42389 Ответ
>>42385
> Go хороший ЯП для некоторого круга задач. В основном для прикладных.
Прости, но NO GENERICS делает его непригодным задач с алгоритмами сложнее, чем сортировка массива.
>> No.42390 Ответ
>>42389
Как ты собрался делать сортировку массива без дженериков/шаблонов/ватевер?
>> No.42391 Ответ
>>42389
Ну давай пример такой задачи.
>>42390
https://golang.org/pkg/sort/
>> No.42392 Ответ
>>42391
> The sort is not guaranteed to be stable.
Знаешь как это называется? Подсказка: FAIL
Не говоря уже о том, что оно не может сортировать по разным параметрам и требует интоподобности от структуры. С IntSlice и FloatSlice вообще проиграл. Современный язык, ага. Проблемы си почти 50-летней давности решить не могут. Пиздуйте-ка в свою резервацию со своим убожеством.
>> No.42393 Ответ
Файл: 845.gif
Gif, 602.54 KB, 250×150
edit Find source with google Find source with iqdb
845.gif
Файл: Dobro_bleat.jpg
Jpg, 80.19 KB, 600×500
edit Find source with google Find source with iqdb
Dobro_bleat.jpg
Файл: 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 Ответ
>>42391
> Ну давай пример такой задачи.
Очень просто: двоичная куча. inb4: цирк с interface{}.
>> No.42395 Ответ
>> No.42396 Ответ
>>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 Ответ
Файл: shot0352.png
Png, 2709.11 KB, 1280×720
edit Find source with google Find source with iqdb
shot0352.png
Файл: 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 Ответ
>>42396
> Нужно понимать, что параметрический полиморфизм — одна из наиболее важных вещей в языке со статической типизацией, и ad-hoc полиморфизм её никак не заменяет.
Если я правильно тебя понел, то как раз таки ad-hoc в golang нет в пользу утиной типизации.
>> No.42399 Ответ
>>42396
Ты не преувеличваешь? Это же натуральный пиздец хуже жавы. Зачем вообще совмещать dynamic dispatch и типизации. Есть какая-нибудь статья, где объясняются вот эти вот tradeoffы?
>> No.42400 Ответ
Файл: shot0475.png
Png, 2709.11 KB, 1280×720 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
shot0475.png
>>42399
Он преувеличивает.
> Зачем вообще совмещать dynamic dispatch и типизации.
Чтоб не было попаболи при программинге. Заимствуем все плюшки одновременно.
> Есть какая-нибудь статья, где объясняются вот эти вот tradeoffы?
http://golang.org/doc/faq
>> No.42401 Ответ
>>42400
Потыкал документацию. Я правильно понял, что у вас нету акторов и какая-то хуита вместо них для асинхронщины\concurrency?
>> No.42402 Ответ
>>42401
> что у вас нету акторов
Нет. У нас же не Erlang какой нибудь.
> какая-то хуита вместо них для асинхронщины\concurrency
Зелёные потоки и каналы. Можно любой функции сказать пойти нахуй отложить свои дела на завтра. При этом эти функции будут общаться посредством трубочек для сока каналов. Разумеется обычные методы синхронизации никто не отменял и их можно использовать вместо или вместе с каналами. В зависимости от ситуации.
>> No.42407 Ответ
>>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 Ответ
>>42398
> Если я правильно тебя понел, то как раз таки ad-hoc в golang нет в пользу утиной типизации.
Это скорее «интерфейс считается реализованным автоматически, если тип имеет соответствующие методы». Но при этом проверка на то, что тип реализует интерфейс, происходит во время компиляции.
>> No.42411 Ответ
>>42409
> Но при этом проверка на то, что тип реализует интерфейс, происходит во время компиляции.
Тащемто можно и в рантайме проверить. Правда это сильное колдунство в 99% случаев никому не нужно.
>> No.42413 Ответ
>>42411
Можно, но это уже будет динамическая типизация.
>> No.42424 Ответ
Аноны, подскажите хорошую книгу/гайд по быстрому изучению особенностей актуального C++ (какой там сейчас стандарт? C++14?)

Программировал на плюсах несколько лет назад, сейчас возникла необходимость пособеседоваться на позицию плюсовика, в компании используются по возможности новые фичи компилятора (т.е. C++0x нужен, C++14 - скорее нужен, чем нет)
>> No.42429 Ответ
>>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 Ответ
>>42429

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

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

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

Сейчас-то, я думаю, можно смело даже initialization lists использовать и прочие плюшки.
>> No.42596 Ответ
Файл: programming_by_fredzz-d78224u.jpg
Jpg, 119.93 KB, 1024×683 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
programming_by_fredzz-d78224u.jpg
Анон, а посоветуй какую-нибудь интересную книгу по C++. Собственно плюсы я знаю на уровне среднего ОО-языка, но, чувствую, многое упускаю. Собственно, было бы интересно узнать о плюсоспецифичных тонкостях - в общих чертах узнать о сборке программ и роли в этом деле препроцессора/компилятора/линкера, о манипуляциях с объектами (ссылки/указатели, всякие умные указатели, константные ссылки, касты из одного в другое...), о возможностях новых стандартов, ну ты понимаешь. Будет очень здорово, если авторы обойдутся без долгих вступлений "что такое классы", "из чего состоит программа" и "как работать в Visual Studio" - всё это я и так уже узнал за несколько лет с C#.
>> No.42609 Ответ
Файл: x_eafb710c.jpg
Jpg, 64.70 KB, 500×409 - Нажмите на картинку для увеличения
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 Ответ
А почему я хочу написать цикл, for (x=4;x<14;x++) допустим, а у меня есть много переменных, которые зависят от икс и они не меняются, после первого прохода цикла?
>> No.42829 Ответ
>>42828
Переменные в программировании ни от чего не зависят... Это же не функции. Они меняются только тогда, когда ты напрямую им что-то присвоишь. Это же не тетрадный листок... Тебе нужно использовать функции, чтобы выражать зависимости от х. Либо городить вокруг х объект и приделывать ему методы(до этого тебе ещё далеко).
>> No.42830 Ответ
>>42829
Ну предположим я написал в цикле y=x+2. Он это значение 6 запомнил и дальше не менял почему то
>> No.42831 Ответ
>>42830
напиши пример. Сам цикл.
>> No.42832 Ответ
>>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 Ответ
>>42832
х и х1 - это разные переменные.
>> No.42834 Ответ
>>42833
Я потерял строчку int x1=30*x+420;
>> No.42835 Ответ
>>42834
В смысле потерял, когда сюда копировал.
>> No.42836 Ответ
>>42835
Молодец. Теперь я буду догадываться, где была эта строчка. Твои переменные не так меняются из-за того, что у тебя перед глазами туман вместо программы. Запусти дебагер.
>> No.42839 Ответ
Файл: Подпрограмма.PNG
Png, 37.79 KB, 1029×506 - Нажмите на картинку для увеличения
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 Ответ
>>42839
minnotnull работает верно, я гарантирую.
10 (размер массива) там просто так. Должно быть 4, конечно.
>> No.42841 Ответ
>>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 Ответ
>>42841
> Что заставляет людей до сих пор использовать шрифт Courier New?
Он охуенен, например.
> Consolas
Нашел, блеать, что советовать. Пиздецки высокое ужатое говно, в капсе буквы натурально сливаются друг с другом.
>> No.42843 Ответ
>>42842
> Он охуенен, например.
Очевидно, ты не знаешь разницы между словами "охуенен" и "хуёвый". Зачем в нём такие конские засечки? Что мешало нормально нарисовать символы Il1, а ещё O0? Почему штрихи такие тонкие?
> Нашел, блеать, что советовать.
Некоторым нравится, например. Убунту-моно тоже не идеален из-за символов M и W, но у него почему-то тоже много фанатов. Лично я пользуюсь DejaVu Sans Mono - вот он охуенен, в отличие от Courier New.
>> No.42844 Ответ
>>42843
Очевидно, что ты петросян и лицемер.
> Зачем в нём такие конские засечки?
> Что мешало нормально нарисовать символы Il1
Так ты определись, есть в нем засечки или нет. Потому что без засечек I и l действительно не отличаются.
> O0
У меня они почему-то различаются. А вот делать их абсолютно одинаковыми, но засунуть внутрь нолика точку, которая выглядит как битый пиксель или пылинка на экране - ни разу не круто.
> Некоторым нравится, например.
И при этом ты наезжаешь на любителей курьера. Браво!
> вот он охуенен
Лолнет:3
>> No.42845 Ответ
>>42843
Лиспачую DejaVu Sans Mono.
>> No.42847 Ответ
Файл: такие-дела.PNG
Png, 40.30 KB, 986×439 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
такие-дела.PNG
>>42841
Спасибо, няша. Такая дурацкая ошибка.
> Почему ты не пользуешься пошаговой отладкой?
Пользовался. Просто я всратый: нашел строку ошибки, а суть не понял.
> Что заставляет людей до сих пор использовать шрифт Courier New?
Привычка. Кстати, когда хотел стать маминым хакиром (а мамины хакиры, как известно, обязаны пользоваться Линуксом), очень долго не мог привыкнуть к тамошнему шрифту по умолчанию. Он ужасно убог.

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

мимо
>> No.42867 Ответ
>>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 Ответ
>> No.42869 Ответ
>> No.42870 Ответ
>>42869
Так делают грязные маргиналы-извращенцы, которые из-за своих грязных пристрастий не могут ни дня прожить без грязного содомирования байтов, указателей и хендлов. Серьёзно, какой упорок будет в XXI веке работать с чистым Win32 API, если есть прекрасное окружение, которое далеко-далеко скрывает винапи, попутно избавляя программиста от кучи проблем?
>> No.42871 Ответ
Файл: n3s1t.jpg
Jpg, 7.28 KB, 360×202 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
n3s1t.jpg
>>42870
А если приложение изначально написано под *nix и пользует escape-последовательности? И его надо запустить под cmd.exe с цветами, очисткой экрана/строки и прочего.
>> No.42872 Ответ
>>42871
> А если приложение изначально написано под *nix и пользует escape-последовательности?
Значит, перед переносом этого приложения на винду нужно запилить между твоим кодом и консолью человечную прослойку с человечным API, а не пытаться дословно адаптировать Win32 API к линуксовым вызовам и потом возиться с escape-последовательностями по всему UI.

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

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

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

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

Когда имеет смысл юзать "умные" указатели, а когда можно не париться и юзать обычный?
>> No.43175 Ответ
>>43169
Давно уже кроссплатформенный, с 2004 года.
>> No.43177 Ответ
>>43175
В теории. А на практике опыт было то?
>> No.43178 Ответ
>>43174
Да я больше шутканул. В с++ ты можешь только с pointing reference играться и со своим алцгеймером, что ты ничего не забыл. А в джаве можно просто переключиться в режим mark and swap или в generational GC, более того GC щас запускается concurrently. Но я пошел еще дальше: я пишу на скале на кластере, акку конфигурю правильно, в итоге у меня скорость чуть похуже, чем cpython c гну-параллел, зато кода в сотни раз меньше. А когда дотти выйдет, так я вообще летать буду. Единственное, что нет параллельной линейной алгебры (но ее и на плюсах никогда не было) и выхода на gpu кластеры - так что плюсы пока забывать окончательно не буду.
>> No.43179 Ответ
>>43178
Уааааааау, сугой, десу нэ!
>> No.43185 Ответ
Файл: Netduino-plus2.jpg
Jpg, 148.47 KB, 700×525 - Нажмите на картинку для увеличения
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 Ответ
>>43177
Кстати, анон, встречный вопрос к тебе: у тебя был опыт разработки кроссплатформенных приложений на C++? Ты познал радости #ifdef-driven development, неопределённых поведений и зоопарка с оптимизациями?
>> No.43187 Ответ
>>43185
В то, что можно на C# прогать контроллеры я верю куда охотнее чем в то, что Моно можно использовать. Не верю и всё тут. И вообще, кроссплатформенность - городская легенда
>> No.43197 Ответ
>>43187
> кроссплатформенность - городская легенда
Щито? А как же qt?
>> No.43203 Ответ
>>43186
> неопределённых поведений и зоопарка с оптимизациями
Просто не выябывайся пиши говно, вызывающее неопределённое поведение. И не будет никаких проблем с оптимизациями (кроме редких случаев, когда в компиляторе баг). Это не так сложно, как кажется.

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

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

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

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

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

1) У меня версия 5.4.2. Как отключить в ней автодобавление закрывающих скобок?
2) Старая версия мне не нравилась тем, что она ставила отступы в несколько табов, и это никак не настраивалось. Все говорят, что это был такой баг. Но в той версии было няшное маленькое окошко Compile Progress, а в 5.4.2 здоровенное ебаное окно. В какой версии табы ставятся нормальные, и при этом окошко прогресса няшное и маленькое?
>> No.43293 Ответ
Анон, как сделать объявление очереди по приоритетам в хедере, используя template? Компилятор ругается на такое использование темплейта и не хочет компилировать код.
>> No.43294 Ответ
>>43292
> У меня версия 5.4.2.
Нихуюшеньки старьё. Актуальная версия вроде 5.11 -> http://sourceforge.net/projects/orwelldevcpp/files/
>> No.43295 Ответ
Пишу реализацию очереди с приоритетами.
Хедер: 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 Ответ
>>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 Ответ
>>43296
Я пока нигде ничего не подключал, не компилируются даже хедер с исходником (из-за реализации последней функции getmax).
> Enjoy your C++! б ты пользовался нормальным языком с нормальными дженериками, проблем бы не было.
Жава еще большее говно. Жаль, что я плохо знаю чистый си для нормальной реалиазции пирамиды, иначе я бы не ебался с говном++.
>> No.43298 Ответ
>>43297
Item PQ<class Item>::getmax(){
	return new Item();
}
1. Не уверен, что использование одного и того же имени для обозначения шаблонного класса и класса-реализации - это правильная мысль. Даже если компилятор поймёт, какой из Item ты имеешь в виду в каждом конкретном случае, не факт, что программисты, которым достанется твой код, не переебут тебя лопатой поперёк лица за такое.
2. Насколько я помню б-гомерзкие плюсы, new Item() в них возвращает Item* (указатель), а твой метод возвращает Item (экземпляр по значению). Отсюда и возникает твоя ошибка.

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

https://ideone.com/WsTBW1

Почему?

В решетке очень не нравится слово using. В #include, #define, #pragma душа и дух олдскула, а С# просто решили сделать не таким как все без необходимости на то
>> No.43300 Ответ
>>43299
Тьфу, блять, я же должен сравнивать ключи, а не данные. Уже засыпаю.
>> No.43301 Ответ
>>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 Ответ
>>43301
С# мне нравится только тем, что в нем есть поддержка больших чисел из коробки. Моя специальность связана с криптографией и алгебраическим/алгебро-геометрическим кодированием информации и сжатием, а там везде используются огромные числа. В С++ для этого надо подключать сторонние либы. Алсо, на каком языке проще найти работу - С++ или С#?
>> No.43303 Ответ
>>43302
> на каком языке проще найти работу - С++ или С#?
Сложно сказать, не зная твоего уровня, опыта и города. Открой авито или хедхантер, поищи вакансии в своём городе и сравни их количество и зарплату. Учти также, что у C++ выше порог вхождения, поэтому у плюсоводских вакансий может быть выше зарплата, но выше и требования к соискателям.
Алсо, я уже около 5 лет работаю решёткопрограммистом. В моём городе вакансий по C# полно, поэтому не могу сказать, что я страдал от их отсутствия. И да, я знаю плюсы на уровне типового ОО-языка и применяю их в наколенных ардуиноподелках, но я пока не готов связывать с ними свою профессиональную деятельность. Уж лучше простой, логичный и однозначный C#, чем это мозговыносящее инопланетное говнище.
>> No.43304 Ответ
Удивительно, компилятор не заметил ошибку i+ вместо i++ в цикле и скомпилировал программу. А ошибка проявилась только когда я добавил вызов getmax().
>> No.43305 Ответ
>> No.43306 Ответ
>>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 Ответ
>>43298
> Item PQ<class Item>::getmax(){
> return new Item();
> }
Нет, так тоже не работает.
>> No.43308 Ответ
А что посоветуешь выбрать между явой и C#?
>> No.43309 Ответ
> C++
> обсуждают жаву с шарпом
>> No.43310 Ответ
>>43309
Ну там все ушли на сосач или вернулись на нульчан, а здесь сидят 2.5 анона, которые обсуждают одно и то же.
С++ для тех, кто заканчивает карьеру программиста. Не для начинающих.
>> No.43311 Ответ
>>43308
Между Scala и F#
*fix
>> No.43312 Ответ
>>43311
Как хочется дрочерам, чтобы их языки хоть кто-то ценил. Но никому не интересны кучка ущербных.
>> No.43313 Ответ
Зачем вы навязываете свою борщевую маргинальщину, да еще кто во что горазд? Есть ведь хачкель, вот и обмазывайтесь им вместе с книжкой Алуффи. Зачем лезть в говно типа скалы и F#? Мужики на грантах повысирают подобных языков еще вагон и маленькую тележку.
>> No.43314 Ответ
>>43307
Конечно, не работает, это я твой код скопипастил. Поменяй тип, который возвращает функция, с Item на Item*, тогда заработает.
>> No.43315 Ответ
>>43310
> С++ для тех, кто заканчивает карьеру программиста. Не для начинающих.
Ну или для тех, кто учится, тоже хорошо, нет? Чтобы понимать, что там внутри.
Кроме того, многие же идут в С++ после каких-то крутых вузов, кафедр и т.п. Всякие там ололо-научные штуки. Я таких знаю. А ты знаешь людей, которые именно из бизнесовых крудов на яве и шарпе перешли в кресты?
>>43313
Ну Скала - это не чистый ФП язык. Там можно писать по-обычному сколько угодно. Во-вторых в скалу же можно легко джавовые либы интегрировать. И байткод запускать на реализациях джавы ещё.
>> No.43316 Ответ
> Напишите реализацию основного интерфейса очереди по приоритетам, который использует упорядоченный массив в качестве базовой структуры данных.
Мне объяснили, что для поддержания массива отсортированным, нужно использовать принцип, по которому работает сортировка вставкой. Помогите лучше разобраться в этом алгоритме.

https://ideone.com/3JPrGg

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

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

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

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

https://ideone.com/odn3tZ
>> No.43327 Ответ
>>43324
> Dispose
Ну Dispose() это всё-таки не ручное удаление, а всего лишь команда освободить ресурсы, чтобы не ждать пока сработает финализатор. Этакий обобщённый Close(). Сам объект после вызова Dispose() всё ещё продолжает жить, пока его не подчистит GC.
>> No.43329 Ответ
>>43326
А, я забыл n++. Теперь, похоже, все верно.
https://ideone.com/HAz2LX
>> No.43330 Ответ
>>43325
Угу. Вот довольно неплохая статья про распределение памяти в CLR, зоть и не первой свежести (она также расскажет что я был не совсем прав относительно value-типов). http://blogs.msdn.com/b/ericlippert/archive/2010/09/30/the-truth-about[...].aspx
>> No.43332 Ответ
>>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 Ответ
>>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 Ответ
>>43333
> К тому же ты max передать то передал, а сохранить его и сравнить с n в insert'е забыл. Жди беды.
А это для чего?
> Для общности и соответствия STL можно переименовать обе функции в operator <<.
Да, уже встретил проблему, когда создал очередь интов, и у int не нашлось функции print(). Так что удалил даже show, ничего лишнего не осталось.
>> No.43335 Ответ
>>43333
> Зачем ты ищешь в нём максимум?
Это старая реализация. Она была такой до того, как я решил поддерживать упорядоченность массива.
>> No.43336 Ответ
>>43334
> А это для чего?
Потому что залетишь на переполнение буфера, если в очередь напихать слишком много элементов. И закончится это UB (undefined behavior) со всеми вытекающими последствиями. В лучшем случае упадёт. В худшем - запорет какую-нибудь соседнюю переменную и доставит тебе море анальных наслаждений и гейзенбагов в процессе отладки.
>> No.43337 Ответ
>> No.43338 Ответ
>>43332
> Т.е. объект уже не "живёт".
Бред (возможно, из-за путаницы в терминологии). Dispose() - это самый обычный метод. Сам по себе его вызов не творит никакой магии, не выгружает объект и не освобождает занимаемую им память. Просто, если твой объект владеет какими-нибудь внешними и/или неуправляемыми ресурсами (подключения, картинки, хендлы, COM-объекты...), в методе Dispose() ты можешь их освободить и подавить вызов финализатора.
А можешь и не освобождать, если ты косорукий рукожоп. Можешь даже зачем-нибудь реализовать метод Dispose() для внутренних чисто-управляемых объектов, который будет, например, занулять поля - этим ты привнесёшь в код немного хаоса и энтропии, но практически никак не повлияешь на его исполнение.
tl;dr: после вызова метода Dispose() освобождаются только те ресурсы, которые были (внезапно!) освобождены в методе Dispose(). Сам объект при этом остаётся в живых, и им иногда даже можно продолжать пользоваться, если программист не предусмотрел проверки состояния и выброса ObjectDisposedException.
> Хотя при желании можно попросить GC прибраться.
За такое можно смело бить линейкой по рукам, а при последующих рецидивах - черенком от грабель. Если ты хочешь, чтобы твоя программа не жрала память - не создавай лишние объектов, очевидно же. Использование GC.Collect() - это не решение проблемы, а лишь попытка замаскировать её. Она приведёт не только к жору памяти до вызова GC.Collect(), но и к фризам на время сборки мусора. Нахуй так жить?
>> No.43339 Ответ
>>43337
Ну как сказать... Всё ещё нету операторов копирования и присваивания, без которых ты потом наловишь весёлых багов... Тебе же выше писали, что c++ - не самый дружелюбный язык для новичка.
> if(n+1 < max)
Рассмотри ситуацию, в которой max = 4, n = 3. Вроде как ещё один элемент можно воткнуть, а ты его уже игноришь.

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

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

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

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

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

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

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

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

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

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

https://ideone.com/QWuZzH

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

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

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

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

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

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

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

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

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

https://ideone.com/MbbvVv
>> No.43367 Ответ
>>43365
На доброчане недавно уже писали d-кучу. Но я не помню, где.
>> No.43368 Ответ
>>43367
Я помню. Завтра быстро найду тот тред. Меня просто очень удивляет, почему программа, написанная точно по этой статье, не работает.
>> No.43369 Ответ
>>43368
Потому что ты отлаживать не умеешь. Запускай дебаггер и смотри. Ставь брейк-пойнты и пошагово иди. Или выводи просто промежуточные результаты. А ты вместо этого просто сверяешь сам код и всё.
>> No.43371 Ответ
>>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 Ответ
>>43366
Это потому, что ты овердохуя элементов туда насувал, а у ideone вывод не резиновый и обрезается. У последних ячеек все дети за границей, вот для них в цикл и не входит. А ячейки с маленькими номерами в конце, и ты выхлоп о них не видишь. Запусти на 10-20 и увидишь, что ветка с else работает.
>> No.43374 Ответ
>>43371
> И вообще, интуит - говнище. Поищи другой источник.
Щито поделать, но лучшего не нашел. Нарисовал 4-арное дерево в тетрадке, и, например, для узла с номером 5 родитель будет иметь номер 5/4 = 1, а для узла с номером 8 (у того же родителя) номер родителя будет 8/4 = 2, а должен быть равен 1. Что это за хуйня? Алсо, корень имеет номер 0.
>> No.43375 Ответ
>>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 Ответ
>>43375
Бля, опять подчёркивания в переменных распознались как курсив. Когда я уже привыкну к местному форматированию...
>> No.43377 Ответ
На примере массива из 20 элементов видно, что функция построения кучи никак не изменяет этот массив. Ладно, с кодингом пока закончу и буду читать Седжвика.

https://ideone.com/aGgBuu

http://dobrochan.com/s/res/42967.xhtml
>> No.43379 Ответ
>>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 Ответ
>>43377
Кстати, зачем ты такое зверское d взял? Там получается, что все элементы на одном родителе висят.

Вто при d=3 поинтересней: https://ideone.com/DRblj9
>> No.43381 Ответ
>>43380
А кстати, в этот коде как происходит добавление нового элемента? Куда мы его вставляем - в корень или в одну из самых нижних ветвей? Судя по тому, что при вставке мы выполняем просеивание вниз, мы вставляем новый элемент в корень.
>> No.43382 Ответ
>>43381
Вроде бы в самый конец вставлять надо, за последний элемент. А потом вызвать siftup(), чтобы вставленный элемент в направлении корня поднялся, пока свойство кучи не выполнится.
>> No.43383 Ответ
Файл: седжвик.jpg
Jpg, 43.39 KB, 759×93 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
седжвик.jpg
Почему здесь именно k/2, а не (k - 1)/2? Это из-за того, что корень имеет номер 1?
>> No.43384 Ответ
>>43383
> Это из-за того, что корень имеет номер 1?
Да.
>> No.43385 Ответ
Файл: седжвик.jpg
Jpg, 296.33 KB, 818×794 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
седжвик.jpg
И что еще. Почему в цикле k > 1? Мы не заменяем корень, или во всей книге массивы начинаются с индекса 1? При чем тут тогда С++?
>> No.43386 Ответ
>>43385
> И что еще
И вот еще. Конструктор предложений глючит и вытаскивает из памяти какие-то ненужные слова.
>> No.43387 Ответ
>>43385
> Почему в цикле k > 1?
Мы не обрабатываем корень, который имеет индекс 1. У него же родителя нету, его просто не с чем будет поменять.
> начинаются с индекса 1
Если верить коду - да. Там разве в начале главы не показано, как элементы разложены по массиву?
> При чем тут тогда С++?
Я не знаю, няш. Я не читал эту книгу, к сожалению.
>> No.43388 Ответ
Что я делаю не так в реализации d_ary функций?
https://ideone.com/PgFn3V
>> No.43389 Ответ
>>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 Ответ
>>43389
> И если уж пишешь макросы - ты обязан называть их капсом.
Формулы с большой D уродливо выглядят. Тогда лучше сделаю не макрос, а константу.
> Тогда формулы там будут не совсем такие, а более страшные, если d > 2
А как тогда изменить код, чтобы вершина была на нуле, и формулы были проще? В случае d = 2 мне понятно, почему формулы именно такие, а если d > 2, это понимание дается мне трудно. Тем более столько разных реализаций.
>> No.43391 Ответ
>>43390
> Формулы с большой D уродливо выглядят. Тогда лучше сделаю не макрос, а константу.
Но их же тоже по правилам большими надо? Это же одно и то же, что и макрос.
>> No.43392 Ответ
>>43390
> а константу
Доброчую. Первое правило о макросах в крестах - не пиши макросы.
> а если d > 2, это понимание дается мне трудно
Мне тоже оно с трудом далось... parent я вывел из firstchild, а firstchild из last_child, сдвинувшись влево на (d-1) элемент.
> А как тогда изменить код
Ну во-первых само собой внизу в insert и т.п. всё сделать с нуля. Во-вторых формулы поправить на те, которые мы где-то выше выводили для случая с нулём. В-третьих - один хрен сделать цикл в 40 строке, т.к. то что сейчас работает только с первыми двумя детьми. В четвёртых в fixUp поправить > 1 на > 0 или >= 1, как больше нравится. Вроде всё.

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

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

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

https://ideone.com/3fbg11

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

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

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

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

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

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

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

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

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

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

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

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

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


Пароль:

[ /b/ /u/ /rf/ /dt/ /vg/ /r/ /cr/ /lor/ /mu/ /oe/ /s/ /w/ /hr/ ] [ /a/ /ma/ /sw/ /hau/ /azu/ ] [ /tv/ /cp/ /gf/ /bo/ /di/ /vn/ /ve/ /wh/ /fur/ /to/ /bg/ /wn/ /slow/ /mad/ ] [ /d/ /news/ ] [ Главная | Настройки | Закладки | Плеер ]