[ /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/ ] [ Главная | Настройки | Закладки | Плеер ]

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

No.43511 Ответ
Файл: 599716131.png
Png, 77.78 KB, 317×372 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
599716131.png
Предыдущий тред: >>39226
>> No.43515 Ответ
>>43511
> Ах, да, и правоверные линуксоиды тут как тут: «всё есть объект, стандарт ++11 моделирует Окружающий Мир»... но это уже несколько другой диагноз, ага.
Но ведь они пишут на C. Зачем в ядре C++?
>> No.43517 Ответ
>>43515
Тем не менее, объектов в ядре предостаточно.
>> No.43519 Ответ
Господа, где можно прочитать про реализацию связанных списков на основе массивов? Указатели сосут хуи, на массивах получается гораздо быстрее.
>> No.43520 Ответ
>>43519
> связанных списков на основе массивов
Тупо юзаешь индексы в том самом массиве вместо указателей, если я правильно понял твой вопрос.
>> No.43521 Ответ
Накидайте список для чтения нубу,буду благодарен
>> No.43522 Ответ
>> No.43523 Ответ
>>43519
Создаёшь два списка. Все элементы массива добавляешь в один список, а другой оставляешь пустым. Первый список — это свободная память. Второй — собственно список для хранения данных. Чтобы добавить элемент, перекидываешь его из первого списка во второй. И наоборот — из второго в первый, чтобы удалить.
Если непонятно, спрашивай ещё.
>> No.43524 Ответ
>>43523
Нам показывали интересную реализацию на трех массивах, где был массив данных, массив адресов и массив из одного элемента. Зачем он нужен, я не помню. Рассказывали очень быстро, потому что, как сказали, это для тех, кто заинтересуется, остальным необязательно записывать. И мои записи оказались очень неполными. Заинтересовала низкоуровневость и скорость такого подхода.
>> No.43525 Ответ
>>43523
Это полный бред, это вообще не имеет ни малейшего отношения к связному списку. Связный список подразумевает удаление элементов из середины/начала/конца(т.е. из любого места) и так же и в любое место добавление за О(1), то есть, за время приблизительно константное, не зависящее от общего числа элементов. А ещё соединять два списка(при некоторых обстоятельствах) и увеличить длину без долгого перераспределения памяти. Но в отличие от обычного массива в нём нельзя за О(1) найти элемент по его номеру.

В STL связный список - это list, а массив - это vector.

Связный список на массивах подразумевает, что каждый элемент - это запись, состоящая из собственно элемента с данными, номера следующего элемента(в этом же массиве) и номера предыдущего(опционально, можно только следующего). При этом в отдельной переменной требуется хранить номер первого элемента. (В ещё одной и номер последнего, опционально тоже). То есть они расположены беспорядочно, а порядок помнят внутри, кто следующий.
>> No.43526 Ответ
>>43525
В чём бред? Как ты будешь добавлять и удалять элементы списка?
>>43524
Про три массива не слышал. Если найдёшь, расскажи.
>> No.43527 Ответ
Правильно ли я решил задачу?
> Our binary search makes two tests inside the loop, when one would suffice (at the price of more tests outside). Write a version with only one test inside the loop and measure the difference in run-time.
https://ideone.com/pjXevf

Без вывода промежуточных результатов было трудно понять, какие значения будут иметь переменные low и high в случае, если элемент есть в массиве и он крайний слева/справа/находится где-то еще, и если этого элемента в массиве нет. Вроде бы сейчас программа работает верно.

https://ideone.com/kit5DM
>> No.43530 Ответ
>>43525
> Это полный бред
Это не бред, анон. Конструкция того анона действительно позволяет удалять/добавлять элементы за O(1), как и обычный список с элементами в куче. Ты просто не понял идею.
>> No.43531 Ответ
>>43530
Из середины? А почему она называется связным? Я впервые про такой слышу.
>> No.43532 Ответ
>>43526
> Как ты будешь добавлять и удалять элементы списка?
Путём перестановок номеров следующих и забывания про него.
> Про три массива не слышал. Если найдёшь, расскажи.
В >>43525 это и описано. Три массива или массив записей с тремя полями, это одно и то же.
>> No.43533 Ответ
Что содержит переменная массива int a[]? Указатель на первый элемент? Если это так, тогда почему sizeof(a)/sizeof(int) дает точную длину массива?
>> No.43534 Ответ
>>43533
> An object of array type contains a contiguously allocated non-empty set of N subobjects of type T.
Т. е. она содержит в себе весь массив.
>> No.43535 Ответ
>>43531
> Из середины?
Да хоть откуда. Ну, вернее, с теми же ограничениями, что и у обычного связного списка.
> А почему она называется связным?
Хм. Ну потому что каждый используемый элемент массива содержит в поле next индекс/указатель на следующий (и prev, если делаем двусвязный). Это самый обычный связный список. Просто элементы выделяются не в куче, а в массиве. А второй список, использующий то же самое поле next, пронизывает все свободные элементы массива, чтобы мы могли мгновенно найти свободную ячейку или пометить как освободившуюся. Вот и вся идея.
>> No.43537 Ответ
>>43522
Спасибо,щас посмотрю
>> No.43539 Ответ
>>43537
"Хакинг, искусство эксплоита"
>> No.43540 Ответ
Алсо, Таненбаум: "Архитектура компьютера" и книга про сети.
>> No.43541 Ответ
http://ru.stackoverflow.com/
Откуда здесь столько веб-макак и ява-даунов?
>> No.43542 Ответ
>>43541
Ну а что сейчас в ходу? Оно и есть.
>> No.43543 Ответ
Анон, я пока не могу сам оценить сложность этих задач. Насколько они трудные?
http://pastebin.com/vfVumrQd
>> No.43544 Ответ
>>43540
>>43539
Посмотрю,спасибо
>> No.43563 Ответ
>>43543
Средней трудности, и совершенно ненужные.
Лучше задачи просмотра дерева каталогов и джойна таблиц из базы решить. Больше пользы будет.
>> No.43565 Ответ
>>43540
Я не согласен. Эти задачи дают хорошие базовые навыки программирования. После них обычные просмотры дерева каталогов и джойны тебя уже не запутают так просто. Все кроме первой дают понимание рекурсии хорошее(даже если в программе нет рекурсий и стеков, если ты её понимаешь), это дин. прог., отдельный метод разработки алгоритмов. После них и с деревьями легче будет. Матрицы по мелочи понадобятся, если с графикой что-то будешь делать.
>> No.43566 Ответ
>>43565
> Все кроме первой дают понимание рекурсии хорошее
А SICP дает понимание рекурсии плохое?
>> No.43567 Ответ
>>43566
Это лучше, так видно, где и зачем её можно использовать. И интуиция лучше развивается.
>> No.43595 Ответ
Анон, как правильно заполнять вектор числами из массива? Я вижу, что после выполнения assign вектор содержит какую-то хуйню.

https://ideone.com/0mEjOf
>> No.43596 Ответ
>>43595
Оказалось, что sizeof(a) - это хуйня какая-то, а не размер массива. Чем это можно объяснить?
https://ideone.com/8kI4SG
>> No.43597 Ответ
>>43596
Всё потому, что при передаче массива по значению проёбывается его размер.
https://ideone.com/rzHPoj
>> No.43598 Ответ
Какой в C++ максимальный диапазон индексов массива?
#define SIZE 40000
int seq[SIZE]
работает нормально, а программа с
#define SIZE 65000
int seq[SIZE]
крашится при запуске.
>> No.43599 Ответ
>>43598
Ошибся. Из-за опечатки у меня получилось
const SIZE = 650000
Но мне все равно интересно, какой может быть максимальный индекс.
>> No.43600 Ответ
Алсо, какая глубина стека на пекарне? Я реализовал квиксорт на стеке отложенных заданий и обнаружил, что массив из 65000 элементов без ошибок сортируется при помощи стека с глубиной 50 (хотя сначала я выставлял глубину 500). Стандартная реализация квиксорта исчерпывает стек уже при длине массива, равной 50000.
>> No.43601 Ответ
>>43599
2 метра, вроде. Он настроек компилятора тоже зависит.
>> No.43602 Ответ
>>43599
> какой может быть максимальный индекс
size_t - 1

А вот стек не резиновый. И если ты слишком большой массив опишешь в стеке - вполне может упасть. Юзай вектор и не еби мозг себе и нам.
>> No.43603 Ответ
>>43602
> size_t - 1
Тьфу, фигню какую-то написал. SIZE_MAX/sizeof(T). Т.е. миллиард с лишним элементов на 32-битке и дохуялиард на 64.
>> No.43604 Ответ
>>43601
> Он настроек компилятора тоже зависит.
А если в дополнительных тредах - то и от параметров, которые указали при создании треда...

>>43600
> уже при длине массива, равной 50000
Ты там, случаем, временные массивы на стек не складывал?
>> No.43605 Ответ
>>43598
>>43600
С++ не налагает на это никаких ограничений, всё зависит от платформы, железа, компилятора по идее.
>>43602
При чём здесь вектор?
> не еби мозг себе и нам
Нормальный вопрос, чё ты быкуешь тут.
>> No.43606 Ответ
>>43605
> При чём здесь вектор?
При том, что вектор выделяет память в куче и не валится от такой мелочи, как массив из миллиона элементов (если код исполняется не на микроконтроллере, конечно). А по удобству работы с ним явно не хуже массива.

Зачем вообще юзать в крестах голые массивы без уважительной причины? Имхо, это моветон и преждевременная оптимизация.
>> No.43607 Ответ
>>43606
> При том, что вектор выделяет память в куче
Допёр теперь.
>> No.43608 Ответ
Анон, подскажи, почему этот вариант быстрой сортировки зацикливается? На возрастающей последовательности никаких проблем нет, зато на инвертированной последовательности алгоритму не хватает никакой глубины массива.

https://ideone.com/NvWiH1
>> No.43609 Ответ
>>43608
Вот код. Пусть будет на моем аккаунте.
http://ideone.com/IEQo2w
>> No.43610 Ответ
>>43609
Codestyle твой неоче, зачем ты стек по значению передаешь, почему top = top + 1 вместо top++ или хотябы top += 1?
>> No.43611 Ответ
>>43610
Это не очень важные детали, я этот код писал три месяца: немного напишу до логического завершения и берусь за другое или читаю про алгоритмы. Вот так и вышло, что есть отличия типа quicksort с маленькой буквы, а все остальные с большой. В чем там может быть проблема?
>> No.43612 Ответ
> При входе в рекурсию или при добавлении задания в стек нужно проверять,
с какой стороны элементов меньше, а с какой - больше, и сразу переходить
к обработке меньшей части, а большую - откладывать. Таким образом можно
гарантировать, что требуемая глубина стека не превысит log N.
Как можно реализовать это в квиксорте на стеке? Неожиданно оказалось, что тот алгоритм, который нам давали, не содержит этих важных проверок.
>> No.43621 Ответ
>>43612
> Как можно реализовать это в квиксорте на стеке?
Ну так и реализуй... Пушишь на стек ту, которая больше. Продолжаешь работать с той, которая меньше.
>> No.43631 Ответ
Доброняши, а дайте мне хороших уроков по Qt, пожалуйста.
Где можно научиться пользоваться потоками на с++?
И еще вопрос: а что вообще нужно чтобы с сокетами на плюсах играться?
мимо-не-бейте-пожалуйста
>> No.43632 Ответ
>>43631
Откатывайся на Сижку.
Там в POSIX API есть и потоки, и файлы и сетевые/сокетные соединения и фсё чё хошь.
>> No.43633 Ответ
>>43631
> а что вообще нужно чтобы с сокетами на плюсах играться?
Статья Криса Касперски. Так и называется - играем на сокетах вин апи.
>> No.43638 Ответ
Файл: 1438453305898.png
Png, 116.78 KB, 1147×605
Ваши настройки цензуры запрещают этот файл.
r-18
>> No.43639 Ответ
>>43631
> потоки на c++
Параллельное программирование на С++ в действии, Энтони Уильямс.
>> No.43640 Ответ
>>43638
ebin:DD
>> No.43642 Ответ
Анон, посмотри здесь на второй исходник.
http://clc-wiki.net/wiki/K%26R2_solutions:Chapter_4:Exercise_2

Каким образом можно научиться так же охуенно кодить машину состояний? Что требуется для того, чтобы написать качественный алгоритм такого типа? Как продумать все варианты смены состояний и их обработку, чтобы учесть все случаи?
>> No.43643 Ответ
>>43642
> Каким образом можно научиться
Берёшь и кодишь машину состояний. Потом вторую. Потом третью. Рано или поздно ты познаешь дао.

Я серьезно, анон. Практика и ещё раз практика.
>> No.43644 Ответ
>>43642
Сходил по ссылке и в очередной раз убедился, что сишкоблядство - это диагноз. Сириусли, анон, писать такие простыни из свичей-в-ифах-в-свичах может быть увлекательно и поначалу даже забавно, но ты проклянёшь всё, когда тебе поручат поправить какую-нибудь глупую ошибку или добавить пару новых состояний в похожий кусок говна, написанный другим программистом. Всё это время ты будешь рвать волосы на жопе, а ОО-боги будут ходить у тебя за спиной, показывать на тебя пальцем и весело шутить.
Почитай книгу Фрименов про паттерны ОО-проектирования, главу про состояния. Там ты увидишь правильную реализацию машины состояний, а не высер из одной функции с зашкаливающей цикломатической сложностью.
>> No.43645 Ответ
>>43644
ИМХО ООП появилось во многом как ответ на заказчиков, которые не могут написать ТЗ. И как следствие понимать зачем оно о начинаешь только после разъярённых баталий с ними и их бесконечными правками. А потом уже начинаешь всё делать в виде нагромождения слоёв абстракции, чтобы вся прога была как кусок пластилина, зараняя готовясь к дождю из правок. Если программа в будущем не меняется, то конечно можно всё функциями записать и всё. Или даже одним потоком команд.
Плюс монотонное написние каждый день одинакового кода со временем толкает на создание абстракций, тогда когад уже написал одно и то же достаточное число раз, чтобы выявить в этом общее. И вот когда пытаешься выделить всё общее и начинается это всё.
А студентам и новичкам чё? Сотня строк - это уже гигансткая программа и в голове еле помещается. Препод задачу даст или в учебнике - после решения задача всегда в мусорнике. Запускают задачу только один раз на глазах у препода руками самого автора. И тут конечно никому не нужно ООП.
А CMS-мальчики почти ничего не делают дальше чем натянуть вёрстку на CMS и вызвать пару плагинов jQuery. Если плагины и CMS это никак не делают, то уже всё, говорим заказчику, что мы не могём.
>> No.43646 Ответ
>>43645
> ИМХО ООП появилось во многом как ответ на заказчиков, которые не могут написать ТЗ
...то есть в 98% случаев (крайне оптимистичная оценка). При правильном подходе к проектированию и написанию добавляются ещё и приятные бонусы в виде простоты повторного использования кода и простоты его изменения.
> А потом уже начинаешь всё делать в виде нагромождения слоёв абстракции, чтобы вся прога была как кусок пластилина...
...или как стройная конструкция из металлических балок, которую в любой момент можно разобрать, перекроить, вывернуть до неузнаваемости и опять собрать. Или заменить какую-то ферму на усиленную, чтобы избежать падений при повышении нагрузки. Или заменить недостроенный модуль на временную деревянную клетку, чтобы уже к вечеру показать заказчику работающий прототип. Выбор за программистом.
> Если программа в будущем не меняется, то конечно можно всё функциями записать и всё.
Такого не бывает. Если это коммерческий продукт, то тут всё очевидно - дырявые ТЗ, непостоянство желаний заказчика и просто мелкие полезняшки для повышения лояльности будут существовать всегда. В домашних наколенных хелловорлдах двигателем изменений будут любознательность и тяга автора к совершенству. Даже одноразовые инструменты в процессе написания, отладки и нескольких десятков "единичных" прогонов ("Ну всё, в этот-то раз всё пройдёт отлично. F5, забиваем данные, ждём... ах ты ж конина, неужели ещё и такое бывает? Ок, вот здесь подопрём костыликом и теперь-то уж оно точно отработает успешно!..") могут несколько раз в корне перемениться.
> монотонное написние каждый день одинакового кода со временем толкает на создание абстракций, тогда когад уже написал одно и то же достаточное число раз, чтобы выявить в этом общее. И вот когда пытаешься выделить всё общее и начинается это всё.
И это замечательный процесс. Гораздо хуже, когда какой-нибудь кодер не задумываясь копипастит какую-нибудь пустяковую функцию везде где ни попадя. А потом начинается погоня за багами в этой функции, которая уже успела прочно укорениться и пустить метастазы в куче проектов.
>> No.43647 Ответ
>>43646
> приятные бонусы в виде простоты повторного использования кода и простоты его изменения
Я думаю, что эти приятные бонусы являются одними из основных целей.
> дырявые ТЗ, непостоянство желаний заказчика и просто мелкие полезняшки для повышения лояльности
Для справедливости в этот список нужно добавить объективные и независящие изменения обстаятельств. Те же изменения законов. И изменения форматов. И на рынке изменения могут быть в поведении потребителя и т.д.
>> No.43648 Ответ
Анон, дай мне список тем, в которых надо разобраться, чтобы уметь написать качественный криптор.
1) Алгоритмы шифрования - я их знаю кучу, и сложные алгебраические, и совсем простые на битовых операциях.
2) Формат ПЕ-файлов. Что можно почитать?
3) ВинАПИ. Очень объемная тема. Что конкретно нужно знать?
Что еще нужно знать кроме этого?
>> No.43649 Ответ
>>43648
1) Строго похуй, как ты шифровать будешь. Тебе нужно будет стаб (декриптор) и ключ спрятать, а внутри подойдет все, что сложнее однобайтового xor.
2) Microsoft PE and COFF Specification, winnt.h, private/ntos/dll/ldrapi.c, дальше статейки, дальше берешь windbg и разбираешься с непонятными моментами.
3) Рихтера почитай, чтобы иметь представление, что вообще в Windows API есть, потом разделы MSDN "Memory Management" и "DLLs, Processes, and Threads". Статейками догонишься (всякие ASLR, SxS, UIPI/UAC опять же).
Учи асм, кодирование инструкций x86, учи математику, читай все, что сколько-нибудь касается темы.
>> No.43652 Ответ
Файл: modexp.jpg
Jpg, 140.08 KB, 1062×879 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
modexp.jpg
Расскажите побольше про указатели на метки &&begin. Только что у меня не получилось повторить аналогичный прием - при выполнении произошла ошибка. Эта штука поддерживается всеми сями?
>> No.43656 Ответ
>>43652
Это расширение гцц, не пользуйся им. Алсо, криптовать код таким образом - бессмысленная затея. Можно и статический декриптор написать, и просто не дать закриптовать обратно.
>> No.43660 Ответ
>>43648
Цель можно уточнить? Ты хочешь спрятать вирус от сканера или написать какую-нибудь защиту от копирования?
>> No.43662 Ответ
>>43660
> написать какую-нибудь защиту от копирования
Этим занимается только петушня, в которой нет духа 2003 года, когда все ебанулись по вирмейкерству, и из каждого утюга лезли верасы.
>> No.43663 Ответ
>>43662
Петушня 2003 года со своими вирасами скатилась в коммерс, спилась или сторчалась, или сидит, или ушла из коденга.
>> No.43665 Ответ
Файл: archive.zip
Archive, 7.30 KB, 4 файлов - Нажмите на картинку, чтобы скачать файл
view
archive.zip
Сап. Пытаюсь повернуть кватернионом модельку, моделька херится, всё херится и катится к хуям. ЧЯДНТ?
>> No.43666 Ответ
>>43665
> ЧЯДНТ?
Очевидно, ты совсем не смотришь вакансии и средние цены.
>> No.43705 Ответ
Анон, как на С/С++ сгенерировать последовательность вещественных чисел из диапазона [0;1)? Линейную последовательность, допустим, сгенерировать довольно просто лень сейчас формулировать идею, а как бы со случайными числами? При этом не должны появляться очень маленькие дроби типа 0.000006987. Последнее не обязательно, но желательно для красоты.
>> No.43714 Ответ
>> No.43719 Ответ
>>43705
> как на С/С++ сгенерировать последовательность вещественных чисел из диапазона [0;1)
Вот так, например:
std::default_random_engine gen;
std::uniform_real_distribution<float> distr(0, 1);
float rnd = distr(gen);
> не должны появляться очень маленькие дроби
Просто округли до нужного тебе знака.
>> No.43823 Ответ
Если у нас есть класс, что содержит методы, которые в коде не вызываются ни разу, то будет ли код этих методов внесен с полученный исполняемый файл? Компилятор - g++
>> No.43826 Ответ
>>43823
При максимальной оптимизации - нет.
>> No.43841 Ответ
А я поступил с биологии на информатику сразу на пятый курс. Погромирование не знаю, престейших лабов сделать не в состоянии, чую попрут скоро.
>> No.43842 Ответ
>> No.43852 Ответ
>>43826
Спасибо.

Следующи вопрос. Везде говорят "минимизируйте использование пропроцессора", но у меня есть следующая две ситуации. Первая - есть несколько классов и надо создать 5-10 методов по типу
std::string getPropertyName() {
   return foo("some_string");
}
Как это облечь в шаблоны красиво я не знаю, запилил макросом. Сильно за такой код будуть бить ногами? Или он вполне кошерный?

Вторая ситуация - есть классы, для удобства нужно объявить
class MyClass {}
typedef std::shared_ptr<MyClass> PMyClass;
typedef std::list<PMyClass> MyClassList;
Каждый раз руками писать - лень. Тоже сделал через макрос. Вопрос аналогичный первму случаю.
>> No.43896 Ответ
>>43852
> 2015
> typedef
Используй алиасы, Люк!
>> No.43898 Ответ
>>43852
Обычно, если надо использовать препроцессор, то у тебя где-то проеб в архитектуре.
Например в первом случае, если твои 5-10 методов это действительно геттеры, которые возвращают константное значение, то я бы сделал базовый класс, в котором в протектеде напиханы эти константы, конструктор их принимает, а геттер возвращает. И каждый класс, которому нужны такие геттеры просто бы наследовал от этого. Пример кода, имена сам получше подберешь:
class Property
{
  protected: 
    const std::string property;
  public:
    Property(std::string p): property(p) {}
    getProperty() const { return property; }
}

class A: public Property
{
   public:
    A(std::string propertyA, ...);
...

A a("a_property", ...);
Ну ты понел. Можно шаблонизировать класс и делать пропертю произвольным типом. Можно значение проперти захардкодить в конструкторе класса и т.д.
>> No.43899 Ответ
>>43852
Вторая ситуация: using PMyClass = std::shared_ptr<MyClass>;
>> No.43901 Ответ
>>43899
Ты глупый и самоуверенный. Это вообще дело десятое через что он новый тип объявляет.
Он использует короткий макрос как раз чтобы не писать этот бойлерплейт.
>>43852
Минимизировать - значит не использовать там, где можно обойтись шаблонами и прочим. Или где копипаст минимален.
>> No.43902 Ответ
>>43901
Прочти Скотта Майерса. Это не десятое дело, хотя бы потому что умные дяди придумали using. Этот "бойлерплейт" позволяет не городить огород:

template<typename T>
struct VasyanList {
typedef std::list<T, VasyanAlloc<T>> type;
};

template<typename T>
class VasyanClass{
private:
typename VasyanList<T>::type list;
};

В то время как алиасы позволяют сразу написать:

template<typename T>
using VasyanList = std::list<T, VasyanAlloc<T>>;
  
template<typename T>
class VasyanClass{
private:
VasyanList<T> list;
};

Разницу чуешь? Где бойлерплейт?
>> No.43904 Ответ
Файл: Paris_Tuileries_Garden_Facepalm_statue.jpg
Jpg, 101.64 KB, 1024×683 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
Paris_Tuileries_Garden_Facepalm_statue.jpg
>> No.43938 Ответ
>>43901
> Минимизировать - значит не использовать там, где можно обойтись шаблонами и прочим. Или где копипаст минимален.
Это да. Но конкретно в моем случае лучше через макросы сделать? Или пилить "более плюсовыми" средствами, как >>43898-кун говорит? С одной стороны ИМХО с препроцессором кода меньше + он понятнее выходит. С другой - говорят что это некрасиво.
>> No.44608 Ответ
Почему API STL - такое говно? Неужели нельзя было сделать vector::erase(int i), чтобы не писать все время erase(v.begin() + i)? Почему нет removeAll(const T& val), и приходится городить огород с v.erase(std::remove(v.begin(), v.end(), val), v.end())? Зачем это фетишистское ололо-другая парадигма с std::sort(v.begin(), v.end()) вместо vector::sort()?
>> No.44610 Ответ
>>44608
Языки программирования:
Мэйнстрим (область с заторможенным временем, в которой работает 99% программистов. Время заторможено потому, что в серьезном бизнесе сделать за предсказуемое время важнее, чем быстро. Сейчас в мейнстриме примерно 1975-ый год):
• C (няшная сишка) — самый простой и убогий язык из тех, что используются на практике. Более убогий — только брейнфак. Единственное выразительное средство — копипаст, для автоматизации которого есть даже специальный второй язык-препроцессор. Делает решение любой задачи нетривиальным, так что его решение задач с его помощью может требовать высокой квалификации. Тем не менее, типичная няшаблядь ничего не знает и не умеет. Даже дибиловатый обгвидок знает, помимо гвидопыха, еще и сишку, но сишкаблядь не знает ничего кроме нее. Языком владеют почти все, но только няшаблядь этим знанием гордится, остальные стыдливо скрывают. Также няшаблядь может ошибочно считать что знает C++ или несуществующий язык C/C++. Благодаря C компьютерные программы — самое ненадежное из всего созданного человеком.
• C++ (кресты) — самый сложный и уродливый (и то и другое временно, появился быстро развивающийся соперник) из языков, использующихся на практике, но выразительность его невелика. Усовершенствованная сишка. Сложность использования повышает ЧСВ крестобляди до заоблачных высот, но вменяемая крестоблядь понимает, на каком говне пишет и постоянно пытается себя загипнотизировать. Поэтому любое упоминание крестов в негативном ключе вызывает атомный батхерт крестобляди и обвинения в некоем «неосиляторстве». Насчет неосиляторства крестоблядь, обычно, права — это вообще распространенное явление. Интересно, что до недавнего времени неосиляторами были даже разработчики большинства крестокомпиляторов. Тем не менее, по мере «осиливания» крестов, мнение о них может меняться только к худшему.
• Java (жаба) — кобол нашего времени. Убогий и примитивный, но простой язык. Хорошо подходит для написания зиллионов строк кода быстро-быстро, пока солнце еще высоко. Наряду с крестами — один из самых массово используемых языков.
• C# (сисярп) — зародился в недрах микрософта из-за анальной копирастии Сан и отсутствия стандарта жабы как сплав жабы и сишки, но впоследствии стал самым уебищным, но единственным в мейнстриме ФЯ. Уверенно движется к тому, чтобы отобрать у крестов лавры самого сложного и уродливого языка. 80% программистов на нем знают и используют только его 20% подмножество — жабу. Попытка микрософта насильно осчастливить жава- и крестоблядей для последующего захвата и порабощения, о чем неустанно предупреждают ведущие мозолееды. Кресты двухтысячных.

Немейнстрим (не используются на практике, программисты знающие эти языки, на работе пишут на других, указанных в конце):
• ML (стрелочное эмелеговно) — старейший ФЯ, многое в нем напоминает современные языки, но сделано впервые, а потому криво и уродливо. Уебищность эмеля и его производных часто связывают с практичностью, потому как все языки используемые на практике (мэйнстрим) непереносимо уебищны, что позволяет надеяться на то, что и эмелеговно тоже скоро к ним присоединится. Любой программист на эмеле — будущий программист на хаскеле, который пока боится привыкнуть к хорошему и блевать кровью на работе. Типичная эмелеблядь пишет на работе на крестах или сисярпе.
• Haskell (хаски) — условно современный ФЯ, являющийся, разумеется, говном, но несколько менее вонючим, чем остальное здесь перечисленное. Имеет подмножество Haskell 98 для обучения второкурсников, на котором даже факториалы и фибоначи нормально не напишешь и раковую опухоль, которая его убивает — стандартную прелюдию. Несколько сниженная в сравнении со средним уровнем говенность хаски — основная мишень для критики. Дело в том, что он, по всей видимости, недостаточно уебищен для мейнстрима, да еще и вызывает головные боли и тошноту у знающих его программистов, когда те отрабатывают свой кредитный фокус-покус на работе. Типичная хаскиблядь зарабатывает на жизнь программированием на сисярпе, крестах.
>> No.44612 Ответ
>>44608
> Неужели нельзя было сделать vector::erase(int i), чтобы не писать все время erase(v.begin() + i)?
1) Чтобы туда можно было совать итератор, а не только число. Там гораздо больше гибкости. Ты скорее всего не знаешь зачем нужны итераторы и как ими пользоваться. И не надо тут "нинужно", это не php.
2) Эта операция не характерна для вектора. Она медленная. Один элемент будет удаляться за время, пропорциональное длине всего вектора.
> Почему нет removeAll(const T& val)
Но ведь слишком нетривиальная операция. В каком языке ты такое видел? Сделано, чтобы функций было не так много и они были общими.
> std::sort(v.begin(), v.end())
1) Можно запихнуть туда совсем другие последовательности. Гораздо больше применений.

Всё там в STL хорошее, просто ты ничего не понимаешь. Ты вообще пробовал использовать другие структуры данных кроме vector? А использовать итераторы для получения и обработки каких-нибудь данных?
>>44610
В контакте/двач тебе, что ли? Нахуя это говно здесь нужно?
>> No.44613 Ответ
>>44612
> 1) Чтобы туда можно было совать итератор, а не только число. Там гораздо больше гибкости. Ты скорее всего не знаешь зачем нужны итераторы и как ими пользоваться. И не надо тут "нинужно", это не php.
Так это STLфаги говорят "нинужно", вот и ты прямо сейчас. Перегрузить метод, чтобы была версия с итератором и версия с индексом, слишком нинужно?
> 2) Эта операция не характерна для вектора. Она медленная. Один элемент будет удаляться за время, пропорциональное длине всего вектора.
Я знаю. Но вот нужна она, и все тут, и хочу писать это просто индексом, без сраного дополнительного begin(). А STLфаги вот опять говорят, что нинужно.
> Но ведь слишком нетривиальная операция. В каком языке ты такое видел? Сделано, чтобы функций было не так много и они были общими.
В божественной Qtшечке. "Было не так много" и "общими" - эталонное нинужно, мне не лень один раз прочесть ман, мне лень постоянно писать erase-remove вместо вызова одного простейшего метода.
> 1) Можно запихнуть туда совсем другие последовательности. Гораздо больше применений.
Перегрузка! Опять нинужно, сделаем один общий метод, а простейшие перегрузки для быстроты и удобства - это для быдла, программист должен писать много кода.
> Всё там в STL хорошее, просто ты ничего не понимаешь. Ты вообще пробовал использовать другие структуры данных кроме vector? А использовать итераторы для получения и обработки каких-нибудь данных?
3+ года опыта. Да, пробовал.
>> No.44614 Ответ
>>44613
Ну ок, методов не хватает, но те, которые есть, - хорошие. Нужно ли это всё в либе, которая входит в стандарт языка? Всё таки Qt - стороння либа, а реализация STL зависит от компилятора.
>> No.44615 Ответ
Как перевести числа от 1 до 10 в текст в зависимости от выбора?
>> No.44616 Ответ
>>44615
sprintf
>> No.44617 Ответ
>>44614
> Нужно ли это всё в либе, которая входит в стандарт языка?
Вообще говоря, нужно. Все-таки, кмк, целью стандартной либы является не просто дать ну хоть какой-то инструментарий, а инструментарий удобный, требующий наименьшее количество телодвижений для получения результата. Отсутствие инкапсулированных erase-remove - дикий фейл же.
Ну энивей, есть ли какой-нибудь набор либ, дающий минимальный оверхед над STL, но предоставляющий developer-friendly API?
>> No.44618 Ответ
>>44617
Может проще наделать своих обёрток тогда и таскать?
>> No.44627 Ответ
Файл: qwe.PNG
Png, 11.13 KB, 346×611 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
qwe.PNG
Объясните, пожалуйста, мне, долбоебу, почему выводятся нули, а не единицы?
>> No.44628 Ответ
>>44627
У тебя Test копируется на каждой итерации циклов и кек и кок вызываются над временной копией.

З.Ы. Или это не ц++? Что за язык, анон?
>> No.44629 Ответ
>>44628
Похоже на C++/CLI.
>> No.44630 Ответ
>>44628
Это M$ Visual C++ видимо.

Вот например как можно зделось на g++ -std=c++11 https://ideone.com/6WgS29
>> No.44631 Ответ
>>44628
>>44629
>>44630
Благодарю за помощь, я и представить не мог, что он создает новый объект вместого того, чтобы взять существующий из массива. Это какой-то пиздец, честно, ни в одном языке такого не видел.
>> No.44632 Ответ
>>44630
> c++11
Ты используешь его неправильно.
for (auto& t : test) {
    t.kek();
}
for (auto& t : test) {
    t.kok();
}
>> No.44633 Ответ
>>44632
Можно и так.
>> No.44715 Ответ
Может у кого есть код игры "Cбей самолет" на с++?
Курсач пишу, ничего не могу придумать.
>> No.44716 Ответ
Файл: 1.png
Png, 10.10 KB, 663×1069
edit Find source with google Find source with iqdb
1.png
Файл: 2.png
Png, 39.46 KB, 649×444
edit Find source with google Find source with iqdb
2.png

>>44715
отклеилось
>> No.44741 Ответ
>>44716
Когда мне дают задание через блоксхемы, я эту всю логику делаю через переписывания всей этой блоксхемы через goto, чтоб потом у проверяющих глаза на лоб лезли от чтения этого. Может быть это научит их давать задания не в виде блок-схем
>> No.44746 Ответ
>>44632
>>44630
Вместо test.push_back(Test()); лучше всё-таки писать test.emplace_back();, раз уж речь про новые стандарты зашла.
>> No.44747 Ответ
>>44741
А что такого? Блоксхемы прекрасно реализуются через конечный автомат с набором функций.
>> No.44748 Ответ
>>44741
Что же с тобой будет, когда UML учить начнёте.
>> No.44749 Ответ
>>44748
Для использования UML есть основания и у него есть преимущества. У блок-схем - нет. Блок-схемы громоздко выражают строк 5-10 кода, который можно было написать в псевдо-коде. Не понимаю, ому они могут быть нужны кроме как при изучении кодинга впервые.
>> No.44750 Ответ
Файл: Ris136-137.png
Png, 26.94 KB, 874×520
edit Find source with google Find source with iqdb
Ris136-137.png
Файл: block.png
Png, 34.40 KB, 709×1133
edit Find source with google Find source with iqdb
block.png

>>44747
В блок-схемах нет понятия "функции". Есть просто некие куски "действий", связанных стрелочками, и действия эти могут вообще что угодно менять, там нет понятия области видимости, все переменные глобальные и изменить их можно из любого произвольного места, и есть еще условия, которые куда угодно могут прыгать (примерно как if(условие) goto кудато; else goto кудато-еще;). Таким образом, логичнее всего задачи с блок-схемами делать как одну сплошную функцию с понатыканными метками и с if-goto вместо ромбиков.

Вот еще про goto с блоксхемами https://habrahabr.ru/post/114211/
Есть еще такой как бы язык программирования на блоксхемах (но не совсем) ДРАКОН http://drakon.pbworks.com/w/page/18205503/%D0%93%D0%BB%D0%B0%D0%B2%D0%B0%2016 который компилируется именно в эту лапшу из goto. А писать блоки, связываемые стрелочкам, можно на питоне, си, плюсах и прочем
>> No.44752 Ответ
>>44750
Да, там нет понятия "функции", это не мешает ему прекрасно через них реализовываться. Привыкай к тому, что тебе дают задачу, а не ТЗ, и все детали реализации ты придумываешь сам. Всегда можно написать красиво и понятно, даже из блоксхем, без всяких goto в одной функции, было бы желание.
>> No.44753 Ответ
>>44752
В ТЗ нет деталей реализации или я чего-то не понимаю в ТЗ. Никогда не видел таких ТЗ. Правда, я вообще никогда не видел серьёзных ТЗ. Всегда или без ТЗ, или с ТЗ "на отстань"
>> No.44758 Ответ
>>44753
Да там каждый пишет кто во что горазд, мне и с деталями попадались, что не особо улучшало качество ТЗ.
>> No.44759 Ответ
>>44752
> Да, там нет понятия "функции", это не мешает ему прекрасно через них реализовываться.
Можно конечно вынести некие блоки кода в функции, и сами условные переходы делать таким образом, чтобы они попадали на вызов функции, а не просто кусков кода (ну это еще при условии, если нам внезапно не может понадобится из середины функции прыгнуть фиг знает куда, следуя логике блоксхемы). Это даже будет иметь некий смысл, если некие "блоки" или последовательность блоков в блок схеме повторяются. Но от goto это в любом случае не избавляет, а лишь появляются некие дополнительные задачи, написать какую-то функцию, чтобы такие-то переменные передавать в нее. Сам порядок управления (control flow) со всеми этими условиями, если задание дано в виде блоксхемы, легче пилить именно на метках и "if(условие) goto метка;". Это достаточно наглядно показано в примере в той статье на хабре https://habrahabr.ru/post/114211/
>> No.44760 Ответ
Файл: 3b25af0c.jpg
Jpg, 8.74 KB, 200×302 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
3b25af0c.jpg
>>44752
> Всегда можно написать красиво и понятно, даже из блоксхем, без всяких goto в одной функции, было бы желание.
ОК, перепиши из этой блоксхемы с хабра без goto чтоб красиво и понятно
>> No.44761 Ответ
/s/, проверь, пожалуйста, код и укажи на ошибку. Не умею ничего. Сегодня вечером первый раз в жизни попробовал написать что-нибудь, Hello world получился, а вот калькулятор нет. В смысле программа компилируется, но в ответ выдаёт совершенно непонятные числа. Что я делаю не так?

#include <stdio.h>

int main()
{
   float a, b, c;
   int k;
   printf("Введите первое число: ");
   scanf("%d", &a);
   printf("Введите второе число: ");
   scanf("%d", &b);
   printf(" Введите 1, если вы хотите сложить числа,\n 2, чтобы вычесть из первого числа второе,\n 3, чтобы умножить числа,\n 4, чтобы разделить первое число на второе.\n");
   scanf("%d", &k);
   if (k=1) c=a+b;
   if (k=2) c=a-b;
   if (k=3) c=a*b;
   if (k=4) c=a/b;
   else printf("Вы ретард, аутист и дегенерат. Вводить можно только одно из следующих чисел: 1, 2, 3, 4. Попробуйте снова.\n");
   printf("Ваш результат: %d.\n", c);
   return 0;
}
>> No.44762 Ответ
>>44761
Ошибка очень сильно слишком банальная, чтобы спрашивать. Странно, что ИДЕшка не указывает на неё, скорее всего ты игноришь ворнинги. Присвоения в ифах вместо сравнений.
>> No.44763 Ответ
>>44762
Заменил = на == в if, но программа адекватно работать не стала. По-прежнему что-то не так. IDE нет, я линуксоид, пишу в Emacs, компилирую в gcc, запускаю в консоли. Может показаться круто для новичка, но Emacs раньше использовал как текстовый редактор и органайзер из-за его чудесного org-mode, а чтобы узнать, как "натравить" gcc на файл с кодом, достаточно тридцати секунд в гугле.
>> No.44764 Ответ
>>44761
Во-первых, в scanf %d используется для целых чисел, для флоатов используй %f;
Во-вторых, как тебе сказали выше, присвоение вместо сравнения в if;
В-третьих, у тебя для k = 1,2,3 всегда будет выводится сообщение про аутиста, используй else if вместо if;
В-четвертых, если ты ввел неправильную команду, все равно выведется мусорный результат, используй return 1 после сообщения об ошибке;
В-пятых, опять же в printf %d вместо %f.

И, наконец, никогда, запомни, НИКОГДА не используй условия и циклы без скобок.
>> No.44765 Ответ
>>44763
Вся суть этих чудаков. Чтобы натравить gcc достаточно, а что такое стат. анализ мы не знаем. Лучше конвеншены по написанию кода почитай. На Линуксе есть тоже IDE, как минимум QtCreator и что-то от джетбрейнов.
>> No.44766 Ответ
>>44763
Если ты используешь gcc, то запускай его с флагами -Werror -Wall.
Можешь еще -Wextra -Wpedantic добавить.
>> No.44767 Ответ
>>44764
>>44766
Огромное спасибо! Всё получилось.
>> No.44768 Ответ
>>44760
Не знаю, можно ли назвать это красивым http://paste.ofcode.org/NkRunu2RSL5tMyAhQ6CKX5 но уж понятно точно.
>> No.44769 Ответ
>>44768
Нет, стало менее понятно и красиво чем тот код с хабра. Получилось как с goto только запутанней. Собстственно, вот тот код с хабра:
if (a)
{
	A;
	goto L3;
}
L1:
if (b)
{
L2:
	B;
L3:
	C;
	goto L1;
}
else if (!c)
{
	D;
	goto L2;
}
E;
Между прочим, switch позволяет прыгать по своим меткам внутрь скоупа. Почему ты этим не воспользовался? Так можно эмулировать goto через switch намного точнее http://melpon.org/wandbox/permlink/BNgIOyXOoavAVtMI
>> No.44771 Ответ
>>44768
И да, вот более точный порт goto на switch
#define START 0
#define L1 1
#define L2 2
#define L3 3
     
unsigned int label = START;
  
while (true)
{
	switch (label)
	{
	        case START:
		if (a)
		{
			A;
			label = L3; break;
		}
		case L1:
		if (b)
		{
		case L2:
			B;
		case L3:
			C;
			label = L1; break;
		}
		else if (!c)
		{
			D;
			label = L2; break;
		}
		E;
		return 0;
	}
}
Тернартные операторы мне кстати не очень нравятся, ифы куда понятней. Хотя можно short-circuit evaluation сделать, чтоб еще запутанней было.
Короче, вердикт такой: эти трюки со свичем не делают код более понятным, чем с goto. К тому же goto будет явно быстрее работать, если компилятор не сможет заоптимизировать это как следует. Свичу надо проверять на все возможные стейты перед тем как прыгнуть на свою метку, а в случае if(условие) goto метка, никакого свича вообще не нужно, можно сразу прыгать на метку, не нужно выставлять значение некоей переменной, которую потом свич будет у себя проверять и на основе этого делать переход на свою метку. Т.е. в оптимизации тоже проигрыш.
>> No.44773 Ответ
>>44771
> Свичу надо проверять на все возможные стейты
Не всегда. Очень часто оптимизируется в табличный переход.
>> No.44774 Ответ
>>44765
CLion платный, про возможность community edition они ничего вроде не говорили. Так что два стула либо QtCreator, либо Eclipse с плагинами.
Хотя вроде еще какие-то совсем простые иде были.
>> No.44777 Ответ
>>44773
Branch predictor для табличных переходов ( enwiki://Branch_predictor#Prediction_of_indirect_jumps ) не во всех процах реализован и это будет медленней, чем обычный if(условие) goto метка.
>> No.44778 Ответ
>>44771
Ладно, о вкусах не спорят. Я у себя в коде goto видеть не хочу, а к таким switch как к модели конечного автомата привык, если тебе понятнее с goto, то ладно. Вопрос с оптимизацией никого не интересует в 99% случаев.
>> No.44779 Ответ
>>44769
Я не воспользовался потому что я написал тупейший перевод блоксхемы в код, там даже состояние init есть, абсолютно бесполезное. Просто пример, как можно легко и непринуждённо переводить схемы в код, без goto.
>> No.44781 Ответ
>>44778
Дело не во вкусах. Дело скорее всего в том, что кто-то прочитал в книжках "goto плохо, goto нельзя", преподаватели сказали "goto плохо goto нельзя" и человек в эту догму слепо поверил. Ничего плохого в goto нет, если им не перебарщивать. switch твой мало чем от goto отличается. А от всякой там религиозной неприязни (Дейкстра сказал что considered harmful значит нигде и никогда нельзя это goto использовать) советую избавлять свою голову. Дейкстра писал это в 1968 году во времена фортрана, когда из-за кучи всяких натыканных отовсюду goto и меток, код был трудночитаемый и трудносопровождаемый.
>> No.44782 Ответ
>>44779
Этот твой свич - тот же goto, только записанный по-другому, более извращенным способом
>> No.44783 Ответ
>>44781
>>44782
Спасибо, не надо меня вербовать в сторонники goto. Мне удобно пользоваться тем, что я написал, мне без разницы, как там что работает в ассемблерном коде так вообще всё одинаково выглядит, разве что кроме switch, для меня это выглядит лучше и понятнее. За 5 лет ни разу не возникла потребность в goto, не исключаю, что может возникнуть в будущем. Так что всё-таки это дело вкуса и есть, мне удобно не использовать goto, менять эту привычку я не намерен разве что принятый в компании стиль потребует.
>> No.44785 Ответ
>>44783
Да никто никого не вербует. Пишите как хотите. Просто switch в данном случае вообще ничем и никак не лучше, чем goto.
>> No.44787 Ответ
>>44783
И еще такой вопрос. Предположим что есть все та же блоксхем, и там был сделан цикл. И надо уметь из середины цикла куда-то в совершенно левое место уметь выпрыгивать.

for(size_t i = 0; i < 100; i++)
}
   некий_код;
   некий_код;
   if(условие) goto метка;
   некий_код;
   некий_код;
}
for(size_t i = 0; i < 100; i++)
}
  некий_код;
  некий_код;
  if(условие) goto метка;
  некий_код;
  некий_код;      
}
   break используется в цикле для других целей, им прерывается выполнение этого самого цикла. И твоя конструкция со switch уже не будет работать. Придется делать некие усложнения
for(size_t i = 0; i < 100; i++)
}
  некий_код;
  некий_код;
  if(условие) {do_jump_switch = true, break;};
  некий_код;
  некий_код;      
}
if (do_jump_switch) break; // переход на тот switch
   А если циклы вложены друг в друга, надо по выходу из каждого цикла ее проверять?
Вот например если два вложенных цикла:
for(size_t i = 0; i < 100; i++)
}
  некий_код;
  некий_код;
  for(size_t j = 0; j < 100; j++)
  }
    некий_код;
    некий_код;
    if(условие) {do_jump_switch = true, break;};
    некий_код;
    некий_код;      
  }
  if (do_jump_switch) break; // выпрыгиваем отсюда
  некий_код;
  некий_код;      
}
if (do_jump_switch) break; // переход на тот switch
Разве это можно назвать удобным и читаемым? А если есть две точки выпрыгивания из многократно вложенных циклов в разные места? Все еще считаешь что switch удобней будет?
>> No.44788 Ответ
>>44787
С открывающими скобками напутал, но ладно, думаю и так все понятно
>> No.44789 Ответ
>>44787
Ну вот собственно на сишке goto в трёх случаях и юзают - выход из пары-тройки вложенных циклов (иначе флагоёбство как в твоём коде), эмуляция исключений (аля goto fail) и FSM внутри одной функции.
>> No.44790 Ответ
>>44774
Еще Code::Blocks есть.
>> No.44791 Ответ
>>44790
Неуместное упоминание.
>> No.44792 Ответ
>>44790
Я вообще в виме, обмазанном плагинами, пишу.
>> No.44793 Ответ
>>44787
Нет, ты не понял. Я не говорю, что goto запрещён, в таком случае он осмысленен, просто у меня есть некоторый опыт работы с C++, за который такой ситуации не возникало ни разу, вот и всё. Очень часто можно по ситуации придумать адекватное решение без goto. Я же не спорю с тобой, что goto не нужен совсем, просто веду к тому, что почти всегда можно обойтись без него вполне нормально, что приветствуется
>> No.44794 Ответ
>>44789
Ну да, эмуляция исключений это отдельный разговор, в C это очень плохо поддерживается, как по мне, все эти setjmp/longjmp ещё хуже goto.
>> No.44795 Ответ
>>44793
> просто у меня есть некоторый опыт работы с C++, за который такой ситуации не возникало ни разу, вот и всё.
Расскажи побольше про свой опыт работы. Под какие ОС, какие задачи приходилось решать? Был ли числодроб какой-нибудь (численные методы, вот это все)? Доводилось ли писать что-нибудь низкоуровневое под микроконтроллеры?
Просто есть такие задачи, где goto будет очень уместен.
>> No.44796 Ответ
>>44790
Не знал, что он кросс-платформенный. Но вообще да, тоже неплох.
>> No.44804 Ответ
Как разобраться с новыми стандартами и глубинами поюсов? Скажем, STL контейнеры я знаю хорошо, про всякие лямбды, умные указатели и более базовые вещи в курсе. Может, есть какой познавательно образовательный ресурс, где более тонкие вещи собраны и удобно расписаны, чтобы не шариться по cppreference и stackoverflow?
>> No.44805 Ответ
>>44794
Исключение в плюсах это довольно тяжеловесный механизм, раскрутка стека вся эта. Без него вполне можно обойтись. В ассемблере так точно можно, восстановив стекфрейм нужный (хранить указатель на нужное место в стеке где стекфрейм который нам нужен). Языки высокого уровня такой возможности не предоставляют напрямую. Хотя есть еще заморочки с современными процами http://www.agner.org/optimize/microarchitecture.pdf
> The P1 has no return stack buffer, but uses the same method for returns as for indirect jumps. Later processors have a return stack buffer. The size of this buffer is 4 in the PMMX, 8 in Atom, 12 in AMD k8, 16 in PPro, P2, P3, P4, P4E, PM, Core2 and Nehalem, and 24 in AMD k10. This size may seem rather small, but it is sufficient in most cases because only the innermost subroutines matter in terms of execution time. The return stack buffer may be insufficient, though, in the case of a deeply nesting recursive function. In order to make this mechanism work, you must make sure that all calls are matched with returns. Never jump out of a subroutine without a return and never use a return as an indirect jump.
>> No.44816 Ответ
Есть ли тут настоящие Доброкодеры которые бы мне помогли с простейшей задачей?
Надо написать программу - часы со стрелками на c++, с использованием допотопного WindowsForm.
К сожалению препод все еще использует деревянные счеты и почтовых голубей, поэтому QT, MFC, SFML не вариант.
>> No.44817 Ответ
>>44805
Какой смысл без них обходится, если при выпадании исключения уже, всё равно, поздно пить Боржоми, и надо искать ошибку и что-то чинить? И ты никогда не выбросишь больше одного исключения за несколько секунд(миллионы лет с точки зрения процессора и оперативы) времени. Ну и зачем это всё? И что значит "в плюсах это довольно тяжеловесный механизм"? Он где-то эффективнее реализован?
>> No.44818 Ответ
>>44816
MFC подопотопнее WindowsForms будет.
>> No.44825 Ответ
>>44816
Помочь или написать за тебя?
Вообще часы со стрелками (как те, что в настройках) - это вроде один из стандартных компонентов.
>> No.44827 Ответ
>>44825
Ну у меня ничего не выходит, кроме тонн ошибок.
Конечно за меня никто ничего писать не будет.
Думал может у кого есть уже готовое, мало ли, старое от старых лаб и курсачей остаться могло.
Задачи они во всех ВУЗах СНГ одинаковые же, и не меняются с 2004-2007гг.
>> No.44834 Ответ
>>44827
> Задачи они во всех ВУЗах СНГ одинаковые же
Ты упорот в хлам.
>> No.44835 Ответ
>>44817
> Какой смысл без них обходится, если при выпадании исключения уже, всё равно, поздно пить Боржоми, и надо искать ошибку и что-то чинить?
Ну если исключение это такая внештатная ситуация, и после исключения программа должна упасть, так зачем они тогда вообще нужны? Берем пишем особую функцию, которая все ресурсы освобождает и делает exit(1); без всяких там раскруток стека и прочей ерунды.
А если исключения используются для для управления.... Впрочем, за меня уже по этому поводу написано http://www.stolyarov.info/guestbook#comment-820
>> No.44836 Ответ
Файл: 1280px-CallStackFrame.png
Png, 214.77 KB, 1280×967 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
1280px-CallStackFrame.png
>>44817
Проблема еще в дурацком плюсовом рантайме. Если наплевать на это, на ассемблере например можно придумать альтернативный, намного более эффективный способ обработки исключений. Можно изменить способ организации стека, например выделить отдельный стек для адресов возврата, отдельный для локальных переменных. Плюсы и си вообще довольно ограниченные языки, их нельзя назвать ни низкоуровневыми, ни высокоуровневыми, например в них нельзя сделать две точки входа в одну подпрограмму(функцию), нет удобных средств, предоставляющих ХОТЯ БЫ на этапе компиляции возможность работать с AST для нормального метапрограммирования (а не этого плюсового убожества с шаблонами и SFINAE). Вот эти всякие RTTI это вообще отдельный повод для моей нелюбви к плюсам. Типа вот у нас есть статически-типизированный язычок, нормально все, передаем конкретные типы в конкретную функцию которая именно с таким типом может работать. Но нет, это уже не модно, давайте лепить к типам метаинформацию, чтоб как в джаваскриптах можно было писать одну функцию и пусть оно там само думает, что за типы мы куда передали, и в рантайме выкручивается. Нет чтоб как в хаскелях сделать Хиндли-Милнера, чтобы все статически выводилость. И это программисты?
>> No.44837 Ответ
>>44835
> Ну если исключение это такая внештатная ситуация, и после исключения программа должна упасть, так зачем они тогда вообще нужны?
Чтобы программа упала, а не продолжила работать неправильно. Потому что продолжить тихо работать неправильно - гораздо хуже.
> Берем пишем особую функцию, которая все ресурсы освобождает и делает exit(1); без всяких там раскруток стека и прочей ерунды.
Нам надо не положить всю программу, а только положить её кусочек и вне кусочка провести обработку ошибок. Ещё как минимум надо сообщение об ошибке вывести. В ряде случаев надо, чтобы программа таки продолжила работать, но какой-то её кусок должен потухнуть. Например, если при обработке каких-то заданий в очереди, одно из заданий упало с ошибкой. Или если упала отрисовка одного элемента.
> А если исключения используются для для управления....
То производительность будет не единственной твоей проблемой. Но ещё и нечитаемый код, делающий непредсказуемые вещи, который потом не дополнить и не исправить, ну ты понял. Исключения - для обработки ошибок. Правда, иногда ошибка - понятие растяжимое, но суть в том, что исключение - это что не должно происходить в твоей программе или её составной части вообще, но произошло.
>> No.44838 Ответ
>>44836
> И это программисты?
Да. Остальные люди не лучше.
>> No.44854 Ответ
>>44836
Зачем две точки входа в 1 и туже функцию? Не могу представить когда это необходимо. RTTI нужен для динамик каста и отключаеться ключами компиляции https://msdn.microsoft.com/en-us/library/we6hfdy0.aspx для студии. auto для вывода типов на этапе компеляции. Да возможности работать с AST на этапе компиляции реально не хватает. Но шаблоны покрывают 90% из того что требуется остальные 9.9% можно покрыть используя питон и манипулируя с исходниками до компиляции. Что даст отдельный стек для переменных отдельный для адресов возврата? Как узнавать к какой области видимости переменные относятся? А насщет плюсов ты не прав на нем можно забраться очень высоко в плане абстракций, иногда мне кажеться что даже выше чем жавке и питону.
>> No.44855 Ответ
>>44854
Извини, я безграмотное быдло и пишу с ошибками: насщет -> насчет
>> No.44866 Ответ
>>44854
> Что даст отдельный стек для переменных отдельный для адресов возврата?
Погугли вирус Морриса и как он работал со стеком на тогдашних m68k и VAX.
>> No.44868 Ответ
>>44866
Имееш ввиду переполнение буфера с последующей перезаписью адреса возврата? Подобная проблема есть и в современных программах, но так же есть рекомендации как писать код чтобы избежать подобной проблемы. Алсо отдельный стек под адреса возврата не поддреживаемый аппаратно только усложняет подобные атаки но не исключает их.
>> No.44875 Ответ
Имеется ли возможность переписывания функций без наследования? У меня есть массив с объектами одного типа, но мне необходимо, чтобы один метод был у всех объектов разный. Как можно поступить? Мне на ум приходит только один вариант: создать еще один класс, а в нем все необходимые функции, и затем через свитч определять, метод какого объекта нужно вызвать, и вызывать метод нового класса, соответствующий данному объекту. Но тут как-то много проблем возникает. Есть ли еще варианты?
>> No.44876 Ответ
>> No.44877 Ответ
>>44875
Ну и ещё лямбды собственно. Это в С++11 только. До лямбд нередко использовались т.н. функторы - объекты с переопределённым "()". Это имитация лямбд по сути. Ещё есть указатели на функцию - это уже чистый Си.
>> No.44909 Ответ
Пишет вам быдлокун из шараги. Немного умею в матан, алгоритмы и электронику, но совершенно ничего не смыслю в прикладном программировании. А очень хотелось бы. На всякий случай имею билдер, qt, VS и RAD, но для меня это просто экзешники в папках, не более. Начинал читать "с++ шаг за шагом" и "QT 5.3; профессиональное программирование на qt". Переписывал примеры со страниц в ide и потом долго возился с библиотеками, компиляторами и еще какими-то штуками, которые порождали ошибки. GUI вообще вызывает приступы паники. На каждой среде свои свистелки, свои библиотеки. Понятия не имею, как подступиться к кодерству.

Я это всё к чему: посоветуйте, пожалуйста, среду, в которой новичку проще всего разобраться. Задолбался метаться между билдером 2003го года и QT последнего издания. В зависимости от целей приходится с одной среды на другую прыгать.

Да, это всё не моё, но мне без этого никак. Жизнь требует знания и умения решать задачи на плюсах.
>> No.44912 Ответ
>>44909
Почему VS не используешь? В окнах она, пожалуй, самая дружелюбная к новичкам.
> В зависимости от целей приходится с одной среды на другую прыгать.
Это что за цели такие?
>> No.44914 Ответ
>>44912
> Это что за цели такие?
Когда я вообще не знал, как окна делать, возникла потребность строить графики. Девушка из соседней группы рассказала, как это в РАДе смастерить. Курсовые собирал по образу и подобию чужих работ в qt. Билдер сегодня использовал, чтобы брату показать отличия плюсов от их школьного паскаля.
Получается, дело не в целях а в возможности найти полуготовые решения. Допустил неточность, пардон.
> Почему VS не используешь?
Да х его з. Стою просто как осёл между разными стогами сена и не знаю к какому пойти. Ну и еще возникло ощущение, что там в оконных приложениях больше параметров прописывать надо.
>> No.44915 Ответ
>>44914
Для графиков к курсовой можно gnuplot попробовать.
>> No.44916 Ответ
>>44915
Спасибо.
>> No.44928 Ответ
>>44909
Советую выкинуть эти студии и взять GCC или Clang (mingw если винда, но лучше всеж в GNU/Linux окружении). Если нужна иде - бери куте креатор (но для студентолаб оно как правило совершенно не нужно).
>> No.44929 Ответ
>>44854
> Зачем две точки входа в 1 и туже функцию? Не могу представить когда это необходимо.
Это необходимо если ты пишешь под микроконтроллер, и тебе надо сделать 2 функции которые делают почти одно и то же и ты видишь, что две функции можно сшить в одну, а другую функцию можно сделать через прыжок в середину функции, сделав при этом нестандартное соглашение вызова(calling convention) и переопределив некоторые переменные, определяющие поток выполнения. Когда у тебя в одной функции заинлайнена другая функция, и ты не хочешь или не можешь(места мало) определять такую функцию по-нормальному, тебе только и остается что прыгнуть по адресу заинлайненого куска другой функции в середину другой функции. И внезапно, это будет эффективно т.к. есть большая вероятность, что тот кусок машинного кода есть в кеше инструкци. Современные компиляторы таких жесктих извратов обычно не позволяют. Хотя я вот видел, что нечто подобное делает оптимизатор Keil, он, если видит две похожие функции, может делать такие переходы в середину другой функции. Но программист в явном виде так делать не может. Процедурное программирование, знаете ли. Кроме того, сам стандарт языка Си (С++ тоже унаследовал это свойство) по стандарту не допускает(не описывает) возможность создания произвольных соглашений вызова (способов передачи аргументов в вызываемую функцию) для каких-либо архитектур. Это дано. В 32-битных виндовсах есть несколько подобных способов, типа stdcall fastcal cdecl, в GCC и MSVC есть специальные ключевые слова чтоб выбирать способ передачи аргументов при вызове функций, но эти способы зашиты прямо в копмилятор, и добавить свои способы я могу только лишь изменив исходный код компилятора или пропатчить бинарник(в случае с MSVC только бинарник патчить). http://www.agner.org/optimize/calling_conventions.pdf вот тут описаны всевозможные соглашения вызова. Кроме того, нет никакого унифицированного способа, описывающего правила манглинга. Кроме того, механизм обработки исключений опять таки нельзя никаким образом описывать чтоб создать свой собственный легковесный механизм исключения, который бы был вот при таком-то случае более оптимальный чем тот, который по-дефолту вшит в тот компилятор, который я решил использовать.

Цитата:
> Если бы, к примеру, исключения символизировались не типом объекта, как это сделано в C++, а, например, адресом в памяти (то есть делаем глобальную переменную произвольного типа, в ней же храним информацию об обстоятельствах исключения, а кидаем не "объект произвольного типа", а адрес этой переменной, и ловим исключение не по типу, а путём указания глобальной переменной, отвечающей за данный вид исключения), реализация стала бы проще в разы, и рантайм бы в разы уменьшился. Вон на уровне чистого Си есть setjmp и longjmp, они, по ходу, вообще ничего в программу не втаскивают, и, больше того, даже не являются средством языка, обычные библиотечные функции, правда их реализация зависит, конечно, от платформы и компилятора, но это уже детали.
Конец цитаты.

Кроме того, стандартом никак не предусмотрено чтобы можно было описывать правила упаковки структур (#pragma pack например, но это - специфичные расширения компилятора). Даже нет никакого общепринятого правила выравнивания полей структур для одной конкретной архитектуры т.е. в разных компиляторах для одной архитектуры они могут быть разными. http://www.viva64.com/ru/b/0009/ (вот тут http://www.agner.org/optimize/calling_conventions.pdf это тоже описывается). А еще.. всего не упомянуть, чего мне не хватает. Например я хочу уметь выставлять чтоб стек у меня рос не вверх а вниз, сделать несколько стеков с разной гранулярностью, в одной пусть хранятся байты, в другом 4-байтовые числа, в третьем можно хранить адреса возврата например, чтобы их нельзя было переписать из-за возможного переполнения буфера, и все это чтобы ASLR чтобы.

Кроме того, нет никакого способа влиять на то, что компилятор считает UB а что не считает. Например если происходит переполнение знаковой переменной в цикле, все может быть очень плохо. В clang даже придумали особый механизм который бы ловил UB-ы, для этого есть опция -fsanitize=undefined http://melpon.org/wandbox/permlink/sxhPQXOCEDtM42pS
Я еще много могу понаписывать, но думаю достаточно. Все это я к тому, что нормальным низкоуровневым языком ни Си ни плюсы считаться не могут. Впрочем, нормальными высокоурвневыми языками их тоже считать нельзя.
Про выравнивание данных и гранулярность - http://konishchevdmitry.blogspot.com/2010/01/blog-post.html
> RTTI нужен для динамик каста и отключаеться ключами компиляции https://msdn.microsoft.com/en-us/library/we6hfdy0.aspx для студии. auto для вывода типов на этапе компеляции.
RTTI как и динамик каст - не нужен. Это всякие там жаваскрипты могут себе такое позволить. Но вроде как у С++ немного другая ниша, зачем в него тащить динамическую типизацию? Впрочем, я уже запутался. В последних стандартах туда вообще черт знает что понапихивали, лямбды какие-то, constexpr-ы. Бардак какой-то.
A auto это просто статический вывод типов самим компилятором на основе того, как именно его проинициализировали, я не вижу в этом ничего плохого.
> Да возможности работать с AST на этапе компиляции реально не хватает. Но шаблоны покрывают 90% из того что требуется остальные 9.9% можно покрыть используя питон и манипулируя с исходниками до компиляции.
> А насщет плюсов ты не прав на нем можно забраться очень высоко в плане абстракций, иногда мне кажеться что даже выше чем жавке и питону.
Что-то я не понимаю, откуда все эти цифры 90% 9.9% ? С потолка? Ну возьмем достаточно простую задачу: допустим что надо мне считать в бигинтах, и хочу я читать формулы из stdin от пользовалетя вида x=ac+bc и чтоб был eval() который бы генерировал машинный код по этой формуле (без всяких стековых калькуляторов, мне надо чтоб быстро) и чтобы оптимзировало на уровне арифметических преобразований, например выражение x=ac+bc превращало в x=c*(a+b), выражение sqrt(a^2) становилось abs(a) и так далее, и компилировал бы чтобы в машинный код, чтобы я мог через эту формулу применить к множеству чисел. Пользователь дает таблицу
a=123, b=342, c=456;
a=777, b=333, c=666
....
и программа должна посчитать x для каждой строки, притом сделать это быстро. Таблица может быть задана в каком-нибудь двоично-сериализованном виде, не обязательно в виде строк. Надо чтоб работало в виндовсе, масосх, андроиде и на айпэдах всяких(на ARM). Как это сделать? Какими плюсовыми средствами предлагаете решать эту задачу? Нет таких средств, надо самому костылить какой-то JIT (тащить LLVM и куски компилятора с его кучей абстрактных представлений ради калькулятора попросту неоправданно). А какой-нибудь жабаскрипт или лисп эту проблему решает запросто, там есть eval(). Может это будет не так эффективно, как если кто-то будет городить кастомный JIT и писать опкоды в исполняемый сегмент памяти, потом оттуда что-то вызывать, зато это будет БЫСТРО и ИЗ КОРОБКИ. Разве высокоуровневый язык должен требовать таких выкрутасов? Высокоуровневость плюсюв это миф. Но и низкоуровневым его назвать у меня язык не поворачивается. Язык Си еще можно с натяжкой назвать языком среднего(но ни в коем случае не низкого) уровня, а плюсы, плюсы вообще вне этих категорий. Это язык фиг-знает-какого-уровня, это сишка, которую подперли кривыми ООП-костылями, шаблонами(почти-препроцессором, который однако встроен в компилятор,).
Ах да, Александреску придумал что на этих шаблонах можно метапрограммировать, лол. Ну это примерно как если б я нашел у себя кусок битого стекла от бутылки и придумал что этим можно как увеличительным стеклом пользоваться. И пофиг что при это неудобно, можно порезать себе руки, что оно плохо фокусирует, и что обычное увеличительное стекло, не говоря уже о микроскопе, работает куда лучше.


Кстати, насчет указателей в отдельном стеке, эта идея не нова.
Даже был такой процессор https://geektimes.ru/post/205168/

Цитата
> В 432-ой была реализована защита укзателей, что конечно же, очень правильно. Однако все указатели хранились в отдельном сегменте. Назывался он program reference table. Машина контролировала, что находиться в этом сегменте могут только указатели. И нигде, помимо него, указателей больше не могло быть. Я почитал их бумаги. Они говорят, что всё это очень здорово, но очень неудобно указатели в отдельном сегменте держать.
> Указатели должны рассылаться как обычные данные. Мы так и сделали. У нас указатели – просто данные. А 432-ая держала указатели в отдельном сегменте. Это приводило к ужасным результатам. Например, для индексации массива требовалась трёхадресная операция. Нужно было указать три операнда: положение указателя на массив в поинтерном сегменте, положение индекса в сегменте данных и снова смещение в поинтерном сегменте, по которому требовалось записать результат. Но самое ужасное даже не это, а то, что при входе в процедуру, у операционной системы запрашивалось четыре сегмента! Два сегмента для параметров: поинтерный и скалярный. И два сегмента для локальных данных: тоже поинтерный и скалярный.
Конец цитаты.

Подобный подход может навсегда похоронить всякие там переполнения буфера и кучу других подобных способов похакать ваше приложение из-за ошибки в алгоритмах. Там еще в той статье описывается модель с тегами для разных типов и прочее
>> No.44930 Ответ
>>44929
> сделав при этом нестандартное соглашение вызова(calling convention) и переопределив некоторые переменные, определяющие поток выполнения.
Кривовато написал. Чтобы это понять, надо уметь читать (и желательно писать) на ассемблере. Суть в том, что надо записать в нужные регистры и нужные места в стеке некоторые переменные, и прыгать в середину некой функции, чтоб это все сработало так, будто бы эти значения были выставлены самим тем предшествовавшим куском кода функции, в середину которой мы прыгаем.
>> No.44931 Ответ
>>44837
> Чтобы программа упала, а не продолжила работать неправильно. Потому что продолжить тихо работать неправильно - гораздо хуже.
Чтобы программа упала, надо чтобы она упала.
> Нам надо не положить всю программу, а только положить её кусочек и вне кусочка провести обработку ошибок.
Откуда гарантии, что ошибка, вследствии которой возникло исключение, не испортила память где-нибудь еще? Есть какие-то гарантии изолированности? Например ошибочный кусок кода мог где-нибудь глубоко подпортить стек или хип, после чего корректная работа программы после исключения вообще невозможна. Так почему бы просто не упасть? Или предлагаешь в отдельном треде запускать любой код, в котором потенциально может быть ошибка? Тогда зачем вообще исключения и их обработка, просто прибить тред и все
>> No.44932 Ответ
>>44931
Точных гарантий, естественно, нет. По-твоему, если ты пароль вводишь неправильно, то должен весь комп перезагружаться? Или если нет места на диске, то торрент-клиент должен вырубиться? И скайп при потере подключения тоже должен закрываться?
> Или предлагаешь в отдельном треде запускать любой код, в котором потенциально может быть ошибка?
Ты в курсе про классы и функции? Прикинь, они позволяют писать изолированный код. Может и не абсолютно гарантированно, но тем не менее. Если всё делать грамотно, то практически.
> мог где-нибудь глубоко подпортить стек или хип
Можно подумать, что весь твой код на сотни тысяч строк состоит из одних портянок на асме, которые лезут в свой собственный стек что-то ковырять. Это был бы полный космос или я чего-то не понял.
>> No.44933 Ответ
>>44932
> По-твоему, если ты пароль вводишь неправильно, то должен весь комп перезагружаться? Или если нет места на диске, то торрент-клиент должен вырубиться? И скайп при потере подключения тоже должен закрываться?
Т.е. исключения бросаются не на случай программной ошибки (например когда кто-то неправильно написал код расчета траэктории самолетика и там что-то на ноль поделилось) а на случай, который впринципе может произойти, и то что он произойдет -- не означает что в программе закрался баг? А почему б такие случаи не проверять обычным условием?
> Ты в курсе про классы и функции? Прикинь, они позволяют писать изолированный код. Может и не абсолютно гарантированно, но тем не менее. Если всё делать грамотно, то практически.
Ну окей, если у меня произойдет переполнение индекса когда я заполняю массив, аллоцированный в хипе, мне эта изоляция поможет? Вот позаписывается там мусор куда-то, потом сработает другая функция, которая использует данные, аллоцированные в том испорченном месте, потом что-то где-то поделится на ноль или произойдет еще что-нибудь нехорошее, и будет исключение. Отлично! Тот код, перед тем злополучным делением на ноль, мог еще что-нибудь напортить в памяти. И это не разгрести никак, исключения тут не помогут.
А работа с массивом (или там std::vector) с проверкой границ на каждый чих - она попросту неэффективна. Пилите тогда уже какой-нибудь верификатор, который бы доказывал невозможность из одной функции испортить данные, которые будут использовать какие-то другие функции
> Можно подумать, что весь твой код на сотни тысяч строк состоит из одних портянок на асме, которые лезут в свой собственный стек что-то ковырять. Это был бы полный космос или я чего-то не понял.
Да пусть в хип лезут, в хипе тоже есть что подпортить.
>> No.44934 Ответ
>>44933
> А работа с массивом (или там std::vector) с проверкой границ на каждый чих - она попросту неэффективна
ВЫ ВСЁ ВРЁТИ!!!! команда сравнения занимает один такт всего-навсего
>> No.44935 Ответ
>>44933
> std::vector
Range-based циклы можно в этих большинстве циклов использовать. Т.е. получится проверка границ не на каждый чих. Да и вообще тебе экономия на спичках важнее корректности работы программы?
>> No.44936 Ответ
>>44934
> команда сравнения занимает один такт всего-навсего
А, ну да, особенно если мне надо много этих проверок делать, и если мне надо чтоб мне компилятор это векторизовал
> Range-based циклы можно в этих большинстве циклов использовать.
Это может быть не ranged-based цикл
> Т.е. получится проверка границ не на каждый чих.
А в плюсах в этом std::vector есть Array Bounds Check Elimination http://www.ssw.uni-linz.ac.at/Research/Papers/Wuerthinger07/Wuerthinger07.pdf
> Да и вообще тебе экономия на спичках важнее корректности работы программы?
Привести примеры, когда это будет не экономией на спичках? Ну например какие-нибудь драйверы, системные библиотеки, кодеки. Или если ты пишешь что-то реалтаймовое под микроконтроллер и у тебя тупо нет времени делать эти тупые проверки.
>> No.44938 Ответ
>>44936
В линупсах и для микроконтроллеров пишут драйверы не на крестах, а на сишке (в которой нет std::vector, поэтому ты будешь пердолиться с указателями как твоей душе угодно). На крестах же пишут ынтырпразный код, для солидных компаний, поэтому проверки на границы подразумеваются как данность, за попытку их обхода к тебе подойдет тимлид или прожект менеджер и, недовольно качая головой, скажет: "Что ты творишь, Антон, уволиться захотел?".
>> No.44939 Ответ
>>44938
Хотел бы я посмотреть на драйвер видеокарты например, с проверками на границы массива. (драйвера на плюсах пишут, да)
(и под микроконтроллеры тоже можно на плюсах писать)
>> No.44940 Ответ
>>44938
И кстати, зачем плюсы в ынтырпрайзе, если есть сишарп и жава?
>> No.44941 Ответ
>>44939
Только что склонировал репу git://anongit.freedesktop.org/nouveau/xf86-video-nouveau, нихера не плюсы, чистая сишка.
>> No.44942 Ответ
>>44934
Не капсболди ну.
>>44933
Ок, не юзай эксепшены. Вообще тогда. Или юзай для обработки ошибок или вообще не юзай. Всё лучше чем алгоритмы с эксепшенами.

Под ошибкой понимается ситуация, которая является внештатной с точки зрения одного изолированного куска программы, какого-то модуля или функции.
> А работа с массивом (или там std::vector) с проверкой границ на каждый чих - она попросту неэффективна.
Это ещё нужно доказать бенчмарками. В итоге у тебя в 99% это даст прирост скорости в пару наносекунд или даже вообще не даст в ряде случаев. Особенно смешно будет, если в итоге окажется, что проц большую часть времени ждёт жёсткий диск, как это бывает у некоторых программ.
Но даже и так обработка исключений не серебряная пуля, но количество проблем с ней уменьшается, тем не менее.

На бордах всегда так много любителей сэкономить пару тактов и байтов, а в жизни потом, с-ка, встречаешься с таким... Не могут правильно обращаться со структурами данных, делают безумные вещи со строками и регулярками, генерируя и парся восемь раз одно и то же, мемлики, не могут создать индексы. std::vector с проверкой границ потом виноват во всём.
>> No.44943 Ответ
>>44940
Всё это уже сотни раз обсуждалось.
>> No.44944 Ответ
>> No.44945 Ответ
>>44944
Все равно драйверов на плюсах единицы, то что их можно на их писать, не говорит что на них пишут какое-то значимое кол-во.
>> No.44954 Ответ
>>44933
В современных интеловских процессорах есть такая штука как Intel MPX, это, например, mov с одновременной проверкой на границы. Специальные пары регистров для границ, все дела. Насчёт производительности не знаю, но явно быстрее чем до этого.
>> No.44955 Ответ
>>44954
И? В любом случае эти проверки будут медленней, чем их отсутствие. И вообще, есть куча процессоров(армы, мипсы всевозможные для встраиваемых применений), где этого нет и скорее всего никогда не будет.
>> No.44956 Ответ
>>44955
> В любом случае эти проверки будут медленней, чем их отсутствие.
Не в любом.
>> No.44960 Ответ
>>44956
Т.е. с лишними проверками на каждом шаге может быть быстрее или с такой же скоростью как без них? Ну может конечно, если создатели процессора так специально сделают, лол. Но здравый смысл подсказывает мне, что проверки ну никак не смогут ускорить т.к. это дополнительные лишние операции на каждом шаге. В лучшем случае оно будет с такой же скоростью работать(если кому-то не придет в голову мысль специально замедлять когда кто-то без проверок делает, только зачем?). Короче, надо посмотреть на то, как это все реализовано схемотехнически и на уровне микрокода, а так смысла в разговоре об этом нет никакого.
>> No.44961 Ответ
>>44960
Почти всё вокруг работает медленнее чем проц. в каких-то случая проц будет большую часть времени сидеть без дела и ждать, пока данные тянутся из оперативной памяти или с диска. Если программа работает с диском, то проц может почти постоянно простаивать. Плюс конвеер или ядра могут в какой-то момент вдруг помочь. Ты чёрта с два предскажешь, как будет в итоге. В результате может вообще ничего не выгореть, если тебе не повезёт.
>> No.44963 Ответ
>>44715
А что сложного написать самому?
Рисовать можно в SFML или SDL, если с openGL лень возиться.
>> No.44975 Ответ
>>44961
> Почти всё вокруг работает медленнее чем проц. в каких-то случая проц будет большую часть времени сидеть без дела и ждать, пока данные тянутся из оперативной памяти или с диска.
А в каких-то - нет. У меня вот браузеры Firefox и Chrome влегкую могут 100% процессора нагрузить (Chrome может даже все ядра нагрузить т.к. там по процессу на вкладку). Если туда еще эти проверки на границу добавить - представляю как там все затормозится. Или возьмите какие-нибудь современные игры, которые тоже довольно-таки сильно нагружают процессор. Или возьмите например dwarf fortress который тоже очень требовательный к процессору, особенно когда куча всякого бегает(кошки расплодились, была такая проблема в старых версиях). Или что-нибудь числодробительное. Полно ПО которое упирается именно в процессор.
Я считаю что сам подход "обезопасить код добавляя куда попало проверки" - ущербный. Решать проблему с ошибками надо через автоматическое доказательство теорем, всякие там STM солверы которые бы математически доказывали, что вот в таком-то случае индекс никогда не выйдет за границы выделенной памяти, т.е. код полностью безопасен и его можно использовать. Для C(но не для C++) есть Frama-C, о возможностях можете судить например по вот этому видео https://www.youtube.com/watch?v=J_xgbO5-32k
Есть еще всякие coq, agda - которые "proof assistants based on dependent type theory". Если сильно постараться, можно даже теорему Ферма доказать через это(она уже доказана человеками), и потом например написать код, который пытается через перебор с бигинтами опровергнуть теорему Ферма, и посредством этого доказательства можно доказать, что вот этот перебирающий код в принципе никогда не завершится, т.е. решить проблему останова в частном случае(в общем случае она, как известно, нерешаема).
>> No.45061 Ответ
Файл: NqA7QIV.jpg
Jpg, 60.19 KB, 1024×1192 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
NqA7QIV.jpg
Котаны, помогите с решением задач, пожалуйста

1)Написать функцию, которая будет принимать в качестве аргумента одномерный массив целых чисел и возвращать разность между наибольшим и наименьшим значениями элементов.

2)Написать функцию инициализирующую двумерный массив целых пользовательскими значениями.

3) Написать функций mystrcpy(), mystrcat(), mystrlen(), mystrcmp() (две на выбор), которые будут работать аналогично библиотечным функциям strcpy(), strcat(), strlen(), strcmp().

4) Написать функцию, рекурсивно вычисляющую сумму ряда вида Σ 2x/x!, где х принимает дискретные значения от 0, до 20 с шагом 1.
>> No.45062 Ответ
>>45061
Помогли.
>> No.45063 Ответ
>>45062
А чего ты хотел? Во-первых, доска относительно безлюдна, и за полчаса тебе вряд ли накидают ответов и решений. Во-вторых, задачи простые, шаблонные и откровенно скучные, поэтому их решение не принесёт анону никакого удовлетворения и удовольствия. Зачем в таком случае их решать?
>> No.45064 Ответ
>>45061
Звучит как выройте мне яму или прополите мне огород.
>> No.45065 Ответ
>>45063
Я даже не понял, это анон сам иронизирует над нами или это другйо анон над ним иронизирует. С написания поста прошло сраные полчаса, нудные ясельные задачи и абсолютно никакого старания и вникания анона. Та вы оборзели? За такое берут деньги. И не одна, а четыре задачи. Хорошо, что за всю группу не надо решать.
>> No.45066 Ответ
>>45065
Какой ещё другой анон? Он просил котов помочь?
Просил? Просил. Ну вот, это коты ему так помогли.
>> No.45068 Ответ
>>43511
Этот мужик на картинке я, лол.
>> No.45471 Ответ
Реквестирую какой-нибудь нормальный учебник по OpenGL. В гугл просьба не посылать, так как гигантское количество туториалов написаны чересчур по-уебански либо по старым версиям, которые сейчас уже не нужны. Учитывая, что я почти не разбираюсь в этом, хотелось бы, чтобы совет дал тот, кто в этом разбирается, и имел дело с изучением. Заранее спасибо.
>> No.45472 Ответ
>>45471
Лучше брать официальную документацию технологии на их сайте и совмещать её с теоретическим учебником по теме, который бы мог учить в более оторванной от конкретики форме.
>> No.45473 Ответ
>>45471
Алсо, есть же у них и на сайте книги:
https://www.opengl.org/documentation/books/
То что советуют сами OpenGL - это всегда самое лучшее, что есть по OpenGL.
>> No.45474 Ответ
>>45472
>>45473
Спасибо. Странно, что я не догадался до такого.
>> No.45551 Ответ
>>43511
Есть какой-то способ перехватывать события от evdev в linux input, и блокировать только определенные типы событие? Все остальные передавать дальше по цепочке в неизменном виде.
Пример:
мышка генерит события перемещения курсора и нажатия на кнопочки. Можно перехватить и заблочить события нажатия на кнопочки, а все остальное передать дальше?
>> No.45569 Ответ
Крестобоги, выручайте. Частью программы должна быть функция, переводящая число из десятичной системы в двоичную. Написал это: http://pastebin.com/U7wjR5Za

Хочу проверить, например, на числе 19. Компилируется без ошибок, но вывод у программы пустой. Что происходит и где моя ошибка?
>> No.45570 Ответ
>> No.45571 Ответ
>>45569
> unsigned int mod;
> while (mod != 0)
Инициализация где? Нормальный компилятор как минимум варнинг выдавать должен.
>> No.45572 Ответ
>>45569
https://ideone.com/wZ9tNY я делаю особую, ассемблерную магию.
>> No.45623 Ответ
Как часто мне доводилось наблюдать людей, которых вроде как бы учили C++ в вузах, а на деле оказывается, что они даже C не знают. Например, если показать им, как можно делать callback, передавать в функцию указатель на другую функцию, их реакция обычно "ого, а разве в C так можно делать?". Очень часто они не понимают, чем отличается массив указателей на массивы от двухмерного массива, адресной арифметики. А ведь это и к плюсам и к Си относится. Я уж не говорю о том, чтобы спрашивать что-то про устройство vtable(таблиц виртуальных методов). Складывается впечатление, что их там только учат использовать STL, типа всяких vector, list, притом сами они реимплементировать с нуля эти контейнеры не осилят. Доколе?
>> No.45624 Ответ
>>45623
Что значит доколе? Любому мало мальски нетривиальному занятию надо обучаться. Не бывает так, что вчера человек ничего не знает о программировании вообще и C++ в частности, а сегодня, хоп, и готов сеньёр девелопер.
>> No.45625 Ответ
>>45624
В униках они дрочат залупу, а работодатель - учи. А потом почему в России одна нефть.
>> No.45626 Ответ
>>45625
Мне кажется профессиональному программированию в университетах и институтах не обучают в принципе, с этим пора бы уже смириться.
>> No.45627 Ответ
>>45626
Нигде не учат. Берёшь книгу и штудируешь. И, сдаётся мне, относится это не только к программированию.
>> No.45628 Ответ
>>45627
Книжки тоже ничему не учат.
>> No.45629 Ответ
>>45628
Книжки учат отлично. Но брать можно только авторитетные проверенные книги. И потом, ясен пень, надо всё прочитанное отработать упражнениями, сидя у себя дома перед компом.
>> No.45632 Ответ
Вы все чмошники. Изучаю C++, копая программы из упражнений в ида про, по ходу увлекаюсь реверсом. Продолжайте дальше ныть на образование, неувлеченные немотивированные чмошники.
к:тоску видевшей
>> No.45633 Ответ
>>45632
как грубо, вернись на оранжевый форум, пожалуйста

Я, например, получил такое образование физик-теоретик, Московский университет, которое никогда не светит большинству профессиональных кодеров и 99 % анонов. Тем не менее абсолютно всё, с чем сталкиваюсь на работе и использую, осваивал сам. Нет, это не сложно, просто это другое. Даже учитывая появление сейчас модных CS-факультетов ситуация кардинально не изменится, по тому что там будут продолжать учить, если угодно, теоретической информатике как науке, а в реальной жизни в последствии ты будешь получать деньги за высокоразвитые "мартышкины скиллы", то есть умение писать без ошибок или с минимальным их количеством в синтаксисе, знание различных библиотек, фреймворков, технологий и умение всё это совмещать в одном проекте.
>> No.45634 Ответ
>>45633
За гомологии пространств хотя бы пояснить сможешь, картофан?
>> No.45635 Ответ
>>45634
Максимально на пальцах для тебя.

Заводишь (ко)цепной комплекс, заводишь последовательность отображений между пространствами/группами в нём, и n-ая группа (ко)гомологий -- это фактор ядра n-го отображения по образу (n+1)-го.

Если что-то непонятно -- спрашивай.

Но я сильно удивлён этому вопросу ни с того ни с сего в треде, посвящённому C++. Если это оффтоп в попытке затроллить меня, вновь посоветую уйти от нас на оранжевую борду.
>> No.45647 Ответ
Зачем могкт понадобиться указатели на функции?
Что с нии полезного сделаешь?
>> No.45648 Ответ
>> No.45649 Ответ
>>45635
> оранжевая борда
проиграл
>> No.45651 Ответ
>>45647
Примерно тоже самое, что с функторами в С++(объектами с переопределённым ()) или с лямбдами.
>> No.45694 Ответ
>>45651
На пальцах, специально для меня. Что такое функторы и лямбды?
>> No.45697 Ответ
>>45694
Лямды, они же функции обратного вызова (с т.ч. практики программирования, не с т.ч. теоретической математики) - это функции, которые хранят в переменных и могут передавать в качестве параметра или возвращать в качстве возвращаемого значения. Это нужно, чтобы делать многозадачные функции, которые могут где-то внутри какие-то произвольные вещи делать.
В крестах было три способа делать их, есть лямбды на уровне синтаксиса в С++11, есть их имитация через переопределение оператора (), есть синтаксис родной для С.
>> No.45774 Ответ
Вот смотрите. Есть у меня опенгл. В нем я создал 2 шейдера:
"in vec3 VertexPosition;"
"in vec3 VertexColor;"
"out vec3 Color;"
"void main() {"
"Color = VertexColor;"
"gl_Position = vec4(VertexPosition, 1.0);"
"}"
и
"in vec3 Color;"
"out vec4 FragColor;"
"void main() {"
"FragColor = vec4(Color, 1.0);"
"}"

Затем я задаю координаты точек и цвета для них. И нужные переменные привязываю с помощью функций:
glBindAttribLocation(programID, 0, "VertexPosition");
glBindAttribLocation(programID, 1, "VertexColor");

Затем идет типичный цикл отрисовки, в котором присутствуют следующие функции:
glVertexAttribPointer(0, 3, GLFLOAT, GLFALSE, 0, (void*)0); //первый ноль указывает на VertexPosition
glVertexAttribPointer(1, 3, GLFLOAT, GLFALSE, 0, (void*)0); //1 указывает на VertexColor

Вроде все должно идеально выполниться, как и написано в туториале. Но хуй. Треугольник как был черный, так и остался. Что здесь не так? Если надо, я могу весь код программы показать. Заранее спасибо.
>> No.46058 Ответ
Нужна рекурсивная функция, которая выполнится N раз, на каждом шаге получая в аргументы результат своего выполнения. Как вообще вызывать функцию, получающую от самой себя аргументы? Читал про рекурсивные функции у K&R, читал про рекурсивное вычисление факториала, но там всё не то.

Вопрос скорее даже по C.
>> No.46059 Ответ
>>46058
Отбой вопросу, разобрался без этого изврата.
>> No.46134 Ответ
Почему возникает ошибка "Невозможно открыть заголовок QValueList" в Qt?
>> No.46135 Ответ
>>46134
<Ванга-мод>
QValueList.h not found
</Ванга-мод>
>> No.46138 Ответ
>>46135
Да, а почему он не найден?
>> No.46145 Ответ
>>46138
Компилишь Qt3 код в 4м кьюте. Гугли.
>> No.46153 Ответ
Ламерский вопрос можно?

Вот пример хэш-функции для пользовательского класса:

struct Record {
string name;
int product_code;
};

struct Rhash {
size_t operator()(const Record& r)
{
return hash<string>()(r.name) ^
hash<int>()(r.product_code);
}
};

unorderedset<Record, Rhash> myset;

Что это за синтаксис:
> hash<string>()(r.name)
?

Зачем столько скобок? hash - функциональный объект, как я понял. Первые скобки - это конструктор безымянного объекта? А вторые - operator()? Или что?

Я запутался.

Во всех примерах так, а я такого раньше не видел.
>> No.46154 Ответ
>>46153
Первые скобки - это перегужаемый оператор. Это перегрузка операторов. В С++ () - это тоже оператор, который можно вызвать от объекта. Он потому и называется "функциональный объект", что у него () перегружен. Не знаю, как ты ещё это понял. На месте `()` могло стоять `=`, `[]` или ещё что-то.
>> No.46155 Ответ
>>46153
> Первые скобки - это конструктор безымянного объекта? А вторые - operator()?
Да.
>>46154
Не пиши на доброчане когда пьяный.
>> No.46156 Ответ
>>46155
> Не пиши на доброчане когда пьяный.
Ну бывает.
>> No.46232 Ответ
Почему `const char a1[3] = "ixs";` выдает ошибку из-за отсутствия места под нулевой символ, а `const char a1[3] = {'i', 'x', 's'};` — нет?
>> No.46233 Ответ
>>46232
В строках же ещё терминальный символ, нет? Так что там с ним четыре выходит.
>> No.46234 Ответ
>>46233
Ну, да, так а во втором случае его получается нет? И при этом при желании его можно задать, дописав `'\0'`?
>> No.46235 Ответ
>>46234
> так а во втором случае его получается нет?
Разумеется, его там нет. В обычных массивах же его нет.
>> No.46236 Ответ
>>46235
Ясно, спасибо. А зачем он тогда вообще нужен, если в обычных массивах конец массива значит и без него успешно определяется?
>> No.46237 Ответ
>>46236
Он нужен для работы с строками, потому что строка это масив символов с терминатором, очевидно же.
мимо
>> No.46238 Ответ
>>46237
Ну, ладно.
>> No.46239 Ответ
>>46236
> в обычных массивах конец массива значит и без него успешно определяется
Разве? Как?
>> No.46240 Ответ
>>46239
Действительно, похоже никак. Ну тогда все ясно.
>> No.46268 Ответ
Файл: 14720935908570.jpg
Jpg, 60.89 KB, 604×406 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
14720935908570.jpg
>>46232
У тебя конпелятор слишком заботливый. Гнусный не ругается.
>> No.46269 Ответ
>>46268
Не ругается, говоришь?

$ gcc ./lal.cc
./lal.cc: In function ‘int main()’:
./lal.cc:4:24: error: initializer-string for array of chars is too long [-fpermissive]
const char a1[3] = "ixs";
^
$ cat ./lal.cc
#include <stdio.h>
int main()
{
const char a1[3] = "ixs";
//char a1[] = "ixs";
printf("%s\n", a1);
return 0;
}
>> No.46275 Ответ
>>46269
Стаковерфлоу говорит, что ты забыл про '\0', который терминирует строку.
>> No.46276 Ответ
>>46275
Не важна кто там что на СО говорит, факт что гцц ругается.
>> No.46280 Ответ
>>46276
> гцц ругается
gcc ругается потому, что строка не влезает в массив.
> Не важна кто там что на СО говорит
Важно то, что посоны с СО правы.
>> No.46282 Ответ
>>46280
Ты мугичкой чтоли читаешь?

>>46268
> Гнусный не ругается.
>> No.46283 Ответ
>>46275
Слышал звон.
>> No.46292 Ответ
>>46232
Потому что "ixs" - там нуль-терминированный символ, который не влазит. А в случае {'i', 'x', 's'} все влазит. В то же время, если компилировать с "ixs" сишным компилятором, никаких проблем нет
>>46268
> У тебя конпелятор слишком заботливый. Гнусный не ругается.
Если компилировать как плюсы - ругается
>> No.46367 Ответ
http://pastebin.com/ML5BYfJ4
Почему при вызове элемента B, находящегося в массиве типа A вызывается функция базового класса? Тип же B, она просто обязана перезаписаться. Как исправить? В сишарпе все нормально работает.
>> No.46368 Ответ
>>46367
https://ideone.com/27qJ2d

Почему? А потому что vector<A> кастует экземпляры подкласса B к A. Плюсы и сисярп имеют мало общего, это два совершенно разных ЯП.
>> No.46369 Ответ
>>46368
Спасибо, я понял.
>> No.46872 Ответ
Надо с SFML написать игру. Если честно, то ничего не понял, в чем заключаются правила. Может поясните?
Суть: «Вращающий квадрат». Дан квадрат размером 4 х 4 клетки, в которых с помощью датчика случайных чисел расставлены буквы от А до Р. Упорядочить буквы в квадрате по алфавиту. Квадрат имеет подквадраты, которые можно вращать по часовой стрелке на одну клетку. Подквадраты имеют размер 2 х 2 и указываются номером левой верхней клетки.
>> No.46873 Ответ
Файл: Untitled.png
Png, 4.58 KB, 400×400 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
Untitled.png
>>46872
Очевидно же.
>> No.46874 Ответ
Файл: 1.png
Png, 14.62 KB, 667×556
edit Find source with google Find source with iqdb
1.png
Файл: 2.png
Png, 8.93 KB, 503×230
edit Find source with google Find source with iqdb
2.png

>>46873
Ок, спасибо, разобрался, но пишу в Builder'е. Пикрелейтед - функция для перемещения матрицы 2х2 в зависимости от кнопки на 90 градусов. И теперь для каждой кнопки нужно прописать следующие значения переменных:

кнопка 1: row=0, column=0;
кнопка 2: row=1, column=0;
кнопка 3: row=2, column=0;

кнопка 4: row=0, column=1;
кнопка 5: row=1, column=1;
кнопка 6: row=2, column=1;

кнопка 7: row=0, column=2;
кнопка 8: row=1, column=2;
кнопка 9: row=2, column=2;

Вопрос: как это делается, как не прописывать вызов функции для каждой кнопки, а засунуть все это в цикл или что-то подобное?
>> No.46898 Ответ
Доброано помоги. Как реализовать динамический массив с переменной длиной, через маленькие массивы с постоянной длиной, связанные в список, так, чтобы потом можно было без особых проблем добавлять, удалять и обращаться к элементу с конкретным индексом?
>> No.46902 Ответ
>>46898
Это хеш-таблица обыкновенная.
>> No.47282 Ответ
Когда выделяешь указателям на массив память с помощью new, и удаляешь её c помощью delete, где хранится размер массива? Оно ведь где-то записано, ведь компилятор, когда он выделяет и удаляет память, должен знать, что память от сих до сих занята. Почему нельзя получить значение размера массива средствами C++? Я вот читаю учебник, но чёта там вообще этот момент не раскрывается.
>> No.47283 Ответ
>>47282
Это всё зависит от конкретного компилятора, размер хранится где-то глубоко в кишках и недоступен простым смертным. Но для подобных манипуляций есть например std::vector.
>> No.47285 Ответ
>>47283
У меня задача из разряда числодробилок. Вектор будет работать чуть-чуть, но медленнее.

Как лучше всего создать динамический трёхмерный массив? С точки зрения наиболее высокой скорости вычисления.
>> No.47286 Ответ
>>47285
Ну я не знаю, создай структуру, в которой будет указатель и размер, делов-то.
>> No.47287 Ответ
>>47286
Да это понятно. Я спросил, чтобы понять, как это работает, потому что вроде бы значение размера массива есть, но узнать его почему-то нельзя. И почему в Ц++ так сделано, не понятно.
>> No.47288 Ответ
>>47287
Так оператор "new", он же просто-напросто вызывает функцию "malloc()", и только-то.
А в ней не предусмотрено хранение длины (прав доступа и других полезных данных), т.е. в этой части C++ всё как в 60-70 годы.
>> No.47290 Ответ
>>47288
> и только-то
И вызывает конструктор.
>> No.47291 Ответ
>>47285
> У меня задача из разряда числодробилок. Вектор будет работать чуть-чуть, но медленнее.
Не будет.
"Преждевременная оптимизация - корень всех зол".
Сперва воспользуйся профайлером, потом оптимизируй.

> Как лучше всего создать динамический трёхмерный массив?
Как динамический одномерный.
>> No.47301 Ответ
>>47291
> Как динамический одномерный.
Но тогда при доступе к каждому элементу будет выполняться две операции целочисленного умножения и ещё минимум 2 операции сложения. Не слишком ли высоки издержки?
>> No.47302 Ответ
>>47301
> Не слишком ли высоки издержки?
Чтобы узнать, высоки издержки или нет, ты должен использовать "профайлер" (profiler) - инструмент, который определяет, сколько именно времени твоя программа тратит на вычисление каждой конкретной функции. Если профайлер покажет тебе, что на функцию доступа к трехмерному массиву программа затрачиват 50% времени от всего времени своей работы (или даже 10%) - тогда, конечно, эти издержки высоки и хранение массива нужно будет оптимизировать.
На практике, даже в совершенно числодробильных задачах доступ к массиву будет занимать ничтожную долю времени (<<1%). Поэтому можно уверенно считать, что издержки пренебрежимо малы, до тех пор, пока не доказано обратное.
>> No.47303 Ответ
>>47301
Нет, эти издержки настолько малы, что на современных архитектурах процессоров они даже могут вообще не появиться из-за тонкостей работы кешей и конвееров. Попытка подрезать пару таких операций тут и там вообще не гарантирует хоть какого-то даже очень малого ускорения, может даже стать рандомно медленнее. Это всё работает гораздо сложнее чем просто "послдовательность операций, каждая из которых ест сколько-то времени"
>> No.47434 Ответ
>> No.47569 Ответ
суп анон , у меня проблемка с stdin, пытаюсь читать из него при помощи fread из потока читается только когда наберается количество запрашивамых байт, после чего запрашиваю еще в цикле , опять же freadом , вопрос, как определить конец ввода в потоке, есть ли у него какой буфер?
>> No.47601 Ответ
>>47569
http://cppstudio.com/post/1641/

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

P.S. Всегда твой анонимус.
>> No.47606 Ответ
Создаю объект:
angle = new ModelAngle();
fprintf(stderr, "angle = %X\n", angle);

В его конструкторе:
ModelAngle::ModelAngle()
{
fprintf(stderr, "ModelAngle = %X\n", this);
}

И что ж я вижу?
ModelAngle = 1F31160
angle = 1F31180

Ну и при удалении:
Error in `./a.out': double free or corruption (out): 0x0000000001f31180

Почему адреса не совпадают?
>> No.47639 Ответ
>>47606
полностью код давай
>> No.47687 Ответ
Файл: TsT.png
Png, 8.13 KB, 664×327 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
TsT.png
>>47606
хмм, у меня совпадают
''
#include <stdlib.h>
#include <stdio.h>

class TestObj{
public:
TestObj();
~TestObj();
};

TestObj::TestObj(){
printf("InConstruct = %X\n",this);
}

TestObj::~TestObj(){

}

int main(){
TestObj *Tb = new TestObj();
printf("Out construct = %X\n",Tb);
return 0;
}
''
>> No.47688 Ответ
>>47601
Не не помогло, приходится считывать по байту и проверять на символ перевода строки чтоб прекратить сканирование , видимо все таки перевод коретки не помечает stdin eofом
>> No.47689 Ответ
Файл: 148977764521.jpg
Jpg, 75.31 KB, 550×400 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
148977764521.jpg
>>47606
и правда скинь полный код класса
>> No.47690 Ответ
Файл: TsT.png
Png, 8.14 KB, 662×328 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
TsT.png
>>43511
#include <stdlib.h>
#include <stdio.h>

class TestObj{
public:
TestObj();
~TestObj();
};

TestObj::TestObj(){
printf("InConstruct = %X\n",this);
}

TestObj::~TestObj(){

}

int main(){
TestObj *Tb = malloc(sizeof(TestObj));
printf("Out construct = %X\n",Tb);
return 0;
}

смотрите маллок тоже вызывает конструктор , каким образом это происходит? разве он не просто память в куче выделяет ?
>> No.47692 Ответ
>>47688
Тебе до EOF или до EOL читать надо? Для первого делай `fread` и смотри, что он возвращает. Для второго есть `fgets`: читаешь и проверяешь последний символ на '\n' ( http://man7.org/linux/man-pages/man3/fgets.3.html ).
>> No.47693 Ответ
>>47690
У меня gcc, clang на Ubuntu и VS2017 не вызывают. Алсо, все три не компиляются из-за того, что `malloc` возвращает `void *`, и нужен явный каст.
>> No.47694 Ответ
Файл: 149367520233.jpg
Jpg, 109.00 KB, 453×600 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
149367520233.jpg
>>47692
> Тебе до EOF или до EOL читать надо? Для первого делай `fread` и смотри, что он возвращает.
я так и делал но программа зависает пока в потоке не наберется запрашиваемое количество байт, я просто пытался сделать что то как раз вроде fgets только ручками.

>>47693
ааййй сории, это я печенько, я забыл пересобрать и поэтому запускал старый проект с new, maloc ничего и правда не выделяет
>> No.47700 Ответ
>>47694
> пока в потоке не наберется запрашиваемое количество байт
...или не встретится EOF. Что логично.f

Можешь посмотреть, как это в том же glibc сделано: https://code.woboq.org/userspace/glibc/libio/iogetline.c.html#38
>> No.47726 Ответ
>>47700
> ...или не встретится EOF. Что логично.f
в том то и есть прикол , что в stdin не встречается EOF

> Можешь посмотреть, как это в том же glibc сделано
не обьясняй , я ничерта ни понимаю что там из под этих подкастов вызывается и чтоот куда берется
>> No.47727 Ответ
>>47726
Ctrl+D, не?
>> No.47803 Ответ
Подскажите нубу как подключить и использовать cpputest https://github.com/cpputest/cpputest к проекту на qt.
Заранее благодарен.
>> No.47809 Ответ
>>47803
сам спросил сам отвечаю
в ProjectName.pro добавить строку
LIBS+= -lCppUTest -lCppUTestExt

в main.cpp подключить

#include <CppUTest/CommandLineTestRunner.h>

в функцию майн

return CommandLineTestRunner::RunAllTests(argc, argv);

далее создать папку test и в ней файл Test_MyCode.cpp важно начинать файл с слова Test

внутрь Test_MyCode.cpp

#ifndef TESTSERIALPORTH
#define TESTSERIALPORTH

#include "CppUTest/TestHarness.h"
#include "CppUTestExt/MockSupport.h"

TEST_GROUP(MockDocumentation)
{
void teardown()
{
mock().clear();
}
};

void productionCode()
{
mock().actualCall("productionCode");
}

TEST(MockDocumentation, SimpleScenario)
{
mock().expectOneCall("productionCode");
productionCode();
mock().checkExpectations();
}

#endif // TESTSERIALPORTH

да если у вас убунта саму библиотеку ставить так sudo apt-get install cpppunit
>> No.47874 Ответ
Файл: CPP_missingtool.PNG
Png, 43.16 KB, 683×560 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
CPP_missingtool.PNG
Установил QtCreator, вместе с ним установился mingw. Ну норм, mingw вещь полезная. Теперь хочу писать на С++ без использования Qt. В Netbeans с С++ плагином указал путь к установке mingw, которая идет в комплекте с Qt. Пишет пикрилейтед. Я так понял, нужен msys2? ( http://www.msys2.org/ ). Он будет доставлять свой билд mingw? Мне куча билдов mingw не нужно, я запутаюсь...

Может, в Qt Creator можно не использовать Qt и Qmake?
>> No.47875 Ответ
>>47874
Можно создавать проекты руками и компилить руками, а QtCreator только править файлы. Например.
>> No.47878 Ответ
>>47874
> Теперь хочу писать на С++ без использования Qt. В Netbeans с С++ плагином указал путь к установке mingw, которая идет в комплекте с Qt.
Лол, а "Новый проект без использования Qt" в Creator'е ты не сумел найти?
>> No.47977 Ответ
Есть вот такой вот код:

m_Handle = CreateFile(
port->c_str(), // Name of the Port to be Opened: Example: "\\\\.\\COM10"
GENERICREAD | GENERICWRITE, // Read/Write Access
0, // No Sharing, ports cant be shared
NULL, // No Security
OPEN_EXISTING, // Open existing port only
FILEFLAGOVERLAPPED, // overlapped/nonoverlapped IO. might be worth setting to 0
// or FILEATTRIBUTENORMAL or FILEFLAGOVERLAPPED
NULL); // hTemplate must be NULL for comm devices
if(mHandle == INVALIDHANDLE_VALUE) {

char errcode [30];
uint8_t lngth = sprintf(errcode, "Error opening port: %05d", GetLastError());
throw ConnectionException( new string(errcode, lngth) );
}

Вот эта запись throw ConnectionException( new string(errcode, lngth) ); не приведет к memory leak? Я потом не удаляю явно объект std::string ...
>> No.47978 Ответ
Файл: dc_code_cpp.JPG
Jpg, 62.20 KB, 1109×336 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
dc_code_cpp.JPG
Есть вот такой вот код:

m_Handle = CreateFile(
port->c_str(), // Name of the Port to be Opened: Example: "\\\\.\\COM10"
GENERICREAD | GENERICWRITE, // Read/Write Access
0, // No Sharing, ports cant be shared
NULL, // No Security
OPEN_EXISTING, // Open existing port only
FILEFLAGOVERLAPPED, // overlapped/nonoverlapped IO. might be worth setting to 0
// or FILEATTRIBUTENORMAL or FILEFLAGOVERLAPPED
NULL); // hTemplate must be NULL for comm devices

if(mHandle == INVALIDHANDLE_VALUE) {

char errcode [30];
uint8_t lngth = sprintf(errcode, "Error opening port: %05d", GetLastError());
throw ConnectionException( new string(errcode, lngth) );

}

Вот эта запись throw ConnectionException( new string(errcode, lngth) ); не приведет к memory leak? Я потом не удаляю явно объект std::string ...
>> No.47979 Ответ
Файл: dobrochan_code2.PNG
Png, 12.84 KB, 409×327 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
dobrochan_code2.PNG
Передаю в конструктор одного класса экземпляр-ссылку другого класса, чтобы потом использовать внутри. internal_C1 нигде в ходе работы не потеряется (см. картинку)?
>> No.47980 Ответ
Файл: dobrochan_code2_V2.PNG
Png, 14.35 KB, 489×379 - Нажмите на картинку для увеличения
edit Find source with google Find source with iqdb
dobrochan_code2_V2.PNG
>>47979
Придумал трюк с malloc при передачи экземпляра. Так можно?
>> No.47982 Ответ
>>47980
Чому нет? Только помни про срезку при передаче потомка по указателю базового класса.
>> No.47992 Ответ
>>47982
что за >срезку при передаче потомка по указателю базового класса
>> No.47997 Ответ


Пароль:

[ /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/ ] [ Главная | Настройки | Закладки | Плеер ]