Ответы пользователя по тегу C
  • SQLite FTS5 usage, what does xToken() do in xTokenize()?

    Nipheris
    @Nipheris Куратор тега C++
    В https://sqlite.org/fts5.html#section_7_1 ясно написано:


    xTokenize:
    This function is expected to tokenize the nText byte string indicated by argument pText. pText may or may not be nul-terminated. The first argument passed to this function is a pointer to an Fts5Tokenizer object returned by an earlier call to xCreate().
    ..........
    For each token in the input string, the supplied callback xToken() must be invoked.

    ВЫ пишете тройку функций xCreate, xDelete, xTokenize. При вызове вашей xTokenize ей будет передан колбэк, который, как правильно подметил abcd0x00 , нужно будет дергать для передачи движку SQLite готовой (т.е. подготовленной ВАМИ в процессе работы xTokenize) лексемы. Они называют это токен, но вообще это лексема, т.к. вы отдаете кусок из входной строки.
    Итого, все максимально просто - вам дается строка, вы по своим алгоритмам и критериям решаете, где в ней какие лексемы. Для каждой найденной лексемы дергаете данный вам xToken, чтобы сообщить эту радостную новость SQLite.
    Обязаны ли мы его вызывать?

    нет, но если не будете вызывать, ни одной лексемы из входной строки SQLite не получит.
    Если его должны реализовать мы

    его реализует SQLite.
    Ответ написан
    1 комментарий
  • Есть ли в области системного программирования такие задачи, для которых целесообразно только использование ассемблера?

    абсолютно все

    абсолютно все не напишите, тот же SYSENTER компилятор за вас не сделает. По большому счету большая часть кода - на Си (структуры данных, алгоритмы), а сугубо низкоуровневые вещи - например, переключение стека - делается ассемблерными вставками. Ну или вывод в порт - не представляю как это сделать в рамках Си.
    Ответ написан
  • [Doxygen] Как заставить Doxygen НЕ склеивать описания функции, заимплеменченой дважды?

    Не могу себе представить, как заставить doxygen различать функции с одной и той же сигнатурой. Самый реальный способ на мой взгляд - собирать различные варианты документации с разными макросами (PREDEFINED) и затем читать нужный вам. Препроцессор doxygen обрабатывает файлы по такому же принципу, что и компилятор (только не все конструкции поддерживает), поэтому как сама программа компилится отдельно с разными конфигурациями, так должна и документация. Иначе вам нужно все-таки различать эти функции явно.
    Ответ написан
    4 комментария
  • Как исправить ошибку LNK2019 при использовании статического метода?

    Nipheris
    @Nipheris Куратор тега C++
    Теоретически заголовочный файл в проект подключать не обязательно, это для вашего удобства (чтобы вы не теряли файлы, которые у вас есть в проекте). А вот cpp нужно полюбому, т.к. иначе у компилятора не попросят его собрать, а линковщику - не расскажут, что есть объектный файл (который получится после компиляции), который содержит реализации неких функций. Результат - линковщик ищет-ищет, и не находит релизацию метода.
    Если бы у вас был lib а не cpp, то ситуация та же самая, только без этапа компиляции. Грубо можете считать lib-файл группой собранных воедино объектных файлов. В нем уже скомпилированный код находится, поэтому его нужно передавать сразу линковщику. Для этого в ключах линкощика указываются так называемые Library Directories - директории, где искать библиотеки, а также dependencies - какие конкретно lib-файлы надо просматривать при линковке. В студии есть как глобальный список таких директорий, так и локальные настройки для каждого проекта.
    Ответ написан
    1 комментарий
  • Какие есть проекты на Си, которые можно использовать для изучения языка?

    Если захочется чего "покрупнее", чем предложил terrier, посмотрите SQLite - тоже проект написанный далеко не дураками).
    Ответ написан
    Комментировать
  • Область применения C, C++, C#?

    Nipheris
    @Nipheris Куратор тега C++
    > Хотел задать вопрос к опытным программистам.

    Ну раз опытным, то думаю разумно поделиться своим опытом. Итак, в чем участвовал за последние 5-6 лет, где были плюсы или шарпы. Три места работы, три команды:
    - десктопная софтинка наподобие 2ГИС - база данных услуг и предприятий с привязкой на карту. C#, карту отрисовывали сами с помощью Direct3D;
    - TCP-сервер GPS-трекеров (такие фиговины, отправляют по GRPS/SMS свои текущие GPS/ГЛОНАСС координаты + всякие плюшки для транспорта - уровень топлива, скорость движения и т.д. - зависит от модели). C++ и обыкновенные сокеты. Сервер небольшой, принимал именно данные от трекеров и писал в базу. Отображалось все на обыкновенном сайте с PHP в бэкенде.
    - веб-сервис, принимающий платежи по WebMoney Merchant и поддерживающий балансы на счетах клиентов. Открывал урл для серверов вебмани, плюс давал простейшие отчеты (проведена транзакция или нет, текущий баланс, транзакции на списание). C# (WCF), данные писались в PostgreSQL.
    - десктопное приложение для проходной - по отпечаткам пальцев входящих/уходящих сотрудников регистрировалось их время пребывания на предприятии. Ну и разумеется - отчеты, агрегации (время отработанное за неделю, опоздания, переработки и т.д.). C# + некоторые части на С++, соединяющие драйвер сканера отпечатков и библиотеку их распознавания по образцам.
    - здоровенное декстопное приложение на C++ + Qt, трейдинговый терминал (более 10к файлов исходников, команда из 30+ человек);
    - довольно объемный ГИС-проект на C#, клиент десктопный (WPF+SharpMap), серверная часть - ASP.NET WebAPI (JSON API).
    - планируется новый ГИС-проект с клиентом уже на C++ и Qt, т.к. существует нереально крутые рендереры на OpenGL от MapBox (тык), а большинству участников текущего проекта плевать - C++ или C#. Qt сейчас развивается очень серьезно, поэтому на сегодняшний день он выровнялся с C#+WPF, а т.к. рендерер на плюсах - то и клиента будем писать на плюсах. На сервере по-прежнему ASP.NET, вероятно новой версии (пока начнем писать, должна успеть выйти в релиз); тех, кто считает, что с ним "сложно в вебе" - аргументы в студию;
    - небольшой сайд-проект - рендер сложного 3D объекта для внедрения в рекламный ролик новой фантастической книги. С++ и OpenGL, написано быстро, дешево и сердито, отрисовано покадрово в PNG-шки, смонтировано в After Effects, все довольны.

    Вывод: поверьте, если инструмент подчиняется вам, то вам открыто много способов решения различных задач. Конечно, для Web-бэкенда C++ будет очень странным выбором, но лично у меня хватает задач и без бесконечных мелких сайтиков.

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

    Nipheris
    @Nipheris Куратор тега C++
    Я думаю там выводится мусор, а не адреса - с чего вы взяли, что там адреса? Они последовательно идут? Я не думаю.

    *(a-i);//перевести указатель на первый эллемент


    Не, тут не произойдет то что вы пишете. Здесь нет операции присвоения или аналогичной ей. Это просто выражение, результат вычисления которого уйдет в никуда. Совершенно непонятно, зачем вы еще и разыменование поставили. Вы вообще понимаете, что написали там?
    Вам нужно что-то вроде этого: a = npa; или a -= i;
    Ответ написан
    2 комментария
  • Как передать по TCP несколько переменных?

    Nipheris
    @Nipheris Куратор тега C++
    Вам нужно делать write для каждой переменной или буфера, который вы хотите передать. Например, что мешает сделать так:
    int len = strlen(str);
    double val = 6.0;
    write(sockfd, &len, sizeof(len)); // длина
    write(sockfd, str, len); // строка
    write(sockfd, &val, sizeof(val)); // еще какой-то там дабл

    Также нужно прочитать на другом конце. Что из этого не получается?
    Ответ написан
  • Какой язык программирования изучить новичку для написания GUI приложений?

    Nipheris
    @Nipheris Куратор тега C++
    Зависит от запаса времени и сил. Если знакомый имеет возможность учиться (уж в 16-то лет), то я бы советовал плюсы. Да, это достаточно хардкорно, но все-таки этот язык как средство разработки просто так никуда не денется, а C# после плюсов он выучит без проблем (когда он хорошо разберется в C++, ему самому захочется иметь для ряда задач такой язык, как C# или Java). Главное в том, что если он сможет дисциплинировать себя в рамках C++, и сможет писать работоспособные вещи, то будет знать, как вообще работает современное ПО, и для него любой другой язык будет просто инструментом, а не парадигмой.
    Важно, чтобы у человека УЖЕ был опыт хотя в одном языке. Если он учил Паскаль - то пусть хорошенько все вспомнит, может даже первые пару недель еще с ним позанимается. Пусть вспомнит, какие есть основные алгоритмические конструкции, структуры данных подучит, вспомнит что такое указатели. И в это же время пусть начинает переходить на плюсы. Еще стоит поискать хорошую современную книгу для новичка - C++ язык очень разносторонний, разные люди на нем пишут очень по-разному, поэтому нужен некий "направитель". Потом, когда человек освоится, сам выберет стиль и инструментарий.
    Если же знакомый слукавил, и еще совсем мало знает, то лучше начать с чего-то другого. Тут уже зависит от текущих интересов: если комп интересует как "железка", то лучше взять Си - будет "продолжение" Паскаля, если очень-очень охота быстро набросать формочку - то пусть берет C#.
    Динамические языки вроде Питона новичку не советую, плохо дисциплинируют.
    В плане инструментов Qt сейчас настолько крут, что даже под винду непросто выбрать: то ли его, то ли продвинутый, но сложный и слаборазвивающийся WPF, то ли противоречивый Windows Runtime.
    Кстати, насчет того, что сложнее - C++&Qt или C#&WPF еще можно поспорить. В первом случае сложен язык, но довольно проста библиотека, во втором - язык проще, но с WPF надо реально разбираться, чтобы им полноценно пользоваться.
    Ответ написан
    1 комментарий
  • Указатель на функцию из библиотеки на Си в С++ класс?

    Nipheris
    @Nipheris Куратор тега C++
    Очень просто: чтобы поменьше влиять на остальной код на C++, который у вас уже написан, сделайте следующее:
    1) заведите обычную функцию (НЕ член класса) send_sms, указатель на которую отдадите в либу;
    2) сделайте в этой функции все, что необходимо по задаче (отправить смс? :));
    3) реализуйте для MainWindow синглтон (проще) или сервис (правильнее), чтобы иметь возможность получить доступ из внешней функции send_sms к экземпляру окна;
    4) у MainWindow дергайте метод test или любой другой, чтобы передать в него нужные данные. Если сделаете синглтон, будет что-то вроде этого: MainWindow::instance()->test(...);
    Ответ написан
    Комментировать
  • Как сделать звук в программе на си/си++?

    Nipheris
    @Nipheris Куратор тега C++
    DirectSound крайне не советую, очень старое API, на висте и выше уже в режиме совместимости работает, вот OpenAL можно, если на винде - то XAudio2 или даже ASIO, в зависимости от целей (игры vs софт для обработки звука) и "глубины погружения".
    Ответ написан
    Комментировать
  • Какие библиотеки использовать для шифрования?

    Nipheris
    @Nipheris Куратор тега C++
    Ответ написан
    Комментировать
  • Какой фреймворк на c/c++ выбрать для реализации REST API?

    Nipheris
    @Nipheris Куратор тега C++
    EDIT: на сегодняшний день рекомендую Boost.Beast - одно из наиболее зрелых решений в плюсах.

    Старый ответ:
    Попробуйте C++ Network Library (на гитхабе) - проект достаточно молодой, но имеет очень интересный функционал и массу удобных абстракций, есть реализации URI, HTTP-клиента и сервера. Фактически это обертка над boost.asio, позволяющая не писать веб-сервер и клиент с нуля. Требует С++11.

    Кроме того, если есть требования по надежности/нагрузке, то лучше иметь дело с проверенным веб-сервером, и тогда стоит посмотреть в сторону FastCGI - тогда в инет будет смотреть какой-нибудь nginx или апач, а ваше приложение будет получать по FastCGI запросы от веб-сервера. Библиотеки для С++ имеются.
    Ответ написан
    Комментировать