Задать вопрос
  • C++. Почему при добавлении к адресу переменной +1, адрес увеличивается на8?

    @vilgeforce
    Раздолбай и программист
    Потому что указатель начинает указывать на следующий элемент той размерности, для которой указатель создавался. Сделаете unsigned char* - будет на размер char увеличиваться (1 скорее всего), unsigned long long* - на 8. void* скорее всего вообще не даст такой фокус провернуть (и правильно сделает).
    Ответ написан
    8 комментариев
  • Как повысить уровень программирования в общем и в C++ в частности?

    afiskon
    @afiskon
    Присоединяйтесь к open source проекту или начните свой большой проект. Разбивайте его на части, двигайтесь постепенно. Так, чтобы несколько часов работы - и уже какая-то фича, пусть и небольшая. Не обязательно делать прям ну очень большой проект, можно начать с чего-то простенького - todo-шка, простенький irc клиент, и так далее, и потом постепенно развивать. Если удастся найти что-то, что вам лично сейчас нужно, будет больше мотивации. Еще как вариант, посмотрите в backlog у вас на работе. Всегда есть какие-то большие, но на данный момент не приоритетные задачи. Попробуйте взять одну из таких задач и написать PoC в свободное время. Если получится хорошо, покажите начальству, так и С++ на свою работу протащите! Ну а вообще самый-самый крутой способ прокачать в чем-то скил - устроится все-таки на работу где это используется.
    Ответ написан
    Комментировать
  • Что такое нарушения принципов ООП?

    @Mercury13
    Программист на «си с крестами» и не только
    Нарушение инкапсуляции. Наружу (т.е. public) торчат какие-то данные, которые можно изменить, и объект уходит в противоречивое состояние.

    Инверсия абстракции. Простые вещи, которые, вероятно, понадобятся потомкам, недоступны даже через protected.

    Нарушение принципа Лисков (ломаная абстракция). Для отца вы сделали некое предположение, которое неверно для сыновей. Классический пример — прямоугольник и квадрат — предполагается, что отец может произвольно масштабироваться, что неверно для сына.

    Класс вместо интерфейса. Если можно, родителя делайте классом без данных с двумя видами функций: public virtual = 0, и protected/public не-virtual (т.н. интерфейс с утилитами). Наследоваться от нескольких классов с данными очень некузяво (а во многих языках вообще невозможно).

    Всемогущий родитель. Слишком много функциональности придумали родительскому классу.

    В общем, покажите интерфейсы (protected/public, без точных реализаций) ваших классов, и погоняем, что там неверного.
    Ответ написан
    Комментировать
  • Какой путь выбрать?

    God-emperor
    @God-emperor
    create a golden path
    Фрилансить на C# - себя не любить. Имхо.
    Ответ написан
    4 комментария
  • Какие ЯП не требуют кучу прикладнухи для устройства на работу?

    Я постараюсь подключить философию, примеры и "как если бы я говорил в баре с вами".

    ЯП - это инструмент. Инструмент всегда взаимодействует с объектом и со средой. Соответственно, вам точно нужно что-то знать про объект и уметь пользоваться инструментом внутри среды, а это потащит дополнительные знания, назовем их "естественными" зависимостями. Насколько глубоко их нужно знать? Тут ответа не бывает: настолько, насколько нужно и хочется. Тут важен баланс и акцент. Если нет строгих параметров на уровне разума, нужно верить интуиции, потому что больше нечему. Для JS-программиста JSON/jQuery/AJAX - это естественные зависимости, их в любом случае не получится обойти. Даю зуб, что вам хватит вечера и немного гугла, чтобы стать чуть ли не LIKE A PRO в этом. Это все форматы хранения данных, либы, парадигмы. Это примерно как прочитать состав у шоколадки по сложности и входному порогу. Скорее всего, вас пугают сложные слова. Примерно как сказать "НАПРАВЛЕННЫЙ АЦИКЛИЧЕСКИЙ ГРАФ", и вы сразу знаете теорию графов, хотя с практической точки зрения суть настолько элементарна, что аж страшно, а вы будете долго прокрастинировать и искать что попроще.

    Это что касается близких и неизбежных естественных зависимостей. Но есть и более далекие, но тем не менее все равно естественные, их знание позволяет развиваться, иметь более полную картину в голове. Вот есть гитарист, он может быть просто технарем. Есть гитарист-музыкант, который чувствует дорийский лад в блюзе. А есть гитарист-музыкант-звукорежиссер, который наконец-то понял, как надо жирно сводить гитары и теперь в симбиозе со звукарем. Кто из них самый крутой, очевидно.

    Вы можете просто верстать (html/css) и игнорировать программирование в целом. Но естественная среда противится: вы уже (!) пишете на декларативном языке, неплохо было бы узнать об этом подробнее (о языках или даже о типизации), тем более, что крайне близко к вам находится интереснейший язык js, а там моментально вылезут проблемы связывания html и js, разные подходы к этому, целые парадигмы и фреймворки; и вот вам выпадает интересная задача по анимированию svg, вы курите мануал по нужной либе, читаете что-то про reflow/repaint, внезапно узнаете что-нибудь про селекторы. И через какое-то время, будучи все тем же верстальщиком, вы видите архитектурный косяк дизайна, который очень неудобно укладывается в используемые технологии, предлагаете его пофиксить и спасаете команду от факапа через месяц, когда какой-нибудь транзишн наложится на какой-нибудь position: fixed и еще и в Safari упадет анимация и только там, а тут и новая тудушка: "Переделать, нафиг, всю шапку, чтобы ок было". Что-то изменилось в мышлении и картина стала полнее. ВНЕЗАПНО вы уже и инженер, можно сказать, ЗП растет, все дела, рутины меньше стало.

    Так вот, о инженерах. Можно выучить, например, Python за пару дней, там же отличный мануал. Но настоящий программист - это инженер, потому что вся суть в архитектуре, во взаимодействии объектов/компонентов и в том, как все это соотносится с задачей. Какой молоток взять, это уже без разницы, как состав на банке прочитать. То есть суть вашей работы заключается как раз в объекте и среде, а не в инструменте. Образно говоря, когда вы сидите в кафе, суть не в чашке чая, а в атмосфере и как вы себя в ней чувствуете, но при этом чашка чая нужна, чтобы заставить вас что-то делать и вписать тем в самым во взаимодействие со средой, поэтому придется научиться красиво пить чай.

    Подведу тут черту: естественные зависимости - это норма, а суть в инжиниринге. Можно двигаться по зависимостям дальше. У вас есть интервал, где есть минимальный порог, ниже которого нельзя, и максимальный, где вы "мастер на все руки", что тоже плохо. Между минимальным и максимальным порогом можно двигаться. Взять те же сети: разворачиваете приложение, видите линуху, настраиваете сеть. Можно немного заморочиться и прочитать про основы маршрутизации, буквально 2 вечера, можно еще про сетевой стек в линукс, еще 2 вечера, и уже будет во много раз проще. Кроме того, возрастет культура в целом и если вы программист на бэке, то вам будет проще взаимодействовать с админами. Про OSPF, очевидно, читать не надо, важен баланс. Баланс - это понимание того, на что у вас акцент (вы программист? какой? фронт/бэк? насколько важны сети/ос? проектируете бд? верстаете? интересен ли прикладной кодинг под какую-то ос и так далее...) и насколько интересны естественные далекие зависимости выбранной области.

    Так вот, теперь у нас есть естественные зависимости, инжиниринг и баланс между порогами. А не php/jquery/html/css.

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

    Кстати, что касается SEO: с технической точки зрения это пара мануалов от гугла и не более того. Там сеошники наговорить могут много, с ними надо быть осторожнее :)

    А теперь, собственно, выводы:

    1) Вакансий крутых много, надо пробовать. Нужно только отличать близкие и необходимые естественные зависимости от мастера на все руки. Я считаю, что мастером на все руки нужно поработать хоть однажды, чтобы просто понять, почему это плохо. Но зависимости будут всегда, и это норма. Вы перечислили слишком радикально, конечно.
    2) Себя пилить под вакансию не нужно. Нужно просто идти туда, где интересно, всегда стараться быть инженером и не убить в себе искусство (то есть не бояться делать так, как кажется правильно, чтобы либо убедиться в правоте, либо ошибиться и стать круче).
    3) Не нужно думать в стиле "а что если завтра рубионреилс развалится, комьюнити разойдется, вакансий не будет, что я буду делать". Вы же инженер. У вас опыт в проектировании IT-систем, перейти на что-то смежное, если будет понятно, что технология умирает, не составит труда.
    4) По естественным зависимостям нужно двигаться по мере интереса, вы станете от этого только лучше.

    Это, конечно, если вам действительно все это интересно. Все это области, очень близкие к искусству, и тут надо любить все это делать.
    Ответ написан
    8 комментариев
  • Какие ЯП не требуют кучу прикладнухи для устройства на работу?

    barmaley_exe
    @barmaley_exe
    Никакие.

    Один лишь ЯП в вакууме с точки зрения применения в конечном продукте абсолютно бесполезен. Ибо, как правило, программный продукт существует не обособленно, а, так или иначе, взаимодействует с другими программами (операционной системой, например). Более того, зачастую разумно не изобретать велосипед, а воспользоваться уже готовым решением, которое было проверено временем. Таким образом, приходится знакомиться с кучей уже существующих технологий.

    Вообще, в области server / desktop / mobile очень сложно уйти далеко без, как минимум, следующего:
    • Объектно-ориентированное программирование и проектирование — ведь код не должен быть говном
    • Параллельное программирование — ведь делать нужно много и быстро, а у нас уже 10 лет как многоядерные машины есть
    • Сети — ведь нельзя жить без интернета
    • Базы данных — ведь данные надо где-то хранить, и хранить надёжно


    hardware не комментирую, но там ещё хардкорнее.

    Собственно, для программиста не столько важно знать какой-либо конкретный ЯП, а важно владеть технологиями разработки. ЯП, конечно, входит в это множество, но им оно совсем не ограничивается.
    Ответ написан
    3 комментария
  • Чем WCF лучше Remoting?

    В WCF можно создать прокси класс (студия умеет создавать автоматически) и работать с ним как с обычным локальным классом.

    По сути Remoting это реализация протокола SOAP поверх HTTP, в WCF пошли дальше, так есть понятия биндинга и привязок, что позволяет выполнять вызовы в том числе и по TCP, что хорошо для производительности.

    имхо WCF не столько новая технология сколько попытка объединить несколько ранее реализованных технологий (включая Remoting)
    Ответ написан
    Комментировать
  • Как лучше реализовать такой демон?

    @protven
    Вы, судя по описанию, придумали Connection Pool. Не надо его писать самому, посмотрите в сторону готовых реализаций. BoneCP, Tomcat connection pool и тд.
    Ответ написан
    Комментировать
  • Self hosted web-archive?

    @vikarti
    если все же именно аналог Internet Wayback Machine и надо старые копии хранить и все такое: использовать WAIL (matkelly.com/wail ) + планировщик.

    если не надо старые и на сервере Windows - использовать (платный) Offline Explorer (если страниц много то лучще Enterprise-версию). Windows-GUI + встроенный (слабый) вебсервер
    Ответ написан
    Комментировать
  • Какое тестовое задание "на дом" для junior C++ вы посоветуете?

    donkaban
    @donkaban
    Умею рисовать тени
    Построить гистограмму "Войны и Мира" в один поток.
    Постороить ее же в несколько.
    Замерить время, обосновать выбор.
    Ответ написан
    3 комментария
  • Что нужно знать, на будущее, о среде .NET?

    Razaz
    @Razaz
    Asp.Net junkie
    Вообще .Net давно работает на Nix*. Просто имплементация стандарта не поддерживалась MS официально.
    Вот тут списочек : Mono Software Showcase.

    Сейчас MS меняет свою политику по части инструментов и тд. и будет официально поддерживать свою реализацию платформы на Win, Mac и Linux.
    Вот страничка CoreFx - https://github.com/dotnet/corefx. Как видите билды на Linux уже проходят.
    А вот CoreClr - https://github.com/dotnet/coreclr. Там уже и на Маке подняли билды.

    А нужно многим. Например, я бы рад сделать продукты кроссплатформенными, но от Java глаза вытекают(особенно после C#6), Scala - слишком нишевая, интерпретируемые я не люблю(производительность, нет статической типизации и тд- просто личное предпочтение). Вот и остается только C#/.Net. Ну и не я один такой)

    Если откинуть хэйтинг МС отдельными личностями - то ИМХО C#/.Net сейчас наиболее перспективный и интересный тулсет.
    Ответ написан
    2 комментария
  • Как понять заголовочные файлы?

    @Mercury13
    Программист на «си с крестами» и не только
    #include — как ни странно.

    Вы так и не поняли такой вещи, как «единица компиляции». Дело в том, что в Си c-файлы компилируются независимо друг от друга (в единую программу всё собирает линкер). А чтобы сказать «оно есть, только в другой единице компиляции», используют прототипы и extern’ы.

    А если вы хотите просто внести код в ту же единицу компиляции, просто пишите его в хедере, да и всё. Только в большинстве компиляторов это исключает предкомпилированные хедеры — а ТАКИЕ хедеры вам предкомпилировать, скорее всего, и не нужно.

    <брюзга mode on>
    Не создают кода (а значит, в традиционной системе с кучей единиц компиляции находится именно в хедерах)
    • extern и прототипы
    • inline
    • не до конца специфицированные шаблоны
    • static-поля в классе (но потом это static-поле придётся повторить в какой-нибудь одной единице компиляции)
    • может, ещё что-то, только я забыл…
    <брюзга mode off>
    Ответ написан
    1 комментарий
  • Как перейти с Windows на Linux для работы с C++?

    @Eddy_Em
    Быстро не получится.
    Сначала почитать пару-тройку книжек про то, как вообще в линуксе работать. Еще неплохо бы Advanced Bash Scripting почитать. Получается, минимум полгода уйдет на литературу.
    Далее обкладываемся гентушными хэндбуками, гуголом и т.п. и ставим генту.
    Помаленьку настраиваем и через год-два уже на мастдайку вообще не потянет! Главное — понять суть UNIX-way, тогда станет ясно, что мастдайка — это даже не гнилая операционная система, а некачественная прошивка для игровых приставок!
    Ответ написан
    1 комментарий
  • Как грамотно построить архитектуру базы для логов?

    gbg
    @gbg
    Любые ответы на любые вопросы
    Если данные однородны и все чаты одинаковы - первое. Если есть вероятность, что набор сохраняемого для разных чатов будет различным - второе.
    Ответ написан
    Комментировать
  • Segfault, не могу найти ошибку, что надо исправить(C++)?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    @#$%^#$%^$%^&@#$%^

    Вы сайтом ошиблись, это надо на говнокод постить.

    #define вместо констант - лажа, но допустимая.

    Rainberd углядел, что в самопальной сортировке классическая "ошибка копипаста". Посмотрите внимательно на вложенный цикл, там условие должно быть j<n, а у вас - i < n Это сегфолт номер раз.

    А вот это - причина сегфолта номер два:
    char *str_pr = &str[0u];
    char *quality=&str2[0u]   ;

    В версиях до C++11 нет никаких гарантий, что это дело указывает на массив всех символов строки.
    В любых версиях нет никаких гарантий, что этот адрес будет неизменным в течении жизни строки.

    Кто надоумил вас использовать функционал библиотеки C для работы со строками, да еще и смешивать его с STL?

    Самопальная сортировка - тоже ужас. Этот код проще переписать, чем рефакторить.
    int i;
    for(i=....

    Откройте для себя объявление индекса внутри цикла:
    for(size_t i=0...

    Откройте для себя, что массивы должны индексироваться при помощи size_t, а не int.

    Тут в большинстве своем код на C, с операторами C++ в некоторых местах. Печать структур просится, например, в виде дообъявления оператора << у ofstream.

    Если это студенческая работа, преподавателя, который "подготовил" такого студента нужно лишить конфет и поставить в угол.
    Ответ написан
    8 комментариев
  • Как в С++ использовать несколько методов к объекту как в JavaScript?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    В C++ это будет вызов метода method2() у того, что вернул method1().

    А вы что хотите? Чтобы method2() вызывался у object? тогда метод1 должен возвращать ссылку на *this.

    #include <iostream>
    #include <stdexcept>
    #include <iomanip>
    using namespace std;
    
    
    struct vantuz
    {
       vantuz& push();
       vantuz& pull();
       vantuz();
    private:
       bool pushed;
    };
    
    vantuz::vantuz():pushed(false)
    {
    }
    
    vantuz& vantuz::push()
    {
            if(pushed)
            {
                  throw logic_error("already pushed!");
            }
            pushed=!pushed;
            cout<<"push! ";
            return *this;
    }
    
    vantuz& vantuz::pull()
    {
        pushed=!pushed;
        if(pushed)
        {
              throw logic_error("already pulled!");
        }
       cout<<"pull! ";
       return *this;
    }
    
    int main()
    {
       try
       {
          vantuz v;
          v.push().pull().push().pull().push().pull().push().push();
       }
       catch(logic_error& ex)
       {
       	  cout<<endl<<setw(20)<<setfill('@')<<' '<<"Runtime error!"<<setw(20)<<setfill('@')<<' '<<endl<<ex.what()<<endl;
       	  throw;
       }
       return 0;
    }

    Потыкать на ideone
    Ответ написан
    3 комментария
  • Каким алгоритмом можно проверить Большое число на простоту?

    @SeptiM
    Расклад примерно такой. Пусть n -- длина числа, т.е. обычный перебор работает за 2^{c * n}.

    1) Вероятностный тест Рабина-Миллера можно реализовать за O(k n^2 log n), где k -- число попыток. Вероятность ложноположительной ошибки 4^-k. При k=100 это значение настолько безумно мало, что скорее в вашей программе найдется критический баг, процессор сделает ошибку в вычислениях и взломщик выиграет в лотерею и все это одновременно, чем число окажется составным.

    2) Детерминированный AKS (en.wikipedia.org/wiki/AKS_primality_test). Работает за O(n^{6 + eps}). Интересен скорее теоретически.

    3) Эллиптический тест на простоту (en.wikipedia.org/wiki/Elliptic_curve_primality). Эмпирически работает за O(n^5). Интересен тем, что в случае успеха возвращает сертификат простоты.
    Ответ написан
    2 комментария
  • Почему не работает событие (C#)?

    AxisPod
    @AxisPod
    C# это не PHP, тупо начать писать не прочитав ни одной книги не получится.
    Ответ написан
    6 комментариев
  • Какую C++ библиотеку для работы с сокетами посоветуете?

    AxisPod
    @AxisPod
    libev, libevent, libuv, boost::asio
    Ответ написан
    Комментировать