Ответы пользователя по тегу C++
  • Где найти интересные задачи по с++ разного уровня?

    bogolt
    @bogolt
    Не знаю что такое "озов" похоже на город какой-то, но тогда неясно отчего с маленькой буквы. Говорят в древности на Руси алфавит ( ну или буквица ) начинался с буквы Аз, откуда вероятно и пошли азы...

    По сути вопроса - любая программа длиннее тысячи строк будет представлять собой вполне себе задачу среднего уровня. Поставьте себе задачу и реализуйте ее на си++. Например напишите свой http/ftp сервер или клиент. Создайте простую игру, или удобное приложение.

    Можно конечно искать задачи где нужно "с помощью указателей" сделать что-либо, или "написать иерархию классов с виртуальными функциями" но имхо это полная ерунда. Она может помочь разве что закрепить синтаксис языка, но не дает понимания того зачем конкретная фича языка нужна.
    А вот создание собственной объемной программы - такое понимание дает в полной мере. Когда вы напишите 20й класс похожий на остальные, то зададитесь вопросом как это можно сделать проще, перечитаете учебник языка и поймете зачем нужны например шаблоны или виртуальные функции.
    Если до написания программы ( а лучше во время ) вы будете штудировать учебник языка - будет совсем хорошо.
    Ответ написан
    Комментировать
  • Какими сопутствующими технологиями необходимо сегодня владеть, чтобы работать удаленным С++ программистом?

    bogolt
    @bogolt
    Если с десктопом глухо ( хотя мне периодически попадаются и там предложения ) то можно попробовать переквалифицироваться в разработку для мобильных - obj-c или java или си++ для игровых проектов.
    Ответ написан
    Комментировать
  • Зачем в современных проектах все еще используются макросы?

    bogolt
    @bogolt
    Макросы нужны там где нужно во время компиляции программы генерировать код. Функции или даже шаблоны для этого не подходят.
    Например вы хотите логгер, который бы писал в каком файле, и на какой строке произошла ошибка, вы пишите код

    cout << __FILE__ << __LINE__ << "error message";

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

    Итак теперь вы тяжело вздохнув, и закрыв портретик Страуструпа шторкой ( чтобы не видел как вы предаетесь адскому макросостроению ) пишите макрос
    #define LOG(x) std::cout << __FILE__ << __LINE__ << x << std::endl;


    Теперь где угодно можно писать
    LOG("this is error number " << errno);
    и все будет работать как и было запланировано.

    Еще из полезных свойств макросов - улучшать чужой плохой код. Если у вас есть много переменных, или переменных имена у которых почти совпадают с именами функций и вам нужно сделать этот код умнее, вы пользуетесь макросами, склеиваете строки через ## или преобразовываете переменную в строку через #
    Это довольно мощные инструменты ( пусть до лисповских максросов им далеко ) которые реально позволяют улучшить код и/или избежать кучу повторений одного и того же блока кода.
    Ответ написан
    Комментировать
  • С++.Работа с сокетами?

    bogolt
    @bogolt
    По умолчанию все операции с сокетами - блокирующие. Это означает что пока операция не выполнится код не пойдет дальше.
    Методов решения этой проблемы много:
    - использовать неблокирующие сокеты
    - использовать неблокирующий вызов select
    - выделить все в отдельный поток ( плохой метод, потом замучаетесь разбираться почему крэшится ).

    Советую почитать руководство по сетевому программированию, ну или хотя бы посмотреть на код клиента и сервера. beej.us/guide/bgnet/output/html/multipage/index.html
    Ответ написан
    Комментировать
  • Регулярные выражения, Поиск всех видов чисел в строке, CString

    bogolt
    @bogolt
    1. Во всех адекватных функциях поиска учтена возможность начала поиска с определенной позиции.

    2. Как ваш алгоритм выудит число 0xa11 ?

    3. Не понимаю зачем тут нужны регулярные выражения. Все имхо можно вполне сделать простым алгоритмом:
    Разбить на строки
    Каждую строку разбить на отдельные слова ( делить по пробелам, знакам препинания ( исключая точку которая может быть разделителем дробных чисел ).
    Проверить каждое слово на символы из которых оно состоит - это вы уже реализовали.
    Ответ написан
  • Почему не работает перегрузка оператора?

    bogolt
    @bogolt
    Шаблонные классы и методы нельзя определять в cpp файлах. Перенесите весь шаблонный код в заголовочный файл и все заработает.
    Ответ написан
  • Linux - Как записать строку в другой кодировке в объект string в c++?

    bogolt
    @bogolt
    Сталкивался с подобной проблемой - скорее всего у вас некорректно происходит запись в utf8 строку. Вместо "name" у вас там "0n0a0m0e" то есть под каждый символ идет 2 байта вместо одного.
    Для решения - возьмите любую библиотеку по работе с utf8-16 и убедитесь что обе строки в одной кодировке. Как простейший вариант, если мое предположение с нулями подтвердится можете просто руками их оттуда выбросить ( если у вас конечно гарантированно везде только ascii ).
    Ответ написан
    Комментировать
  • Java vs C++. Что полезнее?

    bogolt
    @bogolt
    Удивляюсь почему в сравнении Java vs C++ многие упоминают, что Java кросс-плафторменна. Си++ тоже кросс-платформенный ЯП. Программа написанная на нем может быть скомпилирована практически под любой платформой. Да, программу на си++ нельзя перенести на уровне бинарников, но часто ли вы видели универсальные бинарники?
    Для Си++ есть множество очень полезных библиотек позволяющих писать красивый и быстрый GUI ( единственная известная мне хорошая GUI программа написанная на Джаве - Eclipse ). Большинство же десктопных приложений пишется именно на плюсах.
    В новом стандарте появилась нативная многопоточность ( впрочем раньше никто не мешал использовать одну из множества кросс-платформенных библиотек для достижения тех же целей ).

    Из основных недостатков си++ скажу что первые 2 года работы с этим языком программист больше вредит, нежели помогает. Это учитывая что он неплохо уже знает синтаксис и уже пишет на нем какие-то программы. Огромное количество скрытых ям, граблей, заряженный ружей - заботливо разложены создателями нескольких версий стандартов, в безумной мечте об обратной совместимости языка ( что конечно очень круто ).
    Ответ написан
    7 комментариев
  • Как прокачать навыки в C++?

    bogolt
    @bogolt
    Из литературы всегда советую Брюса Эккеля - Философия Си++ ( Thinking in C++ ). К сожалению на данный момент в связи с выходом 2011 стандарта книга стремительно устаревает. Хотя все ключевые моменты там очень хорошо разъяснены.
    Про разработку реальных приложений - тут на мой взгляд нужен реальный опыт - создание большого проекта в команде более опытных разработчиков творит чудеса и повышает уровень участников с невероятной скоростью. Разумеется команда должна быть офлайновая, через интернет подобные знания передаются хуже.
    Ответ написан
    Комментировать
  • Изучение C++. Как сдвинуться с мертвой точки?

    bogolt
    @bogolt
    Не переживайте. Переход от теории к практике это всегда непросто. Для написания первой программы, как бы внимательно вы не изучали теорию, вам придется много раз обращаться к справочникам или к гуглу. Этот этап нужно просто пройти. Ничего, что написание первого кода занимает,как вам может казаться бесконечность. Главное двигаться вперед, и понимать ( хотя бы ключевые моменты ) того что вы делаете.

    Кроме того можно попробовать начать с модификации примеров рабочего кода. Берите код из туториалов по интересным вам темам ( по тому же сетевому программированию огромное количество примеров как клиентов так и серверов ).

    Тут уже написали про ваш пример - расскажите с чем проблема в вашем коде? Быть может стоит его разбить на несколько частей, и убедится что каждая из них работает как задумывалось.
    Ответ написан
    1 комментарий
  • Передача переменной в exe файл при его скачивании?

    bogolt
    @bogolt
    В тело программы добавьте буфер, который будет хранить внедряемое при скачивании значение, например так:
    volatile char external_buffer[MAX_LEN] = {0};

    При скачивании в тело exe вставляйте нужные данные ( тут два варианта, либо узнать смещение выделенного буфера, либо искать по уникальному его значению ).
    Сама же программа сможет просто пользоваться значением переменной.
    Ответ написан
    Комментировать
  • Как конвертировать unix time в std::string?

    bogolt
    @bogolt
    По-моему самое разумное вынести код функции в отдельный файл, и обернуть его pragma push/pop с отключением надоедливого ворнинга.

    Насчет медленной работы вашей программы используя преобразование через буст — это немного странно ведь если вы обращаетесь к каждому файлу а затем преобразовываете время, то очевидно что именно обращение к файловой системе должно быть узким местом.
    Ответ написан
  • Увеличение скорости компиляции?

    bogolt
    @bogolt
    SSD по идее влиять не должен, потому что узкое место процессор а не диск. Экспериментировал, кидал проект в tmpfs ( файловая система в оперативке ) — скорость сборки не менялась. Впрочем возможно на больших проектах разница будет но вряд ли значительная.
    Если процессор многоядерный — скажите системе сборки чтобы использовала побольше этих самых ядер ( make -j N ( где N — 1.5 * количество ядер ) ).
    Ответ написан
    2 комментария
  • Посоветуйте книгу по многопоточному программированию

    bogolt
    @bogolt
    David R. Butenhof — Programming with POSIX Threads
    Подробное, хорошее описание принципов работы, с примерами написанное живым языком.
    Ответ написан
    Комментировать
  • Можно ли вызвать конструктор прародителя в обход конструктора родителя?

    bogolt
    @bogolt
    Сделайте два конструктора Father, один покупающий собаку а другой не покупающий ее, и вызывайте тот что вам нужен. Ну или как вы сами предложили можно передавать атрибут говорящий о нужности этого действия
    Father(int capital, bool need_to_buy_god);


    Вообще же в си++ невозможно не вызывать конструктор при создании объекта, можно лишь выбрать какой из конструкторов будет вызван.
    Ответ написан
    Комментировать
  • Загрузка веб-страницы на Visual C++?

    bogolt
    @bogolt
    1. Скачать страницу ( google: socket, http )
    2. Показать ее ( google: QtWebView )
    Ответ написан
    Комментировать
  • Не компилируется helloworld.cpp в g++

    bogolt
    @bogolt
    #ifdef CPP_NEW_VERSION
    #define NAMESPACE using namespace std;
    #else
    #define NAMESPACE
    #endif

    А в свойствах своего проекта можно указать нужный дефайн, чтобы неймспейс подключался.
    Ответ написан
  • Защита программы от декомпиляции Java, C++, С#

    bogolt
    @bogolt
    В скомпилированной программе на си++ можно найти текстовые строки, имена фукнций и классов. Для того чтобы скрыть значение текстовых строк — программа может хранить их в зашифрованном виде, и расшифровывать перед использованием. Это сильно затруднит понимание того какое именно сообщение собиралась вывести программа, и следовательно что делает та или иная часть кода. Однако у нас еще остались имена функций. По идее их можно вырезать используя strip но гораздо смешнее изменить их так чтобы важные вам фукнции ( например isAppRegistered() ) работали не совсем так как предполагается, например эта фукнция может вызываться по таймеру раз в 10 секунд, хэшировать значения разных переменных и возвращать какой-то результат. Реальная же фукцния проверки регистрации будет называться debugPrintString() и… не будет вызывать никаких окон оповещающих о том что что-то случилось не так. Эти окна опять вызовуться из другого потока, по таймеру в случае если наша debugPrintString() изменила пару значений. )
    Ответ написан
    Комментировать