Задать вопрос
  • Где лучше включать заголовочные файлы?

    Nipheris
    @Nipheris Куратор тега C++
    К teugen добавлю, что если вы используете не значение класса/структуры, а указатель на него, то в хедер вместо инклуда другого хедера можно вставить объявление класса:

    #pragma once
    class ExampleClass;
    class MyClass {
    public:
     ExampleClass* ExampleFunction();
    };

    а инклуд определения класса делать там, где без него уже никак - например там, где вызываются методы класса или создаются его экземпляры.
    Ответ написан
    2 комментария
  • ADO.NET море проблем?

    Nipheris
    @Nipheris Куратор тега C#
    1) использовать EF7 с edmx невозможно, т.к. последний считается устаревшим форматом/подходом к хранению структуры БД (см. blogs.msdn.com/b/adonet/archive/2014/10/21/ef7-wha... Если все-таки очень хочется edmx - попробуйте установить EF6;
    2)
    что надо установить SQl Server

    установить надо было скорее всего Entity Framework Tools, что, в общем-то, логично. Для установки EFTools нужно при установке выбрать SQL Server Data Tools (см. https://github.com/aspnet/Tooling/issues/53 ), что тоже логично. Вы точно устанавливали их при установки студии? Обращаю ваше внимание, что это Tools, а не сервер.
    Ответ написан
    2 комментария
  • Чем отличаются языки программирования PHP, PYTHON, RUBY?

    1. Аналогию с самими языками проводить не стоит. Аналогию стоит провести для платформ.
    Платформы вроде .net и java, которые разрабатывались для энтерпрайза, разумеется лучше для него подходят. И не важно даже, десктопное у вас приложение или веб-сервис. Важно, что в платформе есть поддержка нужных стандартов и технологий с гарантией качества от производителя.
    С другой стороны, многие компоненты таких платформ это closed-source. Поэтому, если вы не банк, а стартап, то для веб-сервиса выбирайте
    Ruby или Python.
    Социальную сеть можно сделать много на чем, но я бы делал на рельсах или джанге. А вот функционал сбербанк-онлайн я бы делал на ASP.NET MVC (т.е. на C#) или на джаве (на спринге например). Однако, тот же близзовский battle.net написан на спринге (сервер когда-то случайно отдал мне stack-trace после ошибки).

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

    2. Нет, не будет. Не должно быть, если точнее. Для пользователя язык общения с сервисом - HTTP. Если в современном веб-фреймворке нельзя нормально абстрагироваться от используемой технологии, это плохой фреймворк.

    3. На PHP много чего нельзя сделать. Вернее, КАК БЫ можно все, но нормально можно только веб. Именно поэтому для меня он не язык, а какой-то шаблонизатор - слишком у него дурная история и связь с веб (что нехорошо для языка общего назначения). Конечно, современные веб-фреймворки его очень хорошо причесывают, что даже можно работать с ним, но мы же о языках говорим..

    4. Для веб-проектов между Ruby, Python и PHP человек бы выбирал исходя из своих умений. У каждого языка своя экосистема (библиотеки, пакетные менеджеры, серверы приложений/плагины для веб-сервера) и довольно непросто знать все сразу. Именно поэтому все расходятся по своим лагерям и просто работают. Первичный выбор языка часто определяет его популярность. Лет 5 назад Руби всех рвал за счет Рельсов, сегодня Питон и PHP подтянулись в плане экосистемы, поэтому ситуация уже другая.
    Если человек таки сумел познакомиться с разными языками, он выберет тот, в котором ему проще мыслить. Модель ООП, статическая/динамическая типизация - все это определяет ощущения КОНКРЕТНОГО человека от КОНКРЕТНОГО языка.

    5. PHP учится быстрее всех, но если вы не знаете других нормальных языков, лучше его не учите - испортитесь как программист. Python и Ruby учатся примерно одинаково. Изучение C++ - совсем другая история, я бы не ставил его в один ряд с Питоном - этот язык несколько другого уровня и требует других (более глубоких) знаний о вычислительной технике (т.е. он 100% учится дольше, чем Python).
    Ответ написан
    22 комментария
  • Аналог QStringBuilder для ванильного с++. Где взять?

    Nipheris
    @Nipheris Куратор тега C++
    std::stringstream

    По поводу "лишнего выделения памяти" - это надо брать реализации и сравнивать (т.е. не могу сказать насколько QStringBuild лучше/хуже std::stringstream), но, как говорится, look&feel почти такой же. Вместо процентиков поставьте <<, а потом вызовите .str()
    Ответ написан
    6 комментариев
  • Какие есть визуальные инструменты для создания архитектуры БД?

    Т.к. не написано про бесплатность, то классика жанра - ERwin.
    Ответ написан
    Комментировать
  • Как правильно перевести из 16СС в 2СС?

    Nipheris
    @Nipheris Куратор тега C++
    В дополнение к MiiNiPaa скажу, что все ваши числа и так хранятся в двоичной системе счисления, сегодняшняя популярная выч. техника с другими системами не работает. Другое дело - в какой СС вы хотите эти числа выводить на экран/в файл, в общем - преобразовывать в человеко-читаемую строку. Поэтому в целом вопрос сводится к чтению справки по аргументам printf или по директивам потоков C++.
    Ответ написан
    Комментировать
  • Дерево выражений не может содержать динамическую операцию?

    Nipheris
    @Nipheris Куратор тега C#
    Компилятор жалуется на то, что где-то в ваших лямбдах он столкнулся с dynamic, и разумеется он не может его вкомпилить в expression tree. Скорее всего, p был dynamic, а t - нет. Укажите в вопросе конкретные типы контейнеров, по которым вы делали Find и Where, может ситуация понятнее станет (и заодно, какие интерфейсы они реализуют - IEnumerable<T> или IQueryable<T>).
    Ответ написан
  • C++11, C++14. Использование auto - признак дурного тона?

    Nipheris
    @Nipheris Куратор тега C++
    Такие дельные советы тут...

    А правило проще некуда: если вы без указания типа и так УЖЕ ИМЕЕТЕ достаточно информации, чтобы уверенно работать со значением - тогда можно использовать auto. Если чувствуете, что не имеете, или сомневаетесь, что имеете - лучше тип указать. Пример, где использование auto отлично подходит - итераторы:
    std::list<int> items;
    auto i = items.cbegin();

    Во второй строке четко написано - items.cbegin - константный итератор по items, бегущий с начала списка. Мне этого более чем достаточно. Указание типа std::list<int>::const_iterator мне никакой новой информации не принесет. Тем более, т.к. итераторы от разных контейнеров несовместимы, то мне нужно еще и сразу знать, по какому конкретно списку у меня итератор - я опять-таки посмотрю на items.cbegin, а не на тип.

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

    Nipheris
    @Nipheris Куратор тега C#
    Пользоваться NuGet для работы с зависимостями (https://www.nuget.org/packages/CompareNETObjects/ как раз то что вам нужно), а если уже пользуетесь - очевидно, нужно пофиксить список зависимостей в packages.config, или же сделать nuget restore перед вызовом MSBuild.
    Раз сборка не находится, то либо: а) путь к ней неверный; б) путь верный, но она не выкачивается nuget-ом при сборке;
    Еще может быть в) косяк с версиями/токенами, но это маловероятно.

    Ну и само собой, если у вас код компилится и работает без проблем, удалите вообще этот референс из проекта.
    Ответ написан
    Комментировать
  • Возможно ли написать клиент сервер для смартфона?

    И чем может быть ограничена работа такого приложения?

    Работа такого приложения [без связующего сервера] может быть ограничена и будет ограничена фактом использования серых IP-адресов в сети мобильного провайдера, а также более агрессивными дефолтовыми настройками маршрутизации, которые врядли допустят TCP-подключение одного клиентского устройства к другому.

    P.S. Обращаю внимание на условия "произвольный смартфон", "3G", "без связующего сервера". Для меня "произвольный" - это когда один смартфон сидит в Волгограде, а другой - в Мурманске.
    Ответ написан
    2 комментария
  • Как правльно произвести вызов события из потока?

    Nipheris
    @Nipheris Куратор тега C#
    Когда Б обрабатывает событие, возникает исключение как будто метод класса Б работает в потоке объекта А, это нормально?

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

    Пофиксил через SynchronizationContext, но может быть есть получше варианты?

    Нормальный вариант, если вы используете подсистему, у которой есть реализация SynchronizationContext, например WinForms или WPF. Если же это не ваш вариант, то нужно предоставить свою реализацию, или же отказаться от его использования и явно использовать очереди сообщений для общения между потоками.
    Ответ написан
    Комментировать
  • Как правильно сформировать экономный пакет данных об игроках?

    Nipheris
    @Nipheris Куратор тега C++
    Ваша проблема решается даже не просто, а элементарно.
    Для этого нужно запомнить простейший способ передачи групп элементов переменной (т.е. заранее неизвестной) длины: сначала передавать длину, а потом уже сами элементы в нужном количестве.
    Этот подход используется повсеместно. Например, когда на диск сохраняют строки переменного размера, и в строке неудобно/невозможно применить символ-терминатор, то сначала записывают длину строки (неотрицательное число нужной разрядности - байт, 2-х байтовое целое, 4-х байтовое целое), а потом уже содержимое строки. Кстати, такие строки называются паскалевскими (в альтернативу нуль-терминированным Cи-строкам).
    Разумеется, приемник пакета должнен быть достаточно умным, чтобы сначала принять длину, выделить себе некую стркутуру нужного размера (вектор подходит отлично, т.к. можно попросить его сразу зарезервировать нужное количетсво элементов), а затем записать ожидамое количество элементов.

    Вариант кода передачи:
    std::vector<PacketMultiPlayer> serverMuPackets;
    ......
    const unsigned int packetsCount = serverMuPackets.size();
    send(sock,(char*)(&packetsCount), sizeof(packetsCount), 0);
    send(sock,(char*)serverMuPackets.data(), sizeof(PacketMultiPlayer) * packetsCount, 0); // Имеем право так делать, т.к. вектор гарантирует последовательное хранение элементов. Со списком подобное делать нельзя
    Ответ написан
    Комментировать
  • Как установить в Visual Studia Modeling Projects?

    Секретная техника:
    1) гуглим "visual studio community vs enterprise";
    2) открываем один из первых результатов - Compare Visual Studio 2015 Offerings;
    3) разворачиваем секцию "Architecture and Modeling", видим, что в Community доступен только пункт "Visualize solutions with Dependency Graphs and Code Maps" со сноской "Can open diagrams generated in other Visual Studio editions in read-only mode";
    4) делаем соответствующие выводы.
    Ответ написан
    Комментировать
  • Можно ли перейти от реализации для win(opengl,height map)?

    Nipheris
    @Nipheris Куратор тега C++
    0) закапываем GLUT, берем GLFW (www.glfw.org ); если это неприемлемо, отпишитесь в комментариях, сделаем другую инструкцию;
    1) берем пример, делаем окно по примеру: www.glfw.org/documentation.html
    2) когда убедились, что окно появляется и все работает, начинаем перетягивать код из урока;
    3) вызов кода отрисовки (который DrawGLScene) вставляем вместо /* Render here */;
    4) объявления виндовых дескрипторов убираем (HDC, HWND и прочие); windows.h тоже вроде не нужен;
    5) для обработки событий клавиатуры читаем вот это: www.glfw.org/docs/latest/input.html#input_keyboard , для мыши вот это: www.glfw.org/docs/latest/input.html#input_mouse . По сути все элементарно: устанавливаются колбэки, в которых уже находится код обработки;
    6) для того, чтобы адекватно выйти из главного цикла приложения (это тот, который while (!glfwWindowShouldClose(window))) в нужном месте (например, по нажатию ESC) вызываем glfwSetWindowShouldClose.

    Итого WindowProc вам уже не нужна, из WinMain возможно понадобится код инициализации и код обработки клавиатуры нужно будет вынести в колбэк.
    Вопросы в комментарии, все сразу не расскажешь.

    P.S. Вообще поищите современные туториалы, это OpenGL 2.0, этот API уже никому не нужен, в 3-м OpenGL всю архитектуру перекроили (зачем? Например затем, что вызывать glVertex для каждой вершины - это слишком затратно). Старые уроки вам будут полезны только для общего развития в CG.
    Ответ написан
    2 комментария
  • Qt progressBar, управление из своего класса?

    Nipheris
    @Nipheris Куратор тега C++
    Вариант 1:
    1) делаете в классе формы публичный метод вроде setTransferProgress(int), чтобы его можно было вызывать извне;
    2) дергаете метод формы, устанавливая нужное значение прогресса;
    3) реализуете метод setTransferProgress, чтобы он изменял состояние контролов так, как вам нужно;

    Вариант 2:
    1) делаете ваш "обычный" C++ класс QObject-классом, делаете у него слот transferProgressChanged(int);
    2) передаете объект вашего "передатчика данных" форме, и connect-ите слот transferProgressChanged к приватному методу, например updateProgress;
    3) в updateProgress обновляем контролы формы;
    Ответ написан
    2 комментария
  • Азы OpenCL( C++, Qt 5). Как собрать простейшую программу?

    Nipheris
    @Nipheris Куратор тега C++
    limon_spb пожалуй не все так просто с OpenCL.DLL и видимо ее все-таки не нужно распространять со своим приложением. Однако, как и было сказано ранее, ее интерфейс универсален и ваше приложение не придется перекомпилить под каждое устройство. Вопрос только в том, кто ее должен поставлять.

    Вот на форуме Кроноса: https://forums.khronos.org/showthread.php/6299-Ope... господин pcchen утверждает, что OpenCL.dll и ICD-либа должны устанавливаться при установке драйверов на видяху. Видимо все-таки не должны вы класть OpenCL.dll со своей программой.

    Тогда мы возвращаемся к вопросу, почему программа не запустилась у вас на машине. Случайно наткнулся на ваш вопрос 1-в-1 на SO: stackoverflow.com/questions/22098210/deploying-ope... . Я думаю у вас была та же проблема - DLL в системных папках реализует API версии 1.1, а вы разрабатываете под API версии 1.2 (что определяется теми хедерами, которые вы подключили в проект). Поэтому правильно все-таки сначала решить проблему конкретно на вашей машине. Возможно, стоит обновить драйвера, и они обновят системные библиотеки.

    В той теме на форуме так и не пришли к единому мнению относительно того, откуда должна браться OpenCL.dll. Я склоняюсь к тому, что ставить ее должны драйвера. Кстати, Dithermaster в ответах на SO говорит то же самое. Погуглите еще "deploying opencl application".
    Вот еще одна тема с обсуждением (также не советуют деплоить OpenCL.dll самому): https://forums.khronos.org/showthread.php/11392-Ye...
    Ответ написан
    2 комментария
  • Почему при попытке подписать сборку выходит ошибка?

    Nipheris
    @Nipheris Куратор тега C#
    При создании PKCS#12-контейнера (он же PFX) укажите настройку, что ключ разрешено использовать только для создания электронной подписи. Например. для openssl pkcs12 это параметр -keysig. Вы какой утилитой создавали ключ? sn?
    Ответ написан
    1 комментарий
  • Как организовать работу структуры b-дерева, файла данных и файла индексов?

    Nipheris
    @Nipheris Куратор тега C++
    Там есть поиск, вставка и удаление.
    Теперь нужно организовать работу с файлами. Файлом индексов и файлом данных.

    1) заменяете указатели на потомков в узлах дерева на абстрактные указатели или номера. Это нужно потому, что узлы дерева теперь могут быть как в основной памяти, так и на диске, поэтому при обращении к любому из узлов нужно сначала смотреть, загружен он или нет, и при необходимость загружать с диска (т.е. огранизовать простейший кэш);
    2) в листовых узлах вы будете хранить такие же абстрактные указатели, только не на узлы дерева (которые в индексном файле), а на реальные записи (которые в файле данных). С записями можно поступать точно также - проверять, загружены они в кэш или нет, при необходимость загружать и отдавать пользователю.
    3) операции изменения теперь должны научиться помечать узлы как "грязные", т.е. требующие сохранения на диск. В процессе модификации B-дерева вы помечаете как грязные все изменившиеся узлы, и потом сохраняете их диск (по окончании операции или через равные промежутки времени), после сохранения каждого узла сбрасываете флаг.

    Собственно основные изменения: организация кэша для записей данных и индекса и переделка дерева на работу с узлами через кэш, а не напрямую по указателю на BTreeNode.
    Ответ написан
    Комментировать
  • Какая разница между interface в С# и чисто виртуальными функциями в класах С++?

    Nipheris
    @Nipheris Куратор тега C++
    Одно и то же, чисто абстрактные классы в C++ это способ получить функциональность, аналогичную понятию "интерфейс" в тех языках, где оно есть (C#, Java, etc.).
    Благодаря множественному наследованию в C++ среди базовых классов могут быть как классы с реальным поведением (т.е. с реализациями каких-либо методов), так и классы-"интерфейсы", т.е. классы только с pure-virtual функциями-членами.
    Ответ написан
    Комментировать
  • Как передать char указатель функции dll, чтобы можно было в дальнейшем разобрать на массив?

    Nipheris
    @Nipheris Куратор тега C++
    [DllImport("вашалиба.dll", CharSet = Ansi, CallingConvention = CallingConvention.Cdecl)]
    public void LaunchJavaApplet([In] string[] JVMOptions);
    Ответ написан