Это копия, сохраненная 7 июля 2017 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Ответы на все вопросы - http://en.cppreference.com/w/ http://www.cplusplus.com/reference/
Прошлый >>979476 (OP)
Теги: кресты, cpp
Твой мозг уже там
да
В фирмах, где макакам выдают мониторы моложе 2002 года, и которые больше 19" в диагональ, обычно строку делают в 120 символов. Но, можешь не волноваться, тебя даже в самый закудышный бодишоп не возьмут.
Добавил СОМ-ссылку Microsoft Office 14.0 Object Library и Microsoft Word 14.0 Object Library, ничего не выходит.
Пробовал делать по учебнику MS Visual C++ 2010 в среде .NET. Нихуя не вышло. Шляпа срочно нужна для диплома, но в С++ я ни в зуб ногой.
Вместо этого выводит знаки вопроса или какую-то мишуру, в зависимости от шрифта. В то время как тот же набор данных выводится обычным cout безупречно, да и другие символы вроде латинских букв выводятся WriteConsoleOutbutA как надо. В чем проблема?
Вообще на крестах это писать - ад, лучше всего на c# бахнуть или js+activex.
Вот по шарпу мануал
https://support.microsoft.com/en-us/help/316384/how-to-automate-microsoft-word-to-create-a-new-document-by-using-visual-c
Сказал прыщеклован, у которого и в 2017 ничего, кроме командной строки, толком и нет.
Это какой-то пиздец, господа. Переключил я шрифт сосноли с точечного на lucida - пробелы превратились в вопросики. Запустил программу еще раз - теперь все нормально отпечатано, в lucida. Поменял шрифт на точечный, точно такой же, какой был изначально - и теперь символы выглядят нормально и на изначальном шрифте. Запустил программу в третий раз - и теперь все символы отображаются на изначальном шрифте без переключения шрифта. Что это за хуйня? Как это работает? Как мне создать приложение, которое, например, выводит cp437 на дефолтном шрифте с любого компьютера без ебатни со шрифтами, бесплатно без формочек и юникода?
Ах тыж блять, запустил программу в четвертый раз, и снова вместо символов пробелы. Что за ебаный пиздец?
Нашел новую деталь: эти символы отображаются как пробелы только в точечном шрифте 8х12. Вернее, не все, а все, кроме вот этого: . Поэтому в моей коробке всегда рисуется только верхний правый угол.
Так вот, в точечном шрифте 7х12 все символы отображаются как , кроме того самого уголочка, который стойко держится в верхнем правом углу. При чем они не только превращаются в треугольники при переключении шрифта, но и остаются такими при перезапуске программы.
5x12 - аналогично.
8x9 - снова пробелы.
6х9 - то ли снова треугольники, то ли запятые какие-то, мелко, плохо видно. Угол на месте.
16x8 - пробелы.
4х6 - походу, треугольники, мелко пиздец.
16х12 - пробелы.
12х16 - ну вот тут уже точно апострофы или запятые развернутые.
10x18 - треугольники.
Продолжаю зоонаблюдения и запрашиваю помощи.
Пиздец, макаба не пускает символы. Короче, угол который отображается - в таблице https://en.wikipedia.org/wiki/Code_page_437 под номером 187. Треугольник - 31.
Нахуя тебе все это сдалось?! Сделай, если уже так надо, свою псевдо-консоль на гуе, если ты там какой-то рогалик пилишь или что. На винде командная строка КОНЧЕНАЯ, это тебе не zsh или bash хотя бы.
Есть какой-нибудь гайд, как так сделать? Был бы премного благодарен.
Ну вот просмотри. Можёт что наковыряешь.
https://code.msdn.microsoft.com/office/CppAutomateWord-28938be1
Вот ещё мануал.
https://support.microsoft.com/en-us/help/316587/how-to-automate-embedded-office-activex-documents-with-c
Гайд хз, но думаю чувак предлагает через winapi создавать окно, сделать его черным, и имитировать командную строку окном с текстовым полем внутри главного окна шириной в всё окно и высотой с 1 символ
Строки должны быть такие, чтобы при их чтении целевой аудитории не приходилось водить горизонтальный скролл туда-сюда. Из этого выходит:
Если ты пишешь говнокод в стол - длина любая.
Если ты в закрытой конторе, и у всех стоят одинаковые мониторы, и никто не пользуется разделением окон - тогда на всю ширину ваших мониторов.
Ширина в 80 символов была придумана хуилион лет назад, когда нужно было выбрать минимально читаемый размер символов для консольных терминалов. Собственно, это просто стандарт, который актуален, если иное не указано.
Лучше, если чтение кода даже не будет заставлять двигать глаза по горизонтали.
В любом случае, правила написания кода нужны для того, чтобы код удобно было читать.
Спермодебилу НИБАМБИТ
> На винде командная строка КОНЧЕНАЯ
Говорят, с полгода назад она начала поддерживать управляющие ASCII-коды. Всего-то 40 лет прошло с момента принятия стандарта.
Я бы ради прикола завел все на OpenGL, но еботы с этим, конечно же, прибавится, хотя, в целом, ничего сложного быть не должно. Плюс опыта в корзину (научишься шрифты рендерить и рисовать полигоны текстурированные).
Я бы, может, такой хуйней сам занялся. Да лень пиздец. Пойду лучше посру.
Если у тебя десяточка, включай WSL и наслаждайся рабочей консолью и соответствующим стандарту компилятором.
google -> line segment intersection
> Стоит ли еще добавить конструктор перемещения и оператор присваивания при перемещении
Вряд ли они знают, что это такое.
Правило пяти нужно для того, чтобы вспоминать о нем, когда класс становится реально сложным.
В твоем примере ты можешь их добавить, чтобы показать что ты о нем знаешь. А так, если бы ты делал это для себя, то не надо.
>> В заочном тестовом задании мне надо было разработать класс
>> было разрешено добавлять свой функционал
Охуеть задачи, одна охуительнее другой.
Хочу читать OBJ файлы, у которых обычно они имеют вид: <тип данных> <данные>
Пока есть идея завести словарь из строковых литералов типов и лямбд для разбора данных.
Получился вот такой пиздец https://pastebin.com/NQvtWifE
Есть идеи получше?
Это аналгеом какой линал?
С таким же успехом можешь использовать указатели на функции, которые можешь разместить в анонимном пространстве имен, вместо того, чтобы использовать функциональные объекты (хотя, расходы будут небольшие, если лямбды помещяются в кусочек выделенной памяти функциональным объектом, однако здесь это не то место, где нужно искать оптимизации).
Наверно, вместо этой тягомотины, что ты написал, проще было бы получать данные через sscanf если уж в c код полез.
Пиздец какой-то, какие-то наложения, числа, перечения. В выводе вообще цифры какие-то, нихуя не понял. Чему вас там учат?
>Чему вас там учат?
Это называется утилизацiя человечишков. Чтобы не мешались под ногами у номенклатурных сынков и дедков со связями в ЦК КПСС.
>новые стандарты принимаются каждые три года, сохраняя при этом полную обратную совместимость с предыдущими.
Несколько неправда.
>если уж в c код полез
Где, например?
Мне наоборот хочется в стиле плюсов делать, только что-то не понимаю что это значит.
Да хоть те же регекспы.
typedef unsigned int zalupa;
То zalupa будет читаться как "unsigned int"?
У меня уже дикий бугурт, ничего непонятно.
Visual Studio 2015 Community, всё есть там из коробки. Проследуйте к шарпоёбам за деталями.
Ай блджад, тредом промахнулся, сорри
``
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
``
Почему адреса не совпадают?
``
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
``
Почему адреса не совпадают?
Ну тут на 8 байт отличается, а не на 32, но всё равно отличается.
Я где-то с наследованием накосячил?
Да, в моём коде у базового класса полей на 24 байта. Вот и разница на 32 байта.
Это же 8 байт - длина указателя vtbl? Или чего? Почему так?
http://stackoverflow.com/questions/22256620/why-pointers-to-the-same-object-have-different-values
По поводу падения программы: на Angle нужен виртуальный деструктор.
Если член класа это вектор. Нужно ли его руками очищать в деструкторе?
И второй вопрос. Есть класс, который содержит некоторые поля и другой объект.
class A {
private:
int x;
B b;
}
Как объект B может получить доуступк х?
Хм, и правда. Но адреса всё равно не совпадают.
То есть указатель на Angle на 8 байт (vtbl?) отличается от указателя.
То есть, указатель на Angle в принципе не должен знать, что этот Angle является ещё и ModelDevice?
И таки да, если изменить порядок наследования, адреса совпадают.
Передаешь в класс B указатель на класс A. Объявляешь хоть где в декларации класса дружественный класс, то есть friend class B; Тогда B будет иметь доступ КО ВСЕМ членам класса А.
>Если член класа это вектор. Нужно ли его руками очищать в деструкторе?
Не нужно. Деструктор вектора сам удалит своё содержимое. Другое дело, если вектор хранит указатели на объекты в куче, которые ты создавал через new. Тогда да, их надо удалять самому.
>Как объект B может получить доуступк х?
Лолникак. Объявить friend class B внутри A. Только по-моему это говорит о том, что ты что-то делаешь неправильно.
>>994098
Спасибо.
>Только по-моему это говорит о том, что ты что-то делаешь неправильно.
Вероятней всего.
У меня следующая проблема. Есть вектор с объектами и все эти объекты должны использовать несоклько общих переменных. Сделать через глобальные переменные - некрасиво. А как правильно?
Probeloblyad is not a men.
Добавь boost_system в линкер
Фишка в чём? У меня программа... работает. Но она не работает под убунтой и вообще на университетских компьютерах. Не работает и в IDEONE (ну, там тоже gcc++).
Я даже почти уверен, что я действительно не прав и то, что программа работает у меня и одногруппников - заслуга, скорее, компилятора, чем моя. Прошу, помогите.
Правильный вывод - на пике.
Текст программы (ну, последнее изменение):
pastebin.com/Ys6u2W9b
Ошибки в IDEONE
Прошлая версия: http://ideone.com/FwMMBa
Последняя версия: http://ideone.com/zdkbHQ
1 Каждое присвоение ей значения
2 Последнее использование переменной
3 Объявление переменной
4 Первое присвоение ей значения
3 и 4 одновременно.
В рализации функции которая начинатеся с 15 строки нет возвращаемого значения, тогда как сигнатура требует. Получается UB (скорее всего все кончается разименованием нулевого указателя) поэтому результаты в разных компиляторах разные. Тот в котором работает (скорее всего) отпимизирует код выбросив нахуй код с UB (хитрожопые оптимизирующие компиляторы такое любят), потому и кажеться что "работает". Если интересно можешь изменить 392 строку на что-то типа cout << endl << a << endl << "TEST" << endl; и запустить на компиляторе на котором "работало" чтобы посмотреть как работает теперь.
Почему она вообще скомпилировалась? Всегда же ругается, если не выводится ничего.
Предупреждения зависят от ключей. Почти что самые параноидальные - -Wall -pedantic для gcc.
Всегда ругался скорее всего статический анализатор твоей IDE. А комплятору похуй. В gcc вроде можно ворнинг включить. Ну и в main стандарт разрешает не писать return - должно добавляться return 0.
Чтобы переменные разрушались, и освобождалось место и другие ресурсы, связанные с переменными (мьютексы, например).
Чтобы ограничить видимость переменной dos_header или чтобы переменная dos_header уничтожилась сразу а не в самом конце выполнения функции (внешнего блока кода).
>>994159
Окей, допустим. Но умножение-то всё равно не правильно работает (в последней версии), а если брать старую, то там всё равно ошибка двойного освобождения памяти. И у меня, хех, всё ещё работает
http://ideone.com/v6ClEO
В нём нет ничего неявного. Фигурные скобки - это блок кода (statement по стандарту, ЕМНИП), а не часть while-if-чототам. while и for могут быть вообще без фигурных скобок.
Это скоуп явный.
> Фишка в чём? У меня программа... работает.
Хуй с два. Компилируется ≠ работает.
>pastebin.com/Ys6u2W9b
Ну полюбуйся на отчёт valgrind-а для твоей "работающей" программы. Куча use after free.
http://paste.ubuntu.com/24616911/
>>994188
Ну, она выдаёт тот результат который нужен - значит работает. Просто не везде и через жопу.
>valgrind
Я даже не знаю, что это. Погуглю.
>use after free.
Ну, это довольно очевидно учитывая ошибки двойного осовбождения в другом компиляторе. Делать-то что? Я не понимаю что я делаю не так. Возможно, потому, что я мыслю категориями языков в которых нет ебучих указателей и ссылок. И где можно спавнить объекты по КД, возвращать объекты(ссылки) на объекты созданные внутри функций и так далее, а они сами уж когда нибудь, когда станут ненужны, исчезнут.
И я всё ранво не понимаю, что происходит :(
> Делать-то что?
Непонятно, зачем в Vector::copy ты выделяешь/освобождаешь память. Судя по логике работы Vector::operator=, copy должна просто копировать из другого массива.
Подумай над этим.
>>994200
Переделал твой copy к такому виду:
void copy(int *v) {
for (int i = 0; i<this->n; i++) {
this->v = v;
}
}
Результат налицо: http://paste.ubuntu.com/24616978/
cpp.sh/4fybt
А тут работает. Только с рандомом что-то не так.
>в Vector::copy
Я его вообще сотру если надо. Он был нужен для того куска который уже переписан иначе.
хм. Когда-то он выглядел именно так. Но, видимо, была другая ошибка и всё равно ничего не работало. А сейчас она исправлена. Спасибо.
Хотя я всё равно не совсем понимаю. C не может хранить объекты? Он удаляет их сразу после завершения функции? Или что?
Я где-то явно писал удаление? о.О
http://codepad.org/hHhWINzD
IDEONE, кажется, лихорадит, Я попробовал запустить здесь с исправленным copy.
Опять ошибается, там где переопределённое умножение (ну, и, соответственно, те же проблемы будут со сложением и прочим. Понять бы что не так и я исправлю их все)
Ну передай указатель на структуру с этими переменными или на каждую переменную, по желанию, в конструктор или через сеттер. И все дела.
Единственное, что я могу понять так это то, что в твоём компилировании он всё же запихивает правельные значения (64-8-8-4), в отличии от codepad, у которого там уже лежит стрёмная хрень. Но это и всё.
http://codepad.org/TwwiR44r
Я вижу ошибки связанные с ostream. Но всё, что я могу придумать - это сделать вот так. И это не поможет с остальным
@return Ничего не возвращает
В конце стоит return, который возвращает.
В начале офигенно сделана проверка на присваивание самому себе. Через оператор ==. Ну, в принципе, сравнивать адрес this с адресом аргумента бессмысленно, т.к. последний передаётся по значению, а не по ссылке.
У Страуструпа, кажется, была имплементация вектора в книге. Почитай, что ли.
Складывается впечатление что тут проще переписать с нуля.
P.S. и принято исключения наследовать от подходящего исключения из стандартной библиотеки и переопределять функцию what(), а не operator<< для исключения.
1. Нужно ли вызывать flush() после каждой записи, зачем он вообще нужен?
2. Что нужно проверять, чтоб понять, что операция прошла успешно? Всякие там good()/bad()?
3. Вообще std::ofstream еще актуален или уже устарел?
4. Позволяет ли он писать внахлёст в середину файла? 5. Чтобы вставить данные в середину файла нужно перезаписать первую половину в новый файл, добавить новые данные, и потом продолжать писать вторую половину?
>@return Ничего не возвращает
>В конце стоит return, который возвращает.
Очевидно, потому, что раньше он ничего и не возвращал. Я за сегодня этот оператор трижды переписал пока у меня хотя бы до умножения стало доходить.
>проверка на присваивание самому себе.
Это не она, хех. Это проверка, скорее, в духе "если у них одинаковая длина и каждое значение одинаково, то ничего присваивать и не нужно"
>P.S. и принято исключения наследовать от подходящего исключения из стандартной библиотеки и переопределять функцию what(), а не operator<< для исключения.
Про это как-то не натыкался, но спасибо, это я бы хотел сделать.
Переписать с нуля? Можно. А толку-то? У меня всё равно будут ошибки связанные с памятью. Потому, что я не понимаю, как работает память. Все эи задания с сололёрнов прохожу, но в итоге ничего не могу вынести. Мне бы сдать это и забыть про кресты, но... эх
>Переписать с нуля? Можно. А толку-то? У меня всё равно будут ошибки связанные с памятью.
Переписать с нуля, глядя в Страуструпа. Чтоб была нормальная работа с памятью. А арифметические операции добавить можно за 10 минут.
Ну, он милый, конечно, но как это поможет мне получить решение?
А если речь про книгу, то не уверен, что я осилю это в столь сжатые сроки. Или там есть конкретно, хм, глава? Статья? в которой все проблемы решены?
ААААА!
http://codepad.org/7cEMqbmp
Ну тут-то что? Вроде и функций никаких нет трогающих память, а всё равно дрянь какая-то выходит.
При том матрицы, с которых я сегодня начал слизывать вектора, потому, что, очевидно, сам совсем бы проблемами не разобрался - работают прекрасно
http://codepad.org/Jlh479m0
но... блять. Как так-то?
Я думал "деструктор - функция которая вызывается в момент уничтожения объекта", которая нужна, собственно, чтоб очистить память. Разве не нужно там удалить эту штуку?
А если не нужно, то почему в деструкторе матриц (см. выше) это делается и всё работает?
:(
Настолько не могу в C, что не понимаю даже шуток про C. Делать-то что?
И чем чревато если я, чисто случайно, действительно решу выпилить все делиты? Потерей памяти при каждом запуске?
Мне кажется, тут move asignment оператор по умолчанию включается, поэтому всё сыпется.
Но я не смог чёт его добавить в этом редакторе каличном.
Если у тебя явно реализован деструктор, move costructor и move assignment не будут сгенерированы.
>Или там есть конкретно, хм, глава?
>>994252
Можно прямо с 18-й начать, в 17-й вода для полных нубов.
потсоны помогите пжалста! Призываю всех топ программистов 10000килорублей/сек Короч есть 2стула 2 файла .cpp с основным говнокодом(класс + main) и .h заголовочный в котором прописана функция получения текущего времени... Как в .cpp файле в классе получить результат отработки файла-функции с временем?
>Как в .cpp файле в классе получить результат отработки файла-функции с временем?
Вызови эту функцию.
>18-й начать
Выглядит не совсем так как мне представлялось. Это хоть та книга?
>>994264
Ещё разок обращу внимание на вопрос. И на "что делать", и на второй.
>Выглядит не совсем так как мне представлялось. Это хоть та книга?
Идёшь по ссылке в ОП-посте и качаешь "Программирование. Принципы и практика использования C++"
блё. Я подумал что ты про \t
действительно
всё. Работает. А теперь я пойду и всё же почитаю книжку. Потому, что про деструкторы я вообще ничего не понял (при их выпиле действительно всё налаживалось, но, как я понимаю, терялись те ячейки что эти векторы занимали).
Спасибо
1. Делать этого каждый раз не нужно, если есть необходимость записывать данные сразу, делай это после всех необходимых записей, то есть когда необходимые данные будут заполнены, потому что частые вызовы снизят производительность, если ты будешь пихать данные маленькими объемами.
2. Можно проверять, бывает всякое.
3. В стандарте никакой замены ему нету, и, в целом, эта хренотень не поддерживает бинарный формат данных, только текстовый, для сериализации, мягко говоря, годится едва ли, а на самом деле вообще бесполезна чуть менее, чем полностью
4. Все, что позволяют выполнять файловые операции ядра ОС, все это поток и может, так что ответ на твой вопрос - ДА, но только не в случае, если ты открыл файл на append, тогда вся запись будет производиться в конец файла, как бы ты не старался перемещать указатель записи.
5. Нихуя не понял. Ты делаешь ofstream::seekp, чтобы перейти в необходимое место, куда ты будешь записывать (указываешь направление и смещение) и потом проталкиваешь данные в поток. И все, в общем-то.
>Нихуя не понял.
Имею в виду, если поток открыт с флагом std::out, то при записи он будет перезаписывать текущие данные файла. В таком случае, чтобы именно вставить, а не перезаписать данные, нужно считать в новый файл до необходимого места, потом вставить новые данные, а потом считать остальное?
И еще вопрос появился: в c++ завезли OpenFileDialog кроме как варианта с MSDN:
https://msdn.microsoft.com/en-us/library/bb776913(v=VS.85).aspx
В 111 строке ты создаёшь временный объект, копируешь его и удаляешь память, указатель на которую остаётся в `a`.
Ты будешь наступать на те же грабли всегда, когда ты будешь копировать вектор. Чтобы этого не было, сделай конструктор копирования или конструктор перемещения.
Пока ты их не написал, они дефолтные - копируют значения слово в слово, включая указатели, новую память они не выделяют.
В твоём коде Vector не может копироваться и перемещаться, поэтому писать надо по-другому:
Vector a(n) - тут не создаётся временный объект.
В строке 206 тоже временный объект.
>И чем чревато если я, чисто случайно, действительно решу выпилить все делиты? Потерей памяти при каждом запуске?
1) Да.
2) Кроме того, все копии созданного вектора будут использовать один и тот же указатель.
>>994321
http://codepad.org/XyP1fsQ9
Вроде тут, после того как тот анон исправил мою copy() нет ошибок. И делиты на своих местах. И, вроде, копирующий конструктор есть. А что там с "одним и тем же указателем" или временными объектами?
говнокод?
Он. Тогда я нихера не понял: ты, вроде, правильно копируешь с выделением второго блока.
Не обращай внимание, я просто твой код не читал, просто тыкнул пальцем в небо.
Ну если каретка на начале файла, то да, он будет перезаписывать содержимое. Если ты хочешь стереть файл перед открытием, то используй опцию std::ios::trunc или как ее там. Если ты хочешь записывать поверх имеющихся данных, просто перемещаешь указатель записи при помощи seekp и все.
Отбой, нашёл.
ньюфаг штоле
Всё, что я выгуглил это вот: https://wiki.qt.io/New_Signal_Slot_Syntax (раздел Disconnecting in Qt5)
> Only works if you connected with the symmetric call, with function pointers (Or you can also use 0 for wild card) In particular, does not work with static function, functors or lambda functions.
>>994505 кун
Я немножко не понимаю твою проблему. Как ты решил, что соединение не рвётся? Как оно вообще может не рваться, если посылающий объект сдох? Точнее, кто посылает данные, если автор сдох?
Нихуя не понял вопрос. char'ы используют для паддингов, нарпример, сетевые структуры в linux'е так задефаны. Если ты используешь char для хранения переменной, то, как правило, компилятор будет выделять под него 4 байта, чтобы выравнивать память для быстрой выборки.
Нет, немного не правильно. Сдох объект со слотом, а объект, посылающий сигнал жив. В качестве слота выступала лямбда. Так вот после того, как объект сдох, этот слот всё равно вызывается. Сейчас я накидаю код.
А как решил, что соединение не рвётся? Прога падает
Нихуя не понял. Нахуй ты мне про char'ы рассказываешь
Чтобы отсоединять сигнал при уничтожении объекта, в контексте которого работает лямбда, ты должен передать указатель на контекстный QObject в качестве третьего аргумента, а четвертым - лямбда функцию. И, в общем-то, все дела. Только смотри, чтобы время жизни захваченных объектов лямбда-функцией не истекло до смерти QObject. Короче, что-то вроде такого:
QWidget firstWidget;
QWodget secondWidget;
QObject::connect(&firstWidget, &QWidget::signal, &secondWidget, []() { lambda_call(); });
Я про те случаи, когда в char нужно хранить предложение.
Например, я щас балуюсь, и чар не принимает в себя больше одного символа.
Блядь, действительно. В глаза ебусь, в доке всё написано. Спасибо, анон
Хм, если обьявить просто
char A;
То можешь сунуть туда только 1 символ, а если уже
char A[1];
То можно всунуть туда даже больше чем в мамку опа. я любя
char - это один символ одна буква. Если ты хочешь хранить много букв, но тебе нужен массив букв char'ов
В чём проблема то?
>без формочек и юникода?
>2017
>без юникода
Прими мои соболезнования раз тебе приходится поддерживать легаси.
В ином случае это диагноз.
Есть очень странная проблема, в интернете нашёл только одну похожую проблему и то не решили.
Есть на форме textBrowser, в него пихаю текст и ссылки ака окно чата.
Ссылки так - ui->textBrowser->append("<a href="+url+">"+url+"</a>");
Обычный текст вот так - ui->textBrowser->append("me# " + message + "\n");
После открытия ссылки, тобиш после void Chat::on_textBrowser_anchorClicked - весь новый текст, который выводится в textBrowser - становится ссылками с юрл последнего нажатого.
Диплом горит, помогите господа.
bump
На удаленке очень много веб-макак, на крестах заебешься искать работу, притом, что быстро найдется хуеплет, который у тебя уведет ее.
Веб-макакой нати работу проще и ебаться про управление памятью, шаблонами и прочим говном не надо. Стоит лишь обмазаться фреймворками, однако, и в этой области свои особенности есть.
>>994766
Ты весь код покажи, тут борда с вангами или все еще со кольшиками, как-никак.
От кода толку тут мало будет. Потому-что в textBrowser текст отправляется коректно и без ссылок. Сам ебаный textBrowser что-то с текстом делает внутри себя. У него там есть какой-то общий объект для ссылок? И сущность ссылки цепляется к тексту? Я хуй его.
https://pastebin.com/syxkiWNn
Какие директивы компилятора нужно использовать, чтобы переменная в в PE-файле была в секции кода, а не инициализированных констант?
Можно ли встроить/переписать себе функции из WinAPI, чтобы не было привязки ко всяким Kernel32.dll, user32.dll, чтоб можно было просто вытащить секцию с кодом из исходного PE файла и вставить её целиком в другую и не ебаться с подгоном адресов функций, импортом и т.п.?
Пикрил, разумеется, забыл
>>993700
Кьют слишком специфичен и своеобразен. Есть ли что-то ориентированное непосредственно на винду?
Я могу прописывать обьявления окон для каждой кнопки, и даже готов писать свой фреймворк, но мне кажется что должно быть что-то несложное для винды типа эмбаркадеровского vcl или дотнетового фреймворка.
Именно поэтому С++ для настолок - полное дно.
Очевидный баг в Qt. Решение:
1) другая версия Qt
2) быстро накатай багрепорт
3) накостыляй какой-нибудь тупое решение типа добавления избыточных </a> в конце каждой ссылки, если это поможет, или ещё что
Слишком много сложных вопросов.
Попробуй пока что в отдельное место выводить текст, потом с него уже загружаться. Заодно проще отладить будет, если что.
Хуй его знает, я сейчас чекнул я себя, под 5.8 все работает, или ты на говне мамонта 4.8 сидишь, а?!
Это даже не легаси, это пиздец. Надо было тогда на Qt3 делать, если в жопу полез без мыла.
http://rgho.st/7fBqZY4ml
Виджеты Qt, которые не-QML, должны работать все без проблем, поскольку это дело уже отточено. Другое дело QML, ебал их маму.
Скажите, почему мне всё таки пишет Welcome? Ведь объявление переменной B[2], и B[3] просто не может существовать. Или всё таки может? Если может, то зачем указывать размер массива?
Ну замени на что-то такое, хули ты как дурак https://pastebin.com/8hLuuTKm .
Диплом уже блять на носу, а руки из жопы.
UWM
W
M
Собрал в себе красоту WPF и мощь крестов (а также бонус: CLR сверху и win10 only, торопитесь, предложение ограничено)
-Wall -pedantic для GCC. Олсо, у тебя тут UB из-за того, что в двубайтный массив запихнётся больше двух байт.
В универе семестр на них микроконтроллеры программировали, и они мне больше понравились, чем ассемблер.
Опять наебал. Не та ссылка, ту потерял. Ну короче на XAML'е можно ебашить GUI для крестов. Инструкция была на MSDN, но я чё т проебал.
>чем ассемблер
Ну ясен хуй. Представляешь, в мире есть языки намного лучше, чем пропёрженные кресты.
Ну баг на месте
При объявлении массива в скобках ты указываешь размерность. Индексация начинается с нуля.
Это то я уже понял. Но сейчас все равно не определился, в какую сторону двигаться. Т.е. понятно, конечно, что вкатиться легче всего через веб, но что-то как-то он совсем уныло выглядит. А по плюсам - читаю сейчас Страуструпа для чайников - и чем больше читаю, тем больше нравится. Я бы и дальше чиал и не замарачивался, но память подводит: буквально пару недель перерыв сделал, и все, открываю книгу где остановился - и нихрена не понимаю, все забылось. Вот и думаю - может нахер эти кресты.
Ну бля, если у тебя бага нет, версии qt одинаковые - то это совсем странно. Бинарники дай что-ли.
Даже на ум не приходит, какую задачу можно было бы перед собой поставить: какую не придумаю - оказывается, что решить ее куда быстрее выйдет используя другой ЯП, даже если изучать его придется с нуля.
Что нибудь с ОС сделай
Вся суть крестов.
String^ MergeSections
Это у мелкомягких такое.
https://stackoverflow.com/questions/7530175/auto-foo-ref-new-foo-what-is-ref
Не знаю, что за хурма, но да, скидывает объект на сборщик мусора.
#include <vector>
#include <fstream>
using namespace std;
int main(){
ifstream f1;
int key;
cin>>key;
char bf;
if(key>0)f1.open("1.txt");
else f1.open("2.txt");
vector<char> vch;
system("cls");
for(int l=1;!f1.eof(); l++){
f1.get(bf);
char ii;
ii=bf+key+key*l;
vch.push_back(ii);
}
f1.close();
ofstream f2;
f2.open("2.txt");
for(int y=0; y<vch.size()-1; y++){
f2<<vch[y];
}
f2.close();
return 0;
}
Проблема - шифруется прекрасно, но при дешифровке(когда ввожу ключ меньше нуля) происходит внезапный выход из цикла, файл перестает читаться, хотя байты в нем еще есть. Какой-то байт зашифровался в байт, обзначающий конец файла? Что за хуйня? Памагити
#include <vector>
#include <fstream>
using namespace std;
int main(){
ifstream f1;
int key;
cin>>key;
char bf;
if(key>0)f1.open("1.txt");
else f1.open("2.txt");
vector<char> vch;
system("cls");
for(int l=1;!f1.eof(); l++){
f1.get(bf);
char ii;
ii=bf+key+key*l;
vch.push_back(ii);
}
f1.close();
ofstream f2;
f2.open("2.txt");
for(int y=0; y<vch.size()-1; y++){
f2<<vch[y];
}
f2.close();
return 0;
}
Проблема - шифруется прекрасно, но при дешифровке(когда ввожу ключ меньше нуля) происходит внезапный выход из цикла, файл перестает читаться, хотя байты в нем еще есть. Какой-то байт зашифровался в байт, обзначающий конец файла? Что за хуйня? Памагити
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
int main(){
ifstream f1;
int key;
cin>>key;
char bf;
if(key>0)f1.open("1.txt");
else f1.open("2.txt");
vector<char> vch;
system("cls");
for(int l=1;!f1.eof(); l++){
f1.get(bf);
char ii;
ii=bf+key+key*l;
vch.push_back(ii);
}
f1.close();
ofstream f2;
f2.open("2.txt");
for(int y=0; y<vch.size()-1; y++){
f2<<vch[y];
}
f2.close();
return 0;
}
Проебался
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
int main(){
ifstream f1;
int key;
cin>>key;
char bf;
if(key>0)f1.open("1.txt");
else f1.open("2.txt");
vector<char> vch;
system("cls");
for(int l=1;!f1.eof(); l++){
f1.get(bf);
char ii;
ii=bf+key+key*l;
vch.push_back(ii);
}
f1.close();
ofstream f2;
f2.open("2.txt");
for(int y=0; y<vch.size()-1; y++){
f2<<vch[y];
}
f2.close();
return 0;
}
Проебался
Суть крестов. Так тебе нужно учить кресты или нет? Если надо - зачем ноешь?
Лень читать. Пройди по коду и обрати внимание на каждое место, в котором у тебя имеет значение знак, в котором знаковое значение присваивается беззнаковой переменной и т.д.
Олсо, ideone.com
Он самый, но с прямым подключением, шифрованием, ДХТ и ещё парой плюшек. Делаю то, чем сам буду пользоваться после написания. И в рот пусть ебутся все телеграмы и прочее.
Потому-что я угорел по qt, отличная штука. Хочу научится в нём кодить ака боженька.
Так это была такая шютка? Хих.
Костылями решил проблему. Теперь обычные строки буду писать - ui->textBrowser->append("<span>me# " + message + "</span>\n");
Готовых способов нет. Вот пример с помощью copy_if и лямбды.
После удаления нужно прерывать итерацию. Итераторы, которые в for-each цикле использовались, становятся мусором.
>>995315
Я недавно учить начал, поэтому не совсем понимаю. Я же удаляю элемент в самом конце итерации, т.е. это ни на что влиять не должно, разве нет? Почему на многих файлах оно работает вполне корректно?
В любом случае, спасибо за инфу.
У тебя с максимальным значением несколько ключей может быть. Первый ты удалишь, а вот дальше не понятно, что происходит.
Ну как-то же оно удаляет несколько ключей с максимальным значением перед тем, как крашнуться. Если в указателе рандомный мусор - то не понятно, как оно работает до момента краша.
В этом вся суть. Оно работает до какой-то магической черты, а потом падает.
So you are.
Что не так с этими майкрософтами?
Спермопроблемники — в /s/
к работе забесплатно
Ещё хотелось бы, узнать про создания на нём простых изображений.
С меня нихуякак обычно
Какой это тебе нахуй билдер. Борланд что ли или как их там. Он же уебищный.
Если ты нубас, выкачай QtCreator, будет гораздо проще, чем вот в этой хуйне.
Я бы это дерьмо даже не трогал, но вот препода моего это не колышет.
Давай я загугля за тебя, скотыняка.
http://www.cplusplus.com/reference/map/map/erase/
Что возвращает erase? А ты, сука, что делаешь?
У типичного вопроса на собеседовании "нахуй нужен erase" - ты соснул. Поздравляю, ты даже не интерн, учитывая что тебе сказали, где ошибка.
Я юзаю qt creator (только как иде). Там своя система сборки и свои файлы для проектов.
Вот, например, я хочу исходники своего поделия выложить для всех.
Как быть юзерам которые юзают другие иде и другие системы сборки?
Ведь им придётся менять пути к либам на свои постоянно?
А если юзается какая-то специфичная версия библиотеки?
Под многопользовательским подразумевается, что я могу запустить два пользователя и они будут работать параллельно, не мешая друг другу, но с возможностью изменять их общие данные.
>но с возможностью изменять их общие данные.
Алан Бьюли, «Изучаем SQL».
Старательно изучаем!!!
С разморозкой. https://2ch.hk/abu/res/52038.html (М)
>>996028
Разумеется, это возможно. Представь себе, что ты читаешь данные из stdin и используешь их, но только данные могут прилетать не из одной консоли, а из нескольких. Если в случае с одной косолью у тебя была одна структура на всю программу, то во втором случае у тебя будет массив структур для всех пользователей.
Хрен знает, про что тебе рассказывали. Про корутины, select/poll?
Где можно почитать сжато про распределители памяти(allocator<T> вот это все).
Гуглил уже?
Много гуглил и ничего конкретного не нашел, некоторые предлагают в качестве примера брать реализацию красно-черного дерева, но там тоже не особо всё ясно
Вот это наиболее близкий вариант, как мне кажется https://www.codeproject.com/Articles/149879/Associative-Array-in-C
Я не могу нагуглить как решить эту проблему. Всё что я нашёл, всё сводиться к предложению загрузить Qt полностью.
Не стоит эту IDE использовать для чего-то, кроме Qt. Она хуже любой другой распространённой.
Хорошо, понял, спасибо.
Вот я в ужасе от этого, горит просто от крестов. Точнее как, сам язык мне очень нравиться, удобно с указателями всё, нет непонятных ограничений и прочего. Я с делфи начинал. Качаешь любую версию, качаешь любой пример, хоть десятилетней давности, запускаешь - и он сходу, сука, компилируется. А в с++ сколько не вкатывался в визуал студию - постоянно компиляторопроблемы. Загружаю пример, загружаю специально версию визуал студии под него (то есть уже даже не пример под версию, а версию под пример), открываю, а там 53 ошибки среди директив компилятора в каких-то *.h, которые в самой среде, вне примера. Я не знаю уже, говорят, мол с++ сложный, да пошли они к чёрту, там компиляторы сложнее языка в десять раз. Эклипс сейчас тоже вот ошибку выдаёт при попытке запустить хоть что-то.
Может быть есть что-то типа pelles c, только для с++? Где компилятор вместе с ide весят 10 мб, и где можно нажать создать проект, запустить проект, и он запуститься сразу?
Короче, делаешь так: New Project -> Non-Qt Project -> Plain C++ app. Там выбираешь систему сборки Qbs. Сразу создастся обычный консольный Hello world и он будет нормально компилироваться.
Тоже так думал, пока не разобрался с ней более-менее. Единственное пока с чем не разобрался, как в ней пользоваться дебаггером, сколько пробовал нихера не получается.
Во, благодарю от все души. А я то почему-то упорно пытался комплект настроить, гуглил значения полей и что в них должно быть.
>как в ней пользоваться дебаггером
Да пошёл он к чёрту, этот дебаггер. Я уже даже консолькой через батник и gcc готов собирать. Восемь часов пытаюсь этот мусор запустить. Я из армии только пришёл, идей куча накопилась, радовался, думаю, свободное время, сейчас поставлю какой-нибудь новый компилятор (сейчас же всплывают в разных областях такие новые проекты с открытыми исходниками), альтернативу визуал студии, где можно 100% времени уделить коду, а не только 60%. А то не сидеть же на своём умирающем делфи, да тормозном питоне. А тут вот. Ещё раз спасибо, прям настроение исправил.
Не за что. Кстати, сразу на будущее скажу, что по дефолту последние стандарты не включены. Чтобы включить с++14 нужно в qbs файле проекта написать cpp.cxxLanguageVersion: "c++14". Также если хочешь запускать отдельный экзешник без дополнительных библиотек, то нужно там же прописать cpp.linkerFlags: "-static"
Что по идеи должен уметь джун? или хотя бы стажер или я настолько нулячий, что никуда вообще не возьмут :с
Гуглить.
Или тут вообще имеется в виду архитектура кода и я идиот, лел.
>то нужно там же прописать cpp.linkerFlags: "-static"
Не помогает. Ексешник пустой программы начинает весить 2 мб, а при запуске жалуется на отсутствие "libgcc_s_dw2-1.dll".
Думаю, это тот случай, когда набор идет постоянно, но не спеша, и с каждым кандидатом все обсуждается отдельно. Тем более что сайт они обновляют.
Хм, хуй знает, если честно. У меня все нормально. Посмотри в папке bin компилятора этот файл. Или скачай чистый mingw с офсайта и им пользуйся, но только юзай Qbs вместо qmake.
Вот я тоже. Сейчас поставил netbeams, требует то ли mingw, то ли cywgin, нечто make и другой мусор. Ставлю всё прям по инструкции ещё раз отдельно для него, а оно пишет, что всё-равно не хватает некоторой dll непонятно для чего. Поставил kdevelop, поставил geany, поставил CodeLite и всё одно и то же. Как люди вообще используют этот мусор - не представляю, самим то приятно с этим разбираться? Просто невообразимо выбешивает это, не передать словами. Почему вот по пунктам с офф-сайта скачиваю всё необходимое, а оно не работает, неужто так сложно поподробнее написать.
Всё что необходимо, просто минимальную ide, текстовый редактор с поддержкой нескольких файлов и выделением ключевых слов в которой кнопки компилировать и запустить работают. Как pelles c на 10 мб (где даже отладчик есть, между прочим) - побаловаться-вкатиться в новые стандарты, ничего такого серьёзного не требуется. А тут скачай то, скачай пять утилит для компиляции, линковки, пропиши им все конфиги и получи непонятно что. Сейчас удалил вообще всё что стояло, пойду по второму кругу. Я уже даже почти готов громадную визуал студию поставить.
Чем тебя вижел студия не устраивает? Бесплатная, охуенный жырный инталлятор со всем на свете, огромный мсдн и не менее огромный стэковерфлоу. Притом, что большая часть энетрпрайза и геймдева как раз на студии, так что если учить, то ее.
> охуенный жырный инталлятор со всем на свете
Вот именно этим. Последний раз когда я её ставил, там она гигабайта четыре и я уже офигел от жизни. Какой-то пусть даже навороченный текстовый редактор запускается две минуты и компилирует с такой же скоростью. А то что сейчас я вообще боюсь представить сколько времени будет запускаться и как работать. Просто галочка для мобильных телефонов добавляет 10 Гб, может быть так принято сейчас, но я не вижу причин, куда там столько всего. Я в армии прям с андроида непонятно чем создавал apk за неимением лучших вариантов. Так соответствующее приложение занимает 27 мб. То есть фактически 27 мб достаточно для создание приложений под андроид (и даже если он использует что-то из самого себя, полный образ андроида 300 мб где-то). Хрен с ним, там ещё поддержка айфона и прочего, но не 10 же Гб?
>А в с++ сколько не вкатывался в визуал студию - постоянно компиляторопроблемы. Загружаю пример, загружаю специально версию визуал студии под него (то есть уже даже не пример под версию, а версию под пример), открываю, а там 53 ошибки среди директив компилятора в каких-то *.h, которые в самой среде, вне примера.
Ну, во-первых, там допгалочки есть для охочих до места, тут просто ставит наверняка всё. Скоре всего сразу хуюнити и воображаемый паровоз.
По-хорошему тебе наверное надо только шиндовс сдк и кресты а остальное доставлять по мере надобности.
А че за ошибки у тебя с хедерами?
Может ты тупо копипастил файлы проекта в инклюд и сорс, не указав их как пути инклюда и сорса? Это самое очевидное, системные либы студия уже сама пишет, если ты их ставил.
Давай конкретику, все равно тред полудохлый.
>Просто галочка для мобильных телефонов добавляет 10 Гб
Там кроме сдк для разных систем ещё 9гб мусора в виде десятка симуляторов разных версий систем для разных устройств, юнити и прочих.
Что сдк иос, что офф. сдк андроида в полном составе весят по 4-6 гб.
Для твоих целей идеально подходит CodeBlocks. Только качай сразу с компилятором в комплекте. В ней все очень просто, даже настраивать ничего не надо, и даже может компилировать отдельные cpp файлы, а не только проекты, как студия, qtcreator и т.д. И сразу по дефолту включена статическая линковка, т.е. все компилируется без зависимостей от dll. Я вначале ее использовал, сейчас, правда, перешел на qtcreator. Хотя иногда и сейчас использую ее для дебаггера и компиляции статической библиотеки, т.к. пока не разобрался, как это сделать в qt.
>Давай конкретику, все равно тред полудохлый.
Хорошо. Я поставил визуалстудию таки. Без совсем лишних галок примерно 4 Гб, хрен с ним.
Запускаю, кликаю создать простую консольную программу. Нажимаю запустить, и оно выдаёт ошибку, не найден sdk версии 8.1. По клику изменить целевую платформу можно переключать win32 и win64, обе не работают. Если прописать в настройках версию 7 тоже не работает. Зачем мне этот sdk? В тех четырёх гб я тогда что скачал, если нельзя пустую программу скомпилировать? Я не собираюсь использовать возможности win8.1, даже возможности win7 не буду использовать, максимум создам окно, подключу древний opengl и буду обрабатывать нажатия мышки/клавы. Функции ос, которые, наверное, со времён win2000 не менялись.
>>996617
>CodeBlocks
Идеально, есть даже версия не требующая установки, можно с собой таскать.
С хеллоуворлда.
>>996660
Ты пишешь
>Нажимаю запустить, и оно выдаёт ошибку, не найден sdk версии 8.1.
Но почему-то потом ты пишешь
>По клику изменить целевую платформу можно переключать win32 и win64, обе не работают. Если прописать в настройках версию 7 тоже не работает.
Ставь шиндовс сдк раз хочешь под шинду девелопить.
Покажи дерево проекта, кстати, если ты создавал Empty Project оно не должно хотеть сдк и должно собираться само.
И поменяй язык, только уёбки кодят на русском.
>>996663
На плюсах можно самостоятельно на винапи хуярить, просто толковых готовых либов нет, проще самому нахерачить под ту утилитку что пишешь, либо стырить готовую большую либу.
>большая часть энетрпрайза и геймдева как раз на студии, так что если учить, то ее
> учить IDE
Ну да. Это не борланд си, тут надо хоть пару раз ошпариться с настройками проекта, директивы препроцессора позыркать и подключать проекты в солюшен.
Ты хочешь сказать, что это ОЧЕВИДНО и ПОНЯТНО без изучения?
Бумага ответу
Систему сборки настрой, маня. Нормальные люди уже давно перешли на внешние генераторы проектов (GYP, CMake и прочее говно), а не привязываются к какой-то конкретной IDE.
Visual Studio нужна, чтобы на нее накрутить Visual Assist X или решарпер и послать нахуй интеллисенс, который окромя полутора подсказок для крестов выдать нихуя не может.
Директивы препроцессора нужны, если ты особо упорот и уж очень хочешь себе натвикать хуйни, как какой-то аудиофил, в большинстве случаев, даже в нагруженных приложения, на многие директивы, за исключением директив на добавление служебной информации и оптимизации компилятора насрать абсолютно, потому что прирост производительности от них нулевой, если даже не отрицательный.
Алсо, скажу тебе, про охуительное чувство, когда заголовочники и сорцы расположены в одной куче, но в проекте они по отдельным папочкам, и попробуй блять в репе найди что тебе нужно из этого дерьма.
Кстати, вот еще одна просто охуительная штука, MSVS сохраняет файлы в ЛОКАЛЬНОЙ КОДИРОВКЕ, готовься, что твои cp-1251 encoded файлы будут пестрить кривыми комментариями в любом более-менее адекватном вьювере репозиториев.
>>996660
>> Идеально, есть даже версия не требующая установки, можно с собой таскать.
Говно ебаное, даже не пытайся пользоваться этим легаси чмом. IDE, которая не может выводить типы для auto и делать нормальные пометки об ошибках нужна была лет 17 назад (если ты не говнокодер ЦЭ99, подавайте мне бинды сюда, ко-ко-ко, нужно следить за легаси, стандарты вносят слишком много изменений, register выкинули, да как они смеют). Единственный плюс этого корыта в том, что парсит заголовочные файлы в поисках объявлений он достаточно быстро (ну а хули нет-то, если он ничего другого делать не умеет).
Тут, наверно, будут советовать CodeLite и прочий мусор, который весит по питнадцоть мегобайт. Ты знаешь, что такое море крови ты наверное не купался в этом дерьме ты искупаешься тебе мало не покажется (цитаты Великих Людей)
>>996656
В timestamp переводи и храни как число. Благо 64-битная метка времени позволяет нам хранить наши говноподелки до времен терминаторов или может быть даже больше...
Систему сборки настрой, маня. Нормальные люди уже давно перешли на внешние генераторы проектов (GYP, CMake и прочее говно), а не привязываются к какой-то конкретной IDE.
Visual Studio нужна, чтобы на нее накрутить Visual Assist X или решарпер и послать нахуй интеллисенс, который окромя полутора подсказок для крестов выдать нихуя не может.
Директивы препроцессора нужны, если ты особо упорот и уж очень хочешь себе натвикать хуйни, как какой-то аудиофил, в большинстве случаев, даже в нагруженных приложения, на многие директивы, за исключением директив на добавление служебной информации и оптимизации компилятора насрать абсолютно, потому что прирост производительности от них нулевой, если даже не отрицательный.
Алсо, скажу тебе, про охуительное чувство, когда заголовочники и сорцы расположены в одной куче, но в проекте они по отдельным папочкам, и попробуй блять в репе найди что тебе нужно из этого дерьма.
Кстати, вот еще одна просто охуительная штука, MSVS сохраняет файлы в ЛОКАЛЬНОЙ КОДИРОВКЕ, готовься, что твои cp-1251 encoded файлы будут пестрить кривыми комментариями в любом более-менее адекватном вьювере репозиториев.
>>996660
>> Идеально, есть даже версия не требующая установки, можно с собой таскать.
Говно ебаное, даже не пытайся пользоваться этим легаси чмом. IDE, которая не может выводить типы для auto и делать нормальные пометки об ошибках нужна была лет 17 назад (если ты не говнокодер ЦЭ99, подавайте мне бинды сюда, ко-ко-ко, нужно следить за легаси, стандарты вносят слишком много изменений, register выкинули, да как они смеют). Единственный плюс этого корыта в том, что парсит заголовочные файлы в поисках объявлений он достаточно быстро (ну а хули нет-то, если он ничего другого делать не умеет).
Тут, наверно, будут советовать CodeLite и прочий мусор, который весит по питнадцоть мегобайт. Ты знаешь, что такое море крови ты наверное не купался в этом дерьме ты искупаешься тебе мало не покажется (цитаты Великих Людей)
>>996656
В timestamp переводи и храни как число. Благо 64-битная метка времени позволяет нам хранить наши говноподелки до времен терминаторов или может быть даже больше...
Бумп штоле
>Алсо, скажу тебе, про охуительное чувство, когда заголовочники и сорцы расположены в одной куче, но в проекте они по отдельным папочкам, и попробуй блять в репе найди что тебе нужно из этого дерьма.
В чем проблема? Я сам их по папочкам раскладываю, но нередко дерьмо когда они на полу. Райтклик - открыть в эксплорере. В студию гит уже впендюрен, так что и коммитить можно из него.
>>996683
>Кстати, вот еще одна просто охуительная штука, MSVS сохраняет файлы в ЛОКАЛЬНОЙ КОДИРОВКЕ, готовься, что твои cp-1251 encoded файлы будут пестрить кривыми комментариями в любом более-менее адекватном вьювере репозиториев.
Это пичот, но у меня юникод. А на работе постоянно сталкивался с этой ебаниной.
>> В чем проблема? Я сам их по папочкам раскладываю, но нередко дерьмо когда они на полу. Райтклик - открыть в эксплорере. В студию гит уже впендюрен, так что и коммитить можно из него.
Ну проще, конечно же, когда можно не прибегая к посторонним инструментам, сделать все как надо. Тысячи окон уже осточертели.
Но соль в том, что даже при использовании двух IDE одновременно (открываю CLion и MSVS), я не могу получить адекватного редактирования кода (CLion в этом преуспел, зато автокомплит работает криво и куча раздражающих косяков, да и вообще пиздец бывает зачастую в большом проекте, но сейчас как-то этого поубавилось) вместе с хорошей производительностью и нормальной отладкой (отладка в студии хорошо, хотя были случаи, когда отладчик загибался и не хотел читать память, приходилось перезапускать всю студию, а студию с решарпером быстрой назвать язык не поворачивается). Короче, на двух стульях блять, как меня это доебало, если честно...
Студия за эти годы создала впечатление наиболее полноценного и качественного продукта.
Экскод падал по три раза на дню, кодоблоки и прочие уже не такие полноценные.
ВС Код показался хорошей быстрой легковесной альтернативой если пришьёшь к ней компилятор.
В целом, соглашусь с тобой. Я бы сейчас даже на CLion полностью перелез, дак он кривой падла (но гораздо лучше, чем пару лет назад, когда первые версии выходили)
>Кстати, вот еще одна просто охуительная штука, MSVS сохраняет файлы в ЛОКАЛЬНОЙ КОДИРОВКЕ, готовься, что твои cp-1251 encoded файлы будут пестрить кривыми комментариями в любом более-менее адекватном вьювере репозиториев.
> комментарии на русском
ИМХО лучше на русском, чем на кривом англицком. Видал я комменты, от которых ржать хотелось. Пускай человек выражается правильно, а не будет ограничен знаниями неродного языка. Комменты на том языке, который человек знает хорошо более выразительны, и должны объяснять сжато и в то же время точно принцип работы того или иного метода/куска кода.
Алсо в принудительных английских комментариях смысла не особо много, если вся контора располагается в одной стране без зарубежных участников. Может, в коей-то мере, это и интересно, но больше будет походить на какой-то Брайтон-Бич, где все разговаривают на рунглише.
Однако ж.
Я, конечно, его сравниваю с родным братухой атомом, платным саблаймом и добротным нп++.
Щас немного попробовал вим и мне кажется, что тут что-то есть. Но пока нет времени навернуть (говорят емакс пижже). В коде плюгины одной кнопкой ставятся, тот же пуфон дебажить одно удовольствие.
>>996696
Толковый кодер комментариев не пишет, ибо что написано с трудом должно читаться с трудом.
А кроме шуток - надо ангельский тянуть хотя бы в предметной области, а то напишешь контроллер панелей как painController и прочие перлы и комменты даже на русском не спасут.
Интерфейсы следует документировать, реализацию можно избавить от этого, в принципе. Если архитектура документируется, то от комментирования можно отказаться, да. Самодокументируемый код, это, конечно же, хорошо, но никто не подскажет без соответствующих подсказок, является ли метод блокирующим или нет, как он вызывается и чем отличается от подобного метода с интересным суффиксом.
Английский нужно знать, не спорю, чтобы потом несуразиц не было, да и документация на те же API требует хотя бы средненьких знаний.
Ну хули, всё правильно сказал. Мы все знаем, как делать правильно, только реальность оказывается проворнее.
>Говно ебаное, даже не пытайся пользоваться этим легаси чмом.
> IDE, которая не может выводить типы для auto
Я пока даже не знаю что это, я с++11 только издали видел.
>>996687
>Короче, на двух стульях блять, как меня это доебало, если честно...
А на люниксах есть решение, раз уж ты всё ругаешь? Мне то для себя, могу свободно обперекатываться.
почему то функции стандартных библиотек tolower toupper
не работают, поэтому не могу реализовать статический метод, который меняет регистр этих строк, программа нормально компилируется и всё работает, все условия проходят, но строчки не меняются, не могу понять почему, помогите плиз
https://pastebin.com/dwxgvqea
Кутэкреактор отличился этим - хуй ты запустишь скомпилрованный файл без деплоя на винде.
Чтобы всё всегда запускалось, надо добавить в PATH все пути к динамическим библиотекам, которые ты используешь, в том числе путь к папке bin компилятора.
Как пользоваться codelite:
- ставишь codelite
- ставишь MinGW
- в настройках указываешь путь к папке MinGW
- добавляешь путь к папке bin в PATH (охренеть, там такая же проблема, как в креакторе)
Всё, оно робит. В линуксе ьаких проблем нет, там все либы в заранее определённых местах.
https://pastebin.com/2xPXQkMK
чет вроде должно работать, но не пашет
анонче, нужна твоя помощь
>А кроме шуток - надо ангельский тянуть хотя бы в предметной области, а то напишешь контроллер панелей как painController и прочие перлы и комменты даже на русском не спасут.
https://wandbox.org/permlink/747TNFxKBVkr9LN4
Занимаюсь некой хуйнёй.
Есть класс float3, имеющий float v[3];
Есть класс Vec, имеющий float x, y, z;
Возможно ли перегрузить оператор присваивания, чтобы эти 2 типа можно было друг другу присваивать?
класс КонтроллерПанелей
Начало
общее:
Панель ПолучитьПанель(цел номер);
Панель СоздатьПанель;
Панель УдалитьПанель (цел номер);
Панель ВыбратьПанель (цел номер);
внутристроч цел ТекущПанель() Начало вернуть выбраннаяПанель; Конец;
внутристроч СледПанель() Начало ВыбратьПанель(ТекущПанель++); Конец;
...
частное:
стд::вектор<Панель> хран;
цел выбраннаяПанель;
Конец
>Есть.
Что есть?
Каким образом осуществить перегрузку?
Я пробовал несколько вариантов, но компилятор жалуется на всякие ошибки типа missing type specifier и что-то ещё.
#include <iostream>
using namespace std;
class Vec;
class float3
{
public:
float v[3];
void set(Vec in);
};
class Vec
{
public:
float x, y, z;
void set(float3 in){x = in.v[0]; y = in.v[1]; z = in.v[2];}
};
void float3::set(Vec in) {v[0] = in.x; v[1] = in.y; v[2] = in.z;}
int main() {
Vec foo;
foo.x = 1;
foo.y = 2;
foo.z = 3;
float3 bar;
bar.set(foo);
std::cout<<bar.v[2];
return 0;
}
#include <iostream>
using namespace std;
class Vec;
class float3
{
public:
float v[3];
void set(Vec in);
};
class Vec
{
public:
float x, y, z;
void set(float3 in){x = in.v[0]; y = in.v[1]; z = in.v[2];}
};
void float3::set(Vec in) {v[0] = in.x; v[1] = in.y; v[2] = in.z;}
int main() {
Vec foo;
foo.x = 1;
foo.y = 2;
foo.z = 3;
float3 bar;
bar.set(foo);
std::cout<<bar.v[2];
return 0;
}
Я примерно так и делал.
Сейчас вроде разобрался, проблема походу была в циклических зависимостях файлов.
Разрулил вроде как.
У меня эти структурки были в отдельных файлах.
В начале файлов есть #pragma once ибо они во множестве других мест ещё подключаются.
В одном из файлом (например float3.h) можно подключить второй (Vec.h), и там же реализовать конструктор и перегрузку из Vec в float3.
В файле Vec.h просто в начале пишем "struct float3;", далее в классе/структуре можем объявить прототипы для конструктора и оператора=, и потом в каком-то другом файле написать реализацию этих методов (можно в том же float3.h после объявления структуры float3).
В хедерах реализацию писать моветон, пиши в плюсовом коде.
Можно только мелкие инлайны типа метода-инкрементора.
>В хедерах реализацию писать моветон
Скачай исходники boost или какой-нибудь реализации стандартной библиотеки и посчитай число строк в хедерах и не-хедерах.
Я сказал "моветон". Я себе такое обычно не позволяю.
И нет, я не петух, а плюсер, на петухе я только небольшой скриптинг строк максимум на 500 делаю, посерьёзнее уже задача для плюсов.
Хм, я всё так и делал и не работало. При попытке запуска консольку выводит с сообщением, что программа завершила работу с ненулевым кодом. А сегодня я поставил MinGW в очередной раз, 64-битный, и всё заработало.
И CLion заработал, к слову говоря.
Значит, три с половиной работающих стула уже. Это, codeblocks и ещё половина qt-креатора, которая даже при статической линковке самостоятельный ексешник мне не соизволило собрать.
Всем спасибо большое за наводки и советы - думаю пока этого пространства для плавания хватит, пойду тестировать последние обновы с++.
>> А на люниксах есть решение, раз уж ты всё ругаешь? Мне то для себя, могу свободно обперекатываться.
Идеального решения НЕТ. Самое вменяемое по удобству и скорости работы, для меня во всяком случае, это CLion. Eclipse гораздо медленнее, к примеру, да и многих фич у него нет (а может и есть, я с этим уже года 3 не связывался). Недоредакторы, типо codeblocks, codelite, wxc++ (или как его там) и прочие, прочие (в т.ч. всякие редакторы типо atom, vscode и т.д.) это все не то. Рефакторинга нет (имеется в виду нормальный рефакторинг, с редактированием типов параметров, количества аргументов и прочим), вывода типов нормального нет, ошибок шаблонов нет и так далее до бесконечности.
Можно попробовать QtCreator, но он, как по мне, кастрированный слишком, до нормальной IDE не дотягивает, но для новичка, я думаю, сойдет, особенно, если у тебя слабенькая пекарня (потому что все эти java-IDE жрут столько ресурсов, что пиздец...)
Да.
Два чаю этому.
>>996902
Аргумент инвалид, так как шаблоны не разносятся по файлам, а идут инлайном на крайняк выносятся за пределы класса в том же хедере. А теперь ты скачай какую-то не шаблонную либу и посмотри, сколько там реализаций в заголовочниках.
>так как шаблоны не разносятся по файлам,
Очень даже разносятся. Обычно реализацию отделяют и выносят в отдельный хидер - делают .h и .hpp или .inc. В одном хидере необходимый минимум, во втором -тяжелая реализация, которую инклудят в .cpp при использовании.
>реализация все равно остаётся в хедерах.
Но в большинстве случаев этот хидер подключается в cpp и парсится только один раз.
О блять, тысячи их. Начиная с активного объекта до маппинга (тот же ORM), можно еще шлюз таблицы данных или шлюза записи данных. Если тебе интересны паттерны взаимодействия с базой данных, можешь прочитать Patterns of Enterprise Application Architecture (паттерны корпоративных приложений в переводе), книги что на русском, что на англицком есть в доступе. Ссылок не будет.
Без ORM получится не ООП.
void ini(float myFloats)
{
myFloats[0] = new float(1.0f);
myFloats[1] = new float(2.0f);
myFloats[2] = new float(3.0f);
}
int main()
{
float myFloat1 = nullptr;
float myFloat2 = nullptr;
float myFloat3 = nullptr;
float myFloats[] = { myFloat1, myFloat2, myFloat3 };
ini(myFloats);
}
цы, ты зачем переменной nullptr присваиваешь. ты либо делай
float myFloat1=nullptr;
...
float myFloats[] = {myFloat1,...
либо
float myFloat1, myFloat2,...
...
void ini(float myFloats[])
{
myFloats[0]=1.0f;
...
а еще лучше почитай про указатели.
ну ебаный по голове, разметка всё испортила.
float ~myFloat1=nullptr;
...
float ~myFloats[] = {myFloat1,...
либо
float myFloat1, myFloat2,...
...
void ini(float myFloats[])
{
myFloats[0]=1.0f;
...
где ~ - оператор указателя (звездочка).
>void ini(float myFloats[])
myFloats[] должен же быть типа массив указателей, а не просто массив флоатов, ну в общем даже если так, то все равно не работает, я скрин выше приложил
Компилится, просто делает не то что я хочу, я хочу таким образом иницилизировать переменные myFloat1,2,3 но они так и остаются nullptr, зато если посмотреть потом содержимое myFloats то вот там как раз и создались эти 3 переменные
Сударь, вы к нам с мира Джавы приехали?
тогда попробуй сделать myFloat1,2,3 переменными, а массив так и оставляешь двойным указателем и не трогаешь функцию. массив инициализируешь его как &myFloat1, &myFloat2 и тд
Вот так не получится, ибо в действительности у меня там не флоаты будут а указатели на объекты абстрактных классов, т.е. переменными не получится их сделать
гошподи. почему указатели хранишь в флоатах? почему не можешь просто создать указатели абстрактных классов?
просто со стороны выглядит так, как будто ты пытаешься срать через ноздрю. ты в образовательных целях это делаешь или считаешь, что это единственно верное архитектурное решение?
Например из "Плюсы не самый плохой язык"
Можно было вытащить сначала Плюсы, потом не, а потом самый и тд.
Я вот знаю только find() substr(), но тогда нужно буферную строку делать и вообще не красиво получается.
И то и то наверное, ну я хочу так инициализировать нужные мне переменные объединив их в массив и передав в функцию, ну раз по-другому нельзя значит буду потом доставать их из массива и приравнивать вручную.
>Плюсы не самый плохой язык
>Нет встроенного типа-строки
>В стандартную либу для строк не завезли .split()
Да я хотел через массив указателей, 3 звезды не оч хочется делать
Начни с изучения дерева поиска.
Хуйню какую-то написал, потому и не работает.
Это библиотеки Visual C++ разных версий и битностей. У меня примерно такая же пачка на ЖД, ставлю во избежание сюрпризов, не во всех программах явно написано, что ставить.
Почему везде (ладно не везде, но много где) пишут, что обучение программированию лучше начинать с C++ ?
Наслаждайся своей спермопарашей.
Зато WEB и 1C хоть жопой жуй.
Ума не хватает, чтобы работать на себя. Фрилансу это нахуй не надо кроме студентов с лабами
Уже смазал лыжи в ДС2.
Пасаны, кому нужны кресты в 2017, кроме ынтерпрайз говна?
В крупных конторах типа яндекса, мейла, дохуя нужны. Но если ты чмо, писавшее только laba1.cpp, туда будет почти нереально попасть, а если и попадешь - будешь работать сверх нормы и за копейки. Там макакам платят не особо много, якобы престиж от надписи "Yandex" в трудовой это компенсирует.
Это понятно, чтобы попасть в топы нужен неплохой math-background. Я то макачу уже давно и всё забыл. Есть вариант в Unity-геймдев вкатиться, но там своя атмосфера.
Вкатись в системное или сетевое программирование, будешь потом с десятком флагов возле сокета плясать и еполлы трахать.
Почему? Разве изучение С++ не дает какого-то собого понимания программирования? Почему тогда советуют?
> Разве изучение С++ не дает какого-то собого понимания программирования?
Ты про "выучил сипласплас — счетай выучил все языки"?
Наверно. Я же не знаю почему его советуют. Типа чем сложнее язык, тем проще потом перекатиться.
Он скорее просто растягивает очко. Перекатится потом правда легче — всё кажется слишком маленьким для твоего расхуяренного очка, если это конечно не хачкели.
Тогда будешь колесить по дорогам Вальхаллы.
Что угодно, где нужен перформанс. Попробуй пораскинуть мозгами.
>>997623
Ну епта, из языков с такими возможностями для системного/низкоуровнего программирования и различными либами, у крестов лучший синтаксис. В общем то, мне кроме крестов и голого С ничё на ум не приходит. Ну разве что ассемблер, но на нем что нибудь прикладное крупное писать - это ояебу пристрелите меня.
На линупсах консоль никогда не показывается просто так. В винде она показывается потому, что программы вызывают WriteConsole вместо printf, в позиксах такой поебени нет (либо она исчезающе редка).
>>997635
>В общем то, мне кроме крестов и голого С ничё на ум не приходит.
Питон, Перл.
Спермоблядь незаметна. Где ещё есть такие искусственные проблемы?
>а использование Java/C# для разработки графических приложений известно к чему приводит.
К чему приводит? В чем подвох? А то вот вкатываюсь и понимаю, что на C# охренеть как проще гуй заделать, причем не надо под 100 мб библиотек таскать с приложением
Кстати, статическая линковнка на Qt требует лицензии (по хорошему). Т.е. сделать-то ты можешь, но распространять нет.
>Питон, Перл.
Ты про пхп и жаваскрипт забыл - топовые языки для системного и низкоуровневого программирования.
Где можно попроходить тесты и посмотреть примерные задания, которые выдают для получении сертификата?
Я какое-то время по нужде быдлокодил (на работе заставили выучить если это можно назвать словом "выучить" кресты и писать на них несложные MFC приложения), а сейчас решил взяться за голову и научиться писать нормальный код, за последний год немного подтянул синтаксис, упорядочил знание ООП, конечно, гуру С++ все равно назовут это быдлокодом, но я готов совершенствоваться и дальше.
Теперь хочу попробовать получить какой-нибудь сертификат. Поможет ли это при устройстве на работу? Спрашиваю, потому что читал разные мнения вплоть до того, что сертификаты только хуже делают при трудоустройстве.
Двачую этого, тоже интересно
Дотнет уже занимает пару гигов на диске. Виртуальная машина медленно интерпретирует байткод, количество ненужных выделений памяти и кастов типов растёт экспотенциально со сложностью программы, сборщик мусора может полностью заморозить гуй в любой момент. В результате получаем 50% потерю производительности у конечного пользователя только ради того чтобы быдлокодерам было проще шлёпать Form1_Click. Это приемлемо для энтерпрайзных систем на серверах, но графические приложения должны быть исключительно нативными.
В том что это говнище будет работать с таким скрипом, с каким твои, блеять, родители делали тебя, сука, гомункула.
Попробуй на торренте найти ту же 2010 или 2008-ю студию — последние нативные версии. И сравни их с последней, 2017. При том, что она работает куда лучше той же 15-й, оно всё ещё лагает на любом железе хуже жидеи (у той хоть есть честная несколькоминутная индексация, во время которой не поработаешь, а вот у студии такое говно перманентно).
О, не знал что студия 2017 не нативная. А я то думал хули она так лагает блять.
Выходит VS2017 написали на C#? пиздос. Зашквар уровня IDE от JetBrains на джаве
Обучение программированию лучше начинать с С.
С++ язык слишком сложный и уже для опытных программистов. Вкатываться в него не имеет смысла.
А вот С более прост, при этом мощь языка так и прет как и в С++.
Objective C тоже был в своё время тормозным гогном, но ничего, макоблядь писали.
УТЕКАЕТ
>Гуй на JS/C# — это объективная реальность.
>JS
>J
>S
Ты ебанутый?
Я БЛЯТЬ ХУЕЮ. Люди хотят писать программы на языках которых не существует физически. Ты понимаешь что твоего JS кроме браузера нигде нет?
Взять тот же Node.js, это обычная С программа которая выполняет код написанный с синтаксисом JS.
А теперь представь громоздкость среды которая должна будет целый GUI создавать подобным методом. Нахуй эти костыли нужны, когда уже есть QT/GTK для белых людей или те же Windows Forms/WPF для C#?
Какому мудаку придет на ум писать на яваскрипте ебучий гуи?
Да. Уже есть managed решение в виде C# отработанного годами для GUI.
Для JS нет нихуя кроме небольшой ноды. JS как языка кроме браузера нигде не существует.
Если так хочется писать менеджед гуи, каким мудаком надо быть чтоб писать на чем то кроме .NET?
Говно написанное через анальные костыли и анальные врапперы над врапперами.
Поссал тебе на ебало, смузихлеб
Кто не согласен - нахуй из профессии.
Ты можешь бомбить сколько тебе угодно, но это объективная реальность.
>Atom
Лагает при большом количестве открытых файлов/большом объеме кода. Особенно я почувствовал разницу, когда с атома на phpstorm пересел. Просто как с жигулей в ауди.
Долго и муторно
Нету сертификатов, потому что всем похуй. Сертификаты появляются, когда язык начинают немеренно форсить, тот же C#, к примеру.
Я не знаю, какие ты там собрался по крестам сертификаты получать, но я бы туда только шаблонов и запихивал, чтобы на десять тысяч проходило парочку человек (я бы не прошел). Самое лучшее, что ты можешь сделать, так это написать свою какую-нибудь либу или еще что. Сделай на бич-хабе реп и по-маленьку запушивай туда новинки своих творений, через пол-года увидишь, что все, что ты делал - говно.
У меня вообще эта идея с сертификатами появилась, когда возник вопрос, а как вообще определяют подойдет ли кандидат на должность программиста или нет. Ведь кроме стажа по сути сейчас ничего не просят. Допустим, у меня 10 лет стажа, я в это время в том числе и кодил, но как это проверить? Сертификат может дать хоть какой-то срез, хотя, понимаю, что от быдлокодерства это все равно не защитит.
Впрочем не суть, я все же решил просто попроходить различные тесты и понял что пока никуда не гожусь, т.к. местами не понимаю основ. В следующем посте по этому поводу у меня будет вопрос.
Ну какого-нибудь Сеньора Помидора посадят рядышком, он будет слушать, что за хуйню ты несешь. Если будешь пиздеть, то точно объебешься. Если контора хуевая, то отправят к ХаРэ (ЭйчАр, как они любят себя называть), бывают такие, что там королева бензоколонки сидит, которая отсеивает в две кучи и, как следствие, без должного надсмотра в саму же контору попадают лютые объебосы, которые могут только промеж булок шурудить своим волосатым языком.
Стаж, это тоже понятие такое, я бы за стаж, конечно, не цеплялся. Но, однако, как минимум год нормального программирования у тебя должен быть за плечами и вот этот год ты постоянно должен заполнять свою головешку полезной информацией и по итогу неплохо было бы посмотреть, что поменялось за год. Я думаю, если ты будешь каждый месяц инспектировать и анализировать свои предыдущие работы и постепенно набивать хоть на чем-нибудь руку, то там понятно станет что и как. Например, тебе станет очевидно, какие ты решения принимал, насколько они подходили или нет в конкретных ситуациях. Все-таки это тоже опыт.
Был тут до меня один человек, который работал года 4. Стаж, по сути, 4 года, а в коде, ну полная хуйня творилась. Человек применял паттерны налево и направо, делал какую-то хуйню там, где это не надо было и (sic!) будо охуительно лицезреть что-то вроде такого:
>> QMap<...,...> m_map;
>> ...
>> if (m_map.contains(key)) { return m_map[key]; }
Блять. Человек 4 года в сраном Qt просидел и даже не осилил контейнеры. Он все хвастался, что постоянно подключает новейшие сборки Qt, но самое веселое было то, что он использовал legacy-подход к работе, который был еще в 4 версии. То есть вместо кошерных ныне соединений при помощи указателей на функции и лямбд, как тут уже не раз обсуждалось, он цеплял все через SIGNAL(...) и SLOT(...). Про охуительную реализацию PIMPL на классы с тремя интовыми полями я вообще молчу.
Вот эти тесты, стаж, сертификаты какие-то, по-мне, честное слово, хуйня полнейшая. Нужно уметь применять навыки а не давить количеством якобы знаний и сертификатов.
Ну какого-нибудь Сеньора Помидора посадят рядышком, он будет слушать, что за хуйню ты несешь. Если будешь пиздеть, то точно объебешься. Если контора хуевая, то отправят к ХаРэ (ЭйчАр, как они любят себя называть), бывают такие, что там королева бензоколонки сидит, которая отсеивает в две кучи и, как следствие, без должного надсмотра в саму же контору попадают лютые объебосы, которые могут только промеж булок шурудить своим волосатым языком.
Стаж, это тоже понятие такое, я бы за стаж, конечно, не цеплялся. Но, однако, как минимум год нормального программирования у тебя должен быть за плечами и вот этот год ты постоянно должен заполнять свою головешку полезной информацией и по итогу неплохо было бы посмотреть, что поменялось за год. Я думаю, если ты будешь каждый месяц инспектировать и анализировать свои предыдущие работы и постепенно набивать хоть на чем-нибудь руку, то там понятно станет что и как. Например, тебе станет очевидно, какие ты решения принимал, насколько они подходили или нет в конкретных ситуациях. Все-таки это тоже опыт.
Был тут до меня один человек, который работал года 4. Стаж, по сути, 4 года, а в коде, ну полная хуйня творилась. Человек применял паттерны налево и направо, делал какую-то хуйню там, где это не надо было и (sic!) будо охуительно лицезреть что-то вроде такого:
>> QMap<...,...> m_map;
>> ...
>> if (m_map.contains(key)) { return m_map[key]; }
Блять. Человек 4 года в сраном Qt просидел и даже не осилил контейнеры. Он все хвастался, что постоянно подключает новейшие сборки Qt, но самое веселое было то, что он использовал legacy-подход к работе, который был еще в 4 версии. То есть вместо кошерных ныне соединений при помощи указателей на функции и лямбд, как тут уже не раз обсуждалось, он цеплял все через SIGNAL(...) и SLOT(...). Про охуительную реализацию PIMPL на классы с тремя интовыми полями я вообще молчу.
Вот эти тесты, стаж, сертификаты какие-то, по-мне, честное слово, хуйня полнейшая. Нужно уметь применять навыки а не давить количеством якобы знаний и сертификатов.
а вот и вопрос.
Нужно определить что выдаст этот код:
Ответ: ddcccdd
Я пытался в нем разобраться, отнумеровал (1-11) строки, в которых может быть какой-то вывод и затем для лучшего понимания начал сам себе объяснять каким образом получился этот ответ. И в некоторых местах я не понимаю почему и так и прошу объяснить.
1-3. как мне кажется у меня не возникает вопросов. В 1 и 2 выделяется память в стэке и запускает обычный конструктор. В 3 пункте на основе уже имеющейся переменной методом копирования создается новая переменная в стэке.
4. Вызвал у меня легкое непонимание в совокупности с 5 и 6. Почему в 4 при создании ссылки и присвоении ей значения другой переменной (я так понимаю ссылка теперь будет указывать на стэк, в котором хранится переменная с) никакой конструктор не вызывается.
5-6. При этом, если переменная объявляется и тут же инициализируется значением другой переменной того же типа, то задействуется конструктор копирования (пункт 5), но при этом, если переменная была объявлена заранее и ей присваивается значение другой переменной, то никаких конструкторов не задействуется (пункт 6)
7. При создании указателя выделяется память в хипе размером с переменную типа А, немного сбивает А(с). Возникает вопрос, при этом в эту память записывается что-то?
8. Разница с предыдущим в том, что передается ссылка. И вот тут у меня самый большой вопрос. Ссылка указывает на стэк, а указателю нужен хип, верно? В этой строке работает конструктор копирования, но я не понимаю почему.
9. со статик кастами я плохо знаком, так что тут у меня ни ответов ни вопросов.
10. вопросов не вызывает
11. Функция принимает 2 параметра по ссылке. В первый параметр передается цифра, и вот тут я снова не понимаю почему работает обычный конструктор, а не копирования. Второй параметр выглядит понятнее, и, как я подумал, там тот же механизм, что и в пункте 3, но нет, тоже обычный конструктор.
Кто-нибудь сможет объяснить, пожалуйста, где я не прав и ответить на вопросы.
Ещё год назад я делал лабы на QT5, про новый синтаксис вообще ничего не слышал в то время. В официальных доках всё было по-старому.
Ничего удивительного, что чувак про него не знал.
Есть абстрактный класс для сотрудников worker.
От worker наследован head - абстрактный класс для всех сотрудников, которые могут иметь подчиненных.
employee : worker не может иметь подчиненных.
manager : head и sales : head могут иметь подчиненных.
Функция расчета зарплаты определена в worker виртуальной. В head определена вспомогательная функция расчета зараплаты с учетом числа подчиненных и поле std::set подчиненных.
Я хочу избавиться от дублирования кода, потому что функция расчета везде почти одна и та же, она в employee и она же в manager и sales отличается только тем, использует ли она число подчиненных.
Можно сделать ее общей для всех и в классе employee число подчиненных использовать с коэффициентом 0.
Как это лучше реализовать? Для этой функции нужен set подчиненных, а определять его в worker как поле я не хочу, потому что worker - общий класс, и не все сотрудники могут иметь подчиненных.
>>> QMap<...,...> m_map;
>>> ...
>>> if (m_map.contains(key)) { return m_map[key]; }
Ошибка не очевидна без контекста. Например: обрабатывается поток данных, и на каждом шаге пары могут быть вставлены и исключены, и если ключа нет, то может возвращаться какое-то "пустое" значение (не обязательно default-constructed).
Если тип функции - референс, то уже смешнее, конечно.
В противном случае он возвращал объект по-умолчанию, если мне память не изменяет. Значения он только вставлял. Если мне память не изменяет, это было что-то вроде кэша уже использованных данных или как это можно назвать.
>>998006
Этому синтаксису уже несколько лет
всё, неактуально. это я д
Если это мемоизация, как ты написал, то в чем проблема в приведенном участке? Так же и делается.
Короче, фиксю по-быстрому. Уже нихуя не помню, если до репа завтра доберусь выложу это чудо.
Потому что результат сложения числа с указателем - это указатель + sizeof(тип)*число
Никто не говорит, что не лагает. Да, это жрёт память и ЦП. Но зато быстро (а значит и дёшево) и удобно (наверное, я сам не пробывал).
>>> QMap<...,...> m_map;
>>> ...
>>> if (m_map.contains(key)) { return m_map[key]; }
>Блять. Человек 4 года в сраном Qt просидел и даже не осилил контейнеры.
Ну или ты не осилил.
Жёстко ты его.
Потому что для типов, которые не имеют "дэфолтных" значений это единственный вариант.
По мне так это предложение к обсуждению и улучшению, а не пиздец ошибка. Можно в optional значение завернуть например. Придираешься ты.
Зачем делать именно так? Конкретно по вопросу ничем не помогу, это уже даже не байтоёбство, а какой-то изврат.
Понадибилось в другом классе иметь референсы на хранимые объекты.
Можно ли в одном темплейте объединить возможность работы как с unique_ptr<T>, так и с &T или вообще с <T> напрямую? Или городить отдельный темплейт для этого?
Заставлять его хранить shared_ptr<T> тоже не хочу, потому что многие классы пользуются этой же очередью для хранения и уникальных объектов тоже.
Это подготовительные меры. Мне главное понять, как основываясь на ImageBase и RVA в таблице импорта получить VA, по которому можно вызвать LoadLibraryA. Разумеется, в реальном приложении всё будет несколько иначе.
unique_ptr на объекты хранятся в map другого класса (выше по иерархии), он же управляет временем их жизни.
Дочернему классу он их передает для обработки (временно), гарантируя, что они никуда не исчезнут и не будут удалены до конца обработки. Дочерний класс их не хранит, соответственно передавать shared_ptr смысла нет. При этом передает он их через "реалтаймовую" очередь, для которой и создан темплейт.
Изначально в проекте использовались только очереди с unique_ptr и проблем не было. Теперь понадобилось использовать тот же класс "живой очереди" для любых объектов или референсов на них и вопрос в том, можно ли универсализировать темплейт.
В голову пришло только декларить все необходимые queue в твоём классе, а потом использовать нужные, оверлоадя все Pop и Push, либо указывая в конструкторе варинт использования.
Хочешь сделать контейнер для любых типов?
Ну можешь хранить всё добро в виде объектов одного базового класса на всех, вроде как так можно делать.
Я не знаю, почему, но мне кажется, что тебе может помочь паттерн Visitor.
Технически, он и так работает для базовых типов, но способы передачи объектов и указателей отличаются, а значит тело функции должно понимать, что перед ней, и вызывать соответствующие методы (std::move для unique_ptr, прямая передача для &Object).
Сами объекты мне там хранить не нужно вообще никогда, либо умные указатели, либо референсы.
Мне кажется, тебе реально тут Visitor может помочь.
Так там же он вроде есть в experimental, не?
Даже если нет — возьми из буста/фолли/кути или что ты там юзаешь (да да, привыкай тащить в проект кучу говна руками, это очень жизненный опыт шиндовс-программера).
Оно-то да, но в стандарте приятнее.
пиздуй в с-тред
https://gist.github.com/tjarrow/d9b447cc48c663a7343b0bd7601b831e
Это цифровая сортировка по 16-чной записи
почему-то упорно не хочет работать с количеством элементов, меньше чем 10
дебажил долго и упорно - так и не разобрался
подскажите, где ошибка
>почему-то упорно не хочет работать
Когда к доктору приходишь, тоже говоришь "нога упорно не хочет ходить"?
Ты это сам написал? Подозреваю, что нет.
Падает, потому массив хранит разряды чисел. В стандартном 32-битном целом их как раз 10.
>mas_col = new int[10]; //Здесь падает
>почему-то упорно не хочет работать с количеством элементов, меньше чем 10
Слющай, ну я и подумал, что когда 9 тут ставишь, программа умирает. Мол, что за глупые вопросы.
http://ideone.com/e2OFVp
ЧЯДНТ?
http://ideone.com/xDoUjw - scanf("%x",...) читает в unsigned int, а не int.
Есть некоторый фрагмент кода, который считает строки в файле хз, есть ли функция для этих целей в стандартных библиотеках, суть не в этом
Почему когда я вставил этот же фрагмент в другую прогу все переменные забрал, библиотеки подключил цикл начал зацикливаться, хотя в той, другой проге, все работает идеально?
Обращаюсь к знатокам
Есть некоторые педали, который вращает колеса хз, может другие вели сразу с педалями, суть не в этом
Почему когда я вставил эти педали в другой велик все тросики забрал, колёса подключил рама начала зацикливаться, хотя на том, другом велике, нормально ездил?
То-то ты до сих пор кровоподтёки потираешь.
Ох ты блять, ну спасибо. Вопрос повторяется. Нахуя искать дважды?!
Про второй пример со значением по-умолчанию, я уже сказал, что нужно было делать так или через .find и проверкой итератора (первое проще).
>>998053
Оказалось, я бугуртил даже не из-за этого, он просто пихал все в контейнер и не использовал его вообще. Видело как рудимент, получается. Наверно, да, не такой уж и сильный косяк.
Кажется, что уже сто вариаций переробовал, все дают разные результаты шифрования с ключом. И при этом ни один не дает правильного. За правильность взял то, что дает большинство бесплатных сприптов в онлайне, найденных по запросу в гугле "des encode online".
Интересует именно обособленная реализация, а не часть большой библиотеки, которую придется тащить с исполняемым файлом.
На сисярпе вроде писал DES в ECB. Щас завтрак приготовлю и гляну, если в шарпе поковыряться не брезгуешь..
Охуительный критерий правильности.
Тесткейсы botan проходят на этом онлайн декодере - http://des.online-domain-tools.com/
Тесткейсы (в hex-формате): https://github.com/randombit/botan/blob/master/src/tests/data/block/des.vec
Код несильно зависит от остальных компонент ботана, они нужны только для унификации интерфейсов - https://github.com/randombit/botan/blob/master/src/lib/block/des/des.cpp
Можно пересобрать библиотеку, отключив всё лишнее -
https://github.com/randombit/botan/blob/master/src/lib/block/block_cipher.cpp
А я тебя наебал, нет у меня DES. У меня ближайшее к DES это AES и Magma только.
STL, Boost, опционально Qt, матан, алгебра, физика, геометрия, теория чисел, криптография
stl и boost полостью? а из матана физики геометрии что вообще может пригодиться?
Ответ на оба вопроса: смотря на что ты претендуешь и куда идёшь устраиваться. Проблема крестов в плане трудоустройства в том, что их уже не используют повсеместно. Заводы автоматизируют на С/машинном коде/асме, энтерпрайз на джаве/C#, web под asp.net/php. Остаются всякие нефтяные/геологические компании, где шарп/джава не подходит по производительности, а C/asm/op-code не подходит из за сложности разработки. Ну gamedev сюда можно приплести, в том же UE пишут на крестах да и юнити вроде можно заставить их жрать, браузеры, короче долгостроящиеся приложения, обрабатывающие большой сетевой трафик и/или системные функции. Вообще, мне кажется, что в разработке большого приложения голых плюсов будет недостаточно, и придется обращаться к сторонним библиотекам, ибо без них ты работаешь уже не над приложением, а над созданием собственного велосипеда для крестов, грубо говоря, создаешь себе инструмент, а не инструментом создаёшь продукт. Поэтому, КМК, stl может и нахуй шлют, а boost/Qt их аналоги используют активно, поэтому не лишним будет хотя бы скачать и посмотреть чё в них есть.
ну вообще я бы хотел просто работать над каким нибудь десктоп приложением, но так походу не получиться, тот же на пример скайп, мб браузер ну и тд, что можешь посоветовать, яп сменить мб, или технологии под c++ подходящие под это
>stl может и нахуй шлют
Поясни ньюфагу почему очень многие пишут, что stl - говно и вообще не нужен? Хотя сам Страуструп вроде пишет, что лучше использовать стандартную библиотеку, чем писать свои велосипеды.
Какой язык, такая и стандартная библиотека.
Ключи представляют собой упорядоченные числа и по ключу вызывается функция из массива функций? И неважно сколько разных ключей, на быстродействии это уже никак не скажется.
ЕМНИП, даже в крестах есть хэш-таблицы и лямбды.
Не вижу, как ему этот паттерн поможет.
В STL есть алгоритмы и много довольно полезной дичи, но контейнеры имеют не совсем удобный интерфейс. Это понятно, что комитет пытается облегчить библиотеку как только можно и сделать ее эффективнее, но от этого страдает функционал и принятие мелочей занимает очень долгое время, потому что нахуя иметь встроенный поиск в std::map с возможностью возврата значения по-умолчанию, если элемент не найден, если можно взять std::map::find и потом сравнить std::map::end.
НО:
Я до сих пор не могу понять, почему комитет еще не принял методы по изменению порядка следования байт, чтобы переводить всякую дичь без помощи htons/ntohs и т.д. Почему нет потоков для работы с бинарными, именно бинарными, а не текстовыми данными, как QDataStream, например и приходится пользоваться boost-ами или cereal, к примеру (хоспаде, благослови создателя последнего, потому что это охуенно).
Почему нет рефлексии времени компиляции, ведь это, к слову, не такая уж и непосильная задача для компилятора, который во время работы уже имеет на руках синтаксические деревья. Где sting_view или какая-нибудь подобная дичь. Почему создателям стандарта понадобилось около 20 лет, чтобы понять, что неплохо бы иметь метод std::string::data, который возвращал бы указатель на НЕКОНСТАНТНЫЕ данные.
ВСЕ ПРИНИМАЕТСЯ ОЧЕНЬ МЕДЛЕННО. Кажется, будто бы в комитете сидят ебаные хипстеры, помешанные на создании каких-то ненужных выебонов в языке, вместо того, чтобы требовать наличия хорошей библиотеки.
>потому что нахуя иметь встроенный поиск в std::map с возможностью возврата значения по-умолчанию, если элемент не найден, если можно взять std::map::find и потом сравнить std::map::end.
operator[]
Он вставляет элемент, если его нет. А тут подразумевается случай, когда вставлять отсутствующий элемент ненужно.
> Почему нет потоков для работы с бинарными, именно бинарными, а не текстовыми данными
http://en.cppreference.com/w/cpp/io/basic_istream/read
> нахуя иметь встроенный поиск в std::map с возможностью возврата значения по-умолчанию, если элемент не найден
Для того, чтобы не бросать исключение из []
Это риторический вопрос был. Со знаками препинания у меня проблемы, вот тут то я и обосрался. Но, в общем, ты понял мою идею. И даже не в эксепшене дело, хотя он мог бы и тут вывалиться в зависимости от того, поддерживает ли тип исключительно копирование (как правило, move-семантака не кидает исключений, я такого не встречал). Это просто удобно.
>хотя он мог бы и тут вывалиться в зависимости от того, поддерживает ли тип исключительно копирование
Зачем для создания несуществующего значения копирование?
Нет.
Я потратил немало времени, и нашёл способ только костыль использовать. При создании треда через WinAPI точно ты ему передаёшь параметр в виде void*. Я в качестве аргумента использовал this, а функцию вообще вынес за класс.
У контейнеров Qt есть метод .value, который возвращает значение по-умолчанию в случае отсутствия записи в контейнере. Семантика передачи значения по-умолчанию там копирующая, поэтому будет вызван копирующий конструктор или присваивание. Если бы был метод с семантикой передачи rvalue-значения по-умолчанию, тогда, при наличии перемещающего конструктора или/и присваивания, при передаче временного объекта вызывался бы этот метод.
>>998717
Сырое я могу и через c-функции написать, только стало ли удобнее сереализовать целый объект при помощи метода write. Я так не думаю. Классов для работы с исключительно бинарными данными нет.
Кто тебе запретит?
Переустанови виндовс. Виндовс сама не переустановится. Переуставнови её сейчас. Переустанови её ещё раз. Поставь раком и опять переустанови.
Знаете, что такое лямбда-функция?! Прекрасное расширение языка. Аллах акбар!
В void он кастует, ну как-же. А потом, поди dynamic_cast-ом получаешь указатель на нужный объект.
Ломается после надписи сломайся здесь. Как это вообще возможно?
Down это массив указателей на тот же тип, что и сам Tree_node_source.
Valgrind выдает в следующей строке
Conditional jump or move depends on uninitialised value(s)
Н = 1 в момент поломки. Хотя до этого н = 0 не было равно. Но во многих местах такая же конструкция с фор и все работает.
Как думаете, в чем может быть дело?
Нет.
Я вообще редко вопросы задаю, и обычно нахожу в гугле, а если не нахожу, то спрашиваю в /pr.
reinterpret_cast
if (b==a)
{
//500 строк кода
}
else return false;
а
if (b!=a)
return false;
//500 строк кода
Это как то связано с особенностями компиляции или просто делается ради повышения читаемости кода?
Для повышения читаемости. return early pattern
https://pastebin.com/eZMj2bqB файл с классом, назвать User.cpp
https://pastebin.com/ie3JY8z9 main-файл, я назвал Server.cpp
Это своебразная база данных. Все происходит в классе User. На вход подается команда (на вход в смысле явно прописывается в main), парсится, а затем выполняется. База данных имеет структуру дерева иерархии. То есть есть например
Россия Правительство Путин.
Здесь записью является только путин. У каждой структуры Tree_node( вершина дерева) есть пометка IsAHum_ которая показывает запись это или точка в дереве иерархии. Вектор Down в структуре это вектор со ссылками. map Work это набор данных, который должен быть только у записей. То есть у Путина есть, а у Правительства нет.
Теперь о проблеме.
По отдельности команда SELECT и PRINT работают. SELECT каждый раз ищет в резульате предыдущего поиска (SELECTа). Изначально за результат предыдущего поиска берется все дерево. Причем поиск производится по дереву иероархии. То есть можно выбрать все записи, которые входят в правительство по запросу:
SELECT Правительство
Обходом дерева получаются ссылки на все вершины дерева предыдущего поиска, имя которых равно поисковому запросу, после чего эти ссылки помещаются в вектор Down специального экземпляра структуры Tree_node Buf_, который является свойством класса User.
То есть происходит следующее
https://pastebin.com/M71AXcH7
Программа падает, когда мы пытаемся сделать PRINT после поиска, а именно в момент обхода вершины дерева Top_, а именно его вектора со ссылками Down.
То есть если попросить напечатать содержимое Top_ до поиска, то все будет ок, такк как там просто копия всего дерева, но если выполнить селект, а уже потом попытаться вывести все, то в файле User.cpp после строки 52, программа упадет. Не могу понять в чем дело.
https://pastebin.com/iduBst2c Файл с базой. Назвать Base.txt
Предлагаю нового маскота
Чому? Натыкался на мнение, что сишный каст ололо небезопасный и его аналогом является reinterpret_cast<T>()
Что-то я побродил по сети, никакой аргументации не нашёл. Наоборот что-то про люниксы и хорошее быстродействие realloc, ну и не советуют одновременно new /malloc использовать.
Сишный каст - это не реинтерпрет каст, это примерно static_cast. reinterpret_cast - это смена типа без смены содержимого. Он должен использоваться только в платформозависимом коде для грязных трюков.
http://en.cppreference.com/w/cpp/language/explicit_cast
Дальше сам гугли.
>>999474
Проблема только в том, что перевыделенная память может иметь другой адрес со всеми вытекающими.
Если знал, то что спрашиваешь тут?
Где ты тут utf8 видишь?
После инжекта в процесс своей библиотеки и получения адреса функции, когда повесил хук на функцию, я могу вызвать в хуке оригинальную функцию, или будет вызвана уже хукнутая функция? Значит ли это, что нужно описать заранее оригинальную функцию и уже в хуке использовать её?
Обычно в теле функции, которой передается обработка, сначала вызывается оригинальная функция, а потом твои добавки в неё.
А, понял, все нормально значит.
Пока что только познаю ООП и у меня возникла проблема. Мой друган, который шарит в C#, рассказал мне, что в С++ можно делать переопределение функции.
Итак, у меня есть один базовый класс Player, в котором есть функция Attack() {}, а также есть два производных класса Knight и Wizard. У этих производных классов тоже есть функция Attack, в которой выводится пока что просто сообщение о том, что они таки нанесли урон. Вобщем нужно сделать так, чтобы в зависимости от созданного класса игрока (рыцарь или маг), вызывался нужный производный класс класса Player. То есть я создаю объект класса Player, но связанный с определенным производным классом, затем вызывается функция Battle для нужного производного класса. И если я выбрал рыцаря, то выводится сообщение для рыцаря, и так же для мага.
Можешь вкратце объяснить? Просто мой ингриш не настолько крут, чтобы статейки специализированные читать
>создаю объект класса Player, но связанный с определенным производным классом, затем вызывается функция Battle для нужного производного класса. И если я выбрал рыцаря, то выводится сообщение для рыцаря, и так же для мага.
Ты или делаешь два разных класса наследованные от игрока с разными функциями, или если ты хочешь именно один класс с разными в зависимости от инициализации функциями, то включи в свой класс ещё одно поле-подкласс или указатель на функцию, которой и будут различаться твои player-объекты после инициализации.
Сорри, я пока только учуссь, скажи что не так, перепишу получше. Алсо есть более чистая версия без отладочных выводов.
Начнём с того, что ты сохраняешь в вектор адреса локальных переменных.
User::Select(Tree_node Top_node_source, string Rule)
{
...
Buf_.Down.insert(Buf_.Down.end(), &Top_node_source);
...
}
Дальше разгребать скучно.
Ага, ну да, ошибка, странно что прога падает именно тут, но сейчас попробую поправить.
алсо подскажи, как писать лучше?
Код после Virtual members.
Лучше бы ты с жабы начал. Без системы в крестах можно мозг сломать.
Ищи информацию, в интернете на русском всё есть. Не пытайся понять сам.
Написал я тут дипломчик, описываю прогу разработанную, а из глаз кровища льётся. Это такой пиздец, что его людям показывать стыдно. Жуть, просто жуть
Поздравляю, теперь тебе нужно не только уметь создавать/удалять объект, но ещё и уметь ресайзить его. И объекты бывают посложнее, чем массивы чаров.
>>999843
Тебе будет понятнее, если сказать тебея, что указатель - это то же самое, что адрес? И чло сложение числа с указателем - это указатель, сдвинутый на это число позиций относиттельно его типа? Что там понимать-то?
Открой файл в с флагом binary, перейди в конец файла, узнай позицию, вернись в начало файла, выдели память, считай файл через read. Вроде должно работать.
Что-то я устал от назойливых новых ньюфагов.
Вопрос с++ господам.Есть задача про уравнение двух чисел джвумя заранее заданными операциями(Если это возможно). Как уравнять пару, еще более-менее понятно, но как определить неуравниваемую пару чисел?
Код здесь http://ideone.com/e9J0WG
Условие здесь:
Результатом применения операции 1 к паре натуральных чисел (a, b) является пара натуральных чисел (a+1, 2×b). Результатом применения операции 2 к паре натуральных чисел (a, b) является пара натуральных чисел (2×a, b+1).
Требуется за как можно меньшее число шагов с помощью операций 1 и 2 получить из пары (X, Y) пару равных чисел.
Результат записать как последовательность из единиц и двоек. Если "уравнять" данную пару невозможно, вывести 0.
1.
В книжке показали классы и сказали несколько интересных слов, я не мог не заинтересоваться и даже забил бы на них до главы про классы, но в результате экспериментов получил ненароком такое. Картинка. То есть я беру указатель на класс, выделяю под него память и явно вызываю конструктор (Хрен его знает как там это правильно сделать, написать q->my(); оно мне не позволяет, да и может быть конструкция q=my() уже сама по себе выделит память (хотя в этом случае я достиг падения программы, в отличие от способа с malloc), я пока с этим не разбирался и разберусь потом. Суть в другом.). И потом в коде обращаюсь к массиву в классе. Только вот судя по консоли у меня деструктор вызывается раньше этого обращения. Какого чёрта он там вызывается?
2.
Если в самом начале я напишу просто my q;, то всё работает корректно, деструктор вызывается после моего обращения.
Возникает вопрос, а как тогда объявить переменную-класс не вызывая конструктор вообще? По запросу "Как не вызывать неявно конструктор по умолчанию при объявлении класса?" ничего найти не могу. Вот я просто хочу объявить класс - то есть иметь переменную с нужными мне полями и вручную с ними работать внутри функции не вызывая конструктор вообще - как мне это сделать?
3.
В си структуры были. Я слышал, что в с++ теперь можно методы в структурах делать, так и оказалось. Предположил что структуры тем и отличаются, что у них конструктор не будет вызываться. Ан нет, абсолютно аналогично работает. В чём тогда различие структур и классов ныне? Тоже не могу нигде найти.
Первая картинка: my() - это конструирование временного объекта. Оператор = вызывает либо move constructor (если стандарт 11+. Деструктор не вызывается) либо copy constructor (похоже на твой случай). Память освобождается, в *q остаётся неправильный указатель, ты разъебошил ногу.
Если ты хочешь присваивать объекты с указателями, тебе нужно сбацать правильный copy constructor и move constructor.
>Возникает вопрос, а как тогда объявить переменную-класс не вызывая конструктор вообще?
Ты пытаешься выстрелить себе в ногу. Если ты хочешь, чтобы при создании переменной ничего не происходило, просто объяви пустой конструктор (или оставь дефолтный). RAII, парень.
3. Структуры отличаются только тем, что в них все члены public.
http://en.cppreference.com/w/cpp/language/move_constructor
http://ru.cppreference.com/w/cpp/language/move_constructor
http://en.cppreference.com/w/cpp/language/copy_constructor
http://ru.cppreference.com/w/cpp/language/copy_constructor
1. malloc только выделяет память указанного размера, но не вызывает конструктор, если хочешь пердолинга, то делай placement new, например: http://ideone.com/wdHEjl
А лучше всего делать стандартными средствами при помощи new и delete, а еще лучше использовать умные указатели.
2. То, как ты это назвал, это называется выделение в "статической" области памяти, то есть по-факту структура описания самого объекта размещается в стеке, если же твой класс содержит поля, которые создаются в куче, то они будут созданы в куче, как бы ты этого не хотел. При выходе из области видимости переменной, размещенной в стеке, для нее вызывается деструктор, причем в порядке, обратном их декларации. То есть, например:
>> {
>> my a;
>> my b;
>> ...
>> }
Сначала будет вызван деструктор для b, затем для a. Это вполне логично.
Если ты создал объект в куче (при помощи new, например), тогда деструктор для фактического объекта вызван не будет, вызван будет (если это вообще вызовом можно назвать, по факту, просто указатель стека сместится или данные перезатрутся в зависимости от контекста) деструктор для переменной-указателя, а не на то, что она указывает. То есть в следующем случае:
>> my *a = new a();
Ты имеешь две сущности. Первая - переменная a, которая является указателем на объект в куче. вторая - непосредственно объект a в куче. При выходе a из области видимости будет вызван деструктор именно для ПЕРЕМЕННОЙ-УКАЗАТЕЛЯ, а НЕ для ОБЪЕКТА. Поэтому, если ты не передал куда-то указатель для дальнейшего использования или не вызвал delete вручную, тогда, поздравляю, ты проебал память.
3. Различие структур между c и c++ состоит в том, что в обычном c кроме членов-данных ничего в структуру затолкать нельзя. В лучшем случае, если ты захочешь сотворить подобие какого-то класса, тебе будет создать члены-данные, являющимися указателями на соответствующие функции. Получится своеобразный виртуальный класс. На деле так делают изредка и просто прибегают к созданию заковыристых имен для функций на все случаи жизни. Алсо в цэ ты можешь при инициализации структуры указывать названия заполняемых полей явно, например:
>> struct my_struct s = { .param_a = 1, .param_b = "char str" ... };
В крестах такую хуйню не провернешь уже, потому что, как говорят старики из комитета, нахуя вам такой синтаксис, если родина дала конструкторы.
В крестах же отличие структуры от класса минимально и заключается лишь тем, что по-умолчанию в структуре все члены открытые (являются public), в то время, как в классе они по-умолчанию private. Деструктор, конструктор, если они не объявлены, генерируются автоматически, как, впрочем, и некоторые другие конструкторы и присваивания (но там есть множество исключений).
Алсо при объявлении шаблонов ты можешь использовать только ключевое слово class или typename, хотя это никакого отношения к структурам, фактически, и не имеет.
1. malloc только выделяет память указанного размера, но не вызывает конструктор, если хочешь пердолинга, то делай placement new, например: http://ideone.com/wdHEjl
А лучше всего делать стандартными средствами при помощи new и delete, а еще лучше использовать умные указатели.
2. То, как ты это назвал, это называется выделение в "статической" области памяти, то есть по-факту структура описания самого объекта размещается в стеке, если же твой класс содержит поля, которые создаются в куче, то они будут созданы в куче, как бы ты этого не хотел. При выходе из области видимости переменной, размещенной в стеке, для нее вызывается деструктор, причем в порядке, обратном их декларации. То есть, например:
>> {
>> my a;
>> my b;
>> ...
>> }
Сначала будет вызван деструктор для b, затем для a. Это вполне логично.
Если ты создал объект в куче (при помощи new, например), тогда деструктор для фактического объекта вызван не будет, вызван будет (если это вообще вызовом можно назвать, по факту, просто указатель стека сместится или данные перезатрутся в зависимости от контекста) деструктор для переменной-указателя, а не на то, что она указывает. То есть в следующем случае:
>> my *a = new a();
Ты имеешь две сущности. Первая - переменная a, которая является указателем на объект в куче. вторая - непосредственно объект a в куче. При выходе a из области видимости будет вызван деструктор именно для ПЕРЕМЕННОЙ-УКАЗАТЕЛЯ, а НЕ для ОБЪЕКТА. Поэтому, если ты не передал куда-то указатель для дальнейшего использования или не вызвал delete вручную, тогда, поздравляю, ты проебал память.
3. Различие структур между c и c++ состоит в том, что в обычном c кроме членов-данных ничего в структуру затолкать нельзя. В лучшем случае, если ты захочешь сотворить подобие какого-то класса, тебе будет создать члены-данные, являющимися указателями на соответствующие функции. Получится своеобразный виртуальный класс. На деле так делают изредка и просто прибегают к созданию заковыристых имен для функций на все случаи жизни. Алсо в цэ ты можешь при инициализации структуры указывать названия заполняемых полей явно, например:
>> struct my_struct s = { .param_a = 1, .param_b = "char str" ... };
В крестах такую хуйню не провернешь уже, потому что, как говорят старики из комитета, нахуя вам такой синтаксис, если родина дала конструкторы.
В крестах же отличие структуры от класса минимально и заключается лишь тем, что по-умолчанию в структуре все члены открытые (являются public), в то время, как в классе они по-умолчанию private. Деструктор, конструктор, если они не объявлены, генерируются автоматически, как, впрочем, и некоторые другие конструкторы и присваивания (но там есть множество исключений).
Алсо при объявлении шаблонов ты можешь использовать только ключевое слово class или typename, хотя это никакого отношения к структурам, фактически, и не имеет.
всё, нашел. это я чедух, удалял указатель, для которого не выделена память.
А не не. Уже нашел
>где хранится имя самой переменной
Нигде. После компиляции имя переменной не имеет смысла. Если язык интерпретируемый, то это уже по его усмотрению в какой-нибудь хеш-таблице, скорее всего.
>де хранится имя самой переменной
В компиляторе.
>где хранится адрес к которому привязана переменная?
В коде программы.
Как изменить максимальное значение для RAND_MAX? Мне нужно увеличить потолок, получаемый через rand().
Простой #define RAND_MAX 0xFFFFFFFF даст нужный результат?
Ты можешь в заголовочном файле библиотеки поменять. Но никаких гарантий, что что-то поменяется или rand после этого будет работать стабильно.
Если компилятор поддерживает C++11, то попробуй это.
http://ru.cppreference.com/w/cpp/numeric/random/uniform_int_distribution
Спасибо
#include <cmath>
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian");
int ptrx = NULL, ptry = NULL;
int bdxy = NULL;
//int x[100]; Ненужное
//int y[100];
//int rsg[100];
int n, i, rst, grr;
cout<<"Сколько пунктов "<<endl;
cin>> n;
ptrx= new int[n];
ptry= new int[n];
bdxy= new int*[n];
for(i=0; i<n; i++){
bdxy= new int[n];
}
for(i=1; i<=n; i++){
cin>> ptrx >> ptry;
}
for(i=0; i<=n; i++){
for(grr=1; grr<=n; grr++){
rst = abs(ptrx[grr]-ptrx)+abs(ptry[grr]-ptry);
cout<< i <<" и "<< grr <<" равно "<< rst <<endl;
bdxy[grr] = rst;
}
rst = abs(ptrx[i+1]-ptrx)+abs(ptry[i+1]-ptry);
}
cout<<endl;
for (i=0; i<n; i++){
for(int j=0; j<n; j++){;
cout<<" "<<bdxy[j];
}
cout<<endl;
}
delete []ptrx;
delete []ptry;
for(int count=0; count<2; count++){
delete []bdxy[count];
}
return 0;
}
Закрывает программу не окончив её. Это задача коммивояжёра, только там даются координаты и формула для расчета расстояние между городами по координатам.
В чем ошибка?
#include <cmath>
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian");
int ptrx = NULL, ptry = NULL;
int bdxy = NULL;
//int x[100]; Ненужное
//int y[100];
//int rsg[100];
int n, i, rst, grr;
cout<<"Сколько пунктов "<<endl;
cin>> n;
ptrx= new int[n];
ptry= new int[n];
bdxy= new int*[n];
for(i=0; i<n; i++){
bdxy= new int[n];
}
for(i=1; i<=n; i++){
cin>> ptrx >> ptry;
}
for(i=0; i<=n; i++){
for(grr=1; grr<=n; grr++){
rst = abs(ptrx[grr]-ptrx)+abs(ptry[grr]-ptry);
cout<< i <<" и "<< grr <<" равно "<< rst <<endl;
bdxy[grr] = rst;
}
rst = abs(ptrx[i+1]-ptrx)+abs(ptry[i+1]-ptry);
}
cout<<endl;
for (i=0; i<n; i++){
for(int j=0; j<n; j++){;
cout<<" "<<bdxy[j];
}
cout<<endl;
}
delete []ptrx;
delete []ptry;
for(int count=0; count<2; count++){
delete []bdxy[count];
}
return 0;
}
Закрывает программу не окончив её. Это задача коммивояжёра, только там даются координаты и формула для расчета расстояние между городами по координатам.
В чем ошибка?
Этот функционал появился в версии C++11. Адекватного способа добавить это в отсталый компилятор нет.
Я уже решил. Там наверно mingw ебнулся и не принимал <= в цикле, для ввода в матрицу значений.
То есть нужно либо самому в код добавить такую функцию?
Подключено.
Реализации и алгоритмы есть в интернете. В общем случае это какая-то разновидность перебора, т.к. задача коммивояжера - NP-трудная.
Так вот, какие-то сабпроекты - вообще охуеть, сам синтаксис пиздец. Я думал что посмотрю на гитхабе как делают все, а хуй там, костыли какие то.
Непонятно вообще, прямые пути писать в CMakeLists для каждого файла в корне проекта, или эти add_subdirectory использовать. И как их линкать между собой.
Помоги определиться с написанием с правильного CMake для проекта такой структуры:
/Project
- CMakeLists.txt
- /res
-- project.cpp
-- project.hpp
-- resources.hpp
- /src
-- app.ico
-- project.manifest
-- resources.rc
Ужасы то какие.
>>999648
4. Дочитал до перегрузки операторов. Вот глядя на эти оптимизации компилятора, если я перегружаю, для примера, "+", есть гарантии, что компилятор не поменяет местами операнды?
5. inline. Я могу его прикрепить в объявлении, в определении или сразу в двух местах, любая комбинация ошибок не выдаёт. В каких из четырёх вариантов этот модификатор применяется?
6. Список инициализации. В этот список можно засовывать чёрт-знает что. То есть по сути это просто более краткая запись того, что я изобразил ниже обведённое красным?
4. Компилятор никогда не меняет местами операнды (т.е. справа налево). Компилятор лишь может поменять порядок вычисления.
5. Если объява и тело в одном файле, пофигу, куда писать. Если писать инлайн в заголовке для скомпиленой либы, наверняка будет ошибка (ты предлагаешь компилятору инлайнить то, для чего нет исходника).
6. Для POD-типов список инициализации будет именно aggregate-инициализацией (пришедшей из C, это часто in-place конструирование). Обведённое красным может быть конструированием временного объекта (грамматически это std::initializer_list (название похоже на то, про что ты спрашиваешь, но это совсем другое), из которого конструируется объект нужного типа) и копированием/перемещением оного. Вообще говоря компилятору дозволено вызвать in-place конструктор в обоих случаях, но умеют ли они анализировать частный случай ради копеечной выгоды? Вряд ли.
Очевидно, что в случае с int это похую. В общем случае списки инициализаций предпочтительнее. Тело вообще может быть пустое.
Видел кучу разных способов, кто-то подключает все в main.h, а сам main.h в main.cpp. Кто-то во всех .h и в main.cpp подключает main.h, а потом эти .h уже подключают в .cpp.
Есть один говнокод http://ideone.com/A0jPgw. Работает правильно, но неоптимально. Как его можно оптимизировать?
Суть задачи: На вход подаются строки, а выдать мы должны либо "ОК", если строка встречается впервые, либо эту же самую строку и число(Сначала 1, потом 2, потом 3 и так далее)
Пример:
Ввод:
А
А
B
C
Вывод:
OK
A1
OK
OK
Да, я знаю, что это можно сделать без класса, но мне надо с классом
Строки загоняешь в словарь. Сама строка- ключ, значение по этому ключу - количество раз сколько эта строка встречалась.
>>1000869
Спасибо, буду гуглить
Туда ведь можно этот класс вкорячить? Мне просто необходимо именно написать класс для хранения этой инфы
Зачем тебе вкорячивать свой класс в контейнер общего назначения? Ты упорот?
Преподы мои упороты
> Разработайте класс, для хранения информации о зарегистрированных пользователях.
Стоит уточнить упоротость преподов. Может оказаться, что map нельзя использовать.
Про контейнеры не сказано ничего, следовательно разрешены, и map в том числе, я полагаю
Вообще говоря, решение такой задачи не требует и контейнеров и вообще занимает шесть строк, но вот эти ограничения... Зачем?
Я бы хотел увидеть эти 6 строк, но вижу только ошибку 404.
Каюсь, шесть строк -- это с мапом. Но все равно, зачем сюда вкорячивать класс -- неясно
А, блин, только сейчас заметил, что код уже . Вот что я напердолил с классом
http://ideone.com/8aXkqL
>>1000892
>>1000885
>>1000875
>>1000869
Господа, а если реализовать класс с одним-единственным публичным полем -- ником и реализовать все через мап, но вместо строки используя созданный класс. Взлетит?
А чем тебя твоя реализация не устраивает? Все методы find() делают то же самое, ты просто пользуешься уже готовой реализацией.
Лично меня моя реализация устраивает всем. Проблема в том, что на большом тесте (98532 строк) она не укладывается в лимит по времени (лимит -- 1 секунда)
> Преподы мои упороты
Скорее всего это ты упорот немного. Тебе нужен класс для хранения информации о зарегистрированных пользователях, а не класс для храненения имени пользователя. Тоесть тебе нужен класс с методами (к примеру): add(std::string name) и count(std::string name). Можно сделать чтобы add заодно еще и возвращал сколько раз встречается добавленное имя. Алсо add лучше назвать push_back (для большего подобия с stl), но это по желанию, смотря насколько ты себя дерзким парнем позиционируешь.
Проблема твоей реализации что у тебя для подсчета количества строк просматриваются все 98532. А, к примеру, для варианта с словарем для ста тысяч строк будет просмотрено не больше 17 элементов - так как там логарифм. Твой алгоритм можно немного модифицировать отсортировав массив с строками, и используя бинарный поиск - эффективность будет как у словаря. Но остается проблема с заполнением словаря, если строки тебе не выдаются сразу пачкой - тебе прийдется пересортировывать массив после каждого добавления. Даже если использовать сортировку вставками, которая для такого случая (вставка одного элемента в же отсортированый массив) очень удобна - все равно нужно сдвигать элементы в массиве. Тоесть добавление каждой новой строки - линия. Тогда как в словарь - логарифм.
Так оно не компилится.
Или я не туда пишу?
__forceinline int isThere (int n, int curPos, username * base){
int c = 0;
for(int i = 0; i < n; i++)
if(base[curPos].nick == base.nick)
c++;
return c;
}
>>1000909
Понял, примерно, буду гуглить
> поля ему какие нужны
Необходимый минимум - контейнер для строк. Тот же словарь, например. Или свой велосипед. Ну а так добавить можно еще что-то, например количество запомненых строк. Единственно правильного варианта нет. Нужно отталкиваться от сценариев использования твоего класса.
То есть, как минимум map<string, int> и еще один int? Понял, пойду пердолить
Что за хуйню ты напрограммировал. У тебя линейный поиск идет, в то время, как по-хорошему надо логарифмический сделать с исопльзованием std::set или std::map, например.
> от индуса до Линуса Торвальдса
Они друг от друга недалеко ушли. Оба не любят strict aliasing и обращаются к указателям до проверки их на NULL.
А, жопой читаю, простите.
> то может получится ещё пару миллисекунд выиграть
Возьму на вооружение, но все же я и так теперь управляюсь за треть секунды, мне хватит
> username::username(string a){
> nick = a;
> }
username::username(string a) : nick(std::move(a)) {}
> inline bool operator < (const username a, const username b){
> if (a.nick<b.nick)
> return 1;
> else return 0;
> }
Типичный boolshit.
inline bool operator < (const username a, const username b){ return a.nick<b.nick; }
>Хотя в эффективность этого верю
Дело не в эффективности. Я почти уверен, что компилятор выдаст для твоего и моего варианта одинаковый код. Он не тупой и понимает, что `if (x == true) return true; else return false;` можно заменить на return x;
Резонно
Кстати, хорошая идея. Потому что в самом начале уже задается максимальное количество имен и можно выделить память для unordered_map-а (с учетом max_load_factor естественно).
Думаю, нужно отталкиваться от того, что любой инклюд подставляет код в указанное место. Поэтому используй защиту от повторных инклюдов (#pragma once или комбинации #ifndef ANY_KEYWORD #define KEYWORD #endif, смотря каким компилятором пользуешься), разделяй реализацию класса и заголовочный файл класса, чтоб меньше кода подставлялось, это уменьшит время компиляции. Все статические инклюды то, где ничего не меняется, всякие <iostream>, <string>, <Windows.h> выдели в один отдельный заголовок, сделай его предкомпилированным, а всем остальным .cpp файлам прикажи использовать этот предкомпилированный заголовок, это тоже уменьшит время компиляции. Хотя всё это имеет значение на очень больших проектах, там будет ощутимо, когда компиляция занимает по 10-30 секунд.
Смотри, чтоб не было рекурсивных инклюдов, когда A.h включает B.h И B.h включает A.h
>>1000878
Какая часть цитаты подразумевает запихивание твоего класса в map? Что именно преподы хотят видеть в классе - хранение строки (лолчто? Лолнахуй?) или считывание из cin?
Стоило бы спросить у преподов про то, что должен подерживать класс - копирование, exception safety, thread safety и, самое главное, цель запихивания в класс. Потому что, когда что-то запихивают в класс, это делают либо для автоматического управления ресурсами, либо для того, чтобы в этот класс пихать что-то индивидуальное, а задание - прочитать из cin, и он один на всю программу.
Подойди к заведующему кафедры и изложи упоротость препода. Считывание из cin и проверка на повторы с выводом результата - это одно действие, а не материал для класса.
>>1000892
Когда говорят о строках, говорят о строках читаемого кода - по статементу на строку.
>bits/stdc++
Совсем ебанутый.
>>1000930
Отлично, username - это чуть ли не один в один string. С таким же успехом мог сделать typedef string username
>string name;
>in >> name;
>a = username(name);
>return in;
in>>a.nick - нет? Слишком просто?
return in>>a.nick;
Годно расписал, спасибо.
> Какая часть цитаты подразумевает запихивание твоего класса в map? Что именно преподы хотят видеть в классе - хранение строки (лолчто? Лолнахуй?) или считывание из cin?
> Стоило бы спросить у преподов про то, что должен подерживать класс - копирование, exception safety, thread safety и, самое главное, цель запихивания в класс. Потому что, когда что-то запихивают в класс, это делают либо для автоматического управления ресурсами, либо для того, чтобы в этот класс пихать что-то индивидуальное, а задание - прочитать из cin, и он один на всю программу.
> Подойди к заведующему кафедры и изложи упоротость препода. Считывание из cin и проверка на повторы с выводом результата - это одно действие, а не материал для класса.
Честно скажу -- мне плевать. Мне нужно было пройти тесты и написать какой-никакой класс. Так что ну их, эти костыли, да и скорее всего, это никто и читать не будет
>>1001002
> Даже ещё лучше:
> return in>>a.nick;
А вот это классно, спасибо, возьму на вооружение
Во - гугло ссылка https://www.google.com.ua/search?q=с+++как+посмотреть+стек&oq=с+++как+посмотреть+стек&aqs=chrome..69i57.4596j0j7&client=ubuntu&sourceid=chrome&ie=UTF-8#q=с+++как+посмотреть+стек+вызовов
>>1001132
Там нету информации о том какую библиотечную функцию я использую. Там просто показываются только мои функции.
Когда доходишь до вызова делай принудительный вход в вызываемую функцию (Force Step Into) и смотри стек вызовов. Название вызванной функции будет в стеке вызовов.
Ты не понял. Тут алгоритмы нужны, чтобы на картинке, к примеру, 800x600 вычислить яркие цвета, отличающиеся друг от друга. Пусть это будут красные квадраты. Найти их центр масс. Далее вычислить до них расстояние через известные величины. Это задача, и никакого ML не требуется.
Ну я тебе могу ссылок из гугла покидать на запросы "opencv color detection" и "opencv figure detection".
http://opencv-srf.blogspot.com.by/2010/09/object-detection-using-color-seperation.html
http://www.pyimagesearch.com/2016/02/08/opencv-shape-detection/
https://stackoverflow.com/questions/11424002/how-to-detect-simple-geometric-shapes-using-opencv
11. Одикостоящая цифра преобразовывается в тип класса, из за неявного преобразования. Конструктор, который принимает один аргумент типа, становится функцией преобразования из типа в аргумента в тип класса. поставь рядом с конструктором explicit один "d" пропадет.
7. Новый объект класса инициализаруется уже существующим объектом класса, чистой воды контактор копирования.
Что тебя смущает ?
Точнее d не пропадет у тебя будет что то типо "нету преобразования из int в тип А". Ошибка компиляции будет.
Вопрос отдельный : Как ты так хитро вызываешь f() ? она ведь метод класса, а операция членства не задействована (c.f(3) например).
Это копия, сохраненная 7 июля 2017 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.