crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

История благодарностей участнику Iron Bug ::: Спасибо сказали: 227 раз(а)
Дата поста: В теме: За сообщение: Спасибо сказали:
23.2.2017, 5:19 плавающий баг вывода utf8 на stdout
попробуй инициализировать консоль так:
SetConsoleOutputCP(CP_UTF8);
_setmode(_fileno(stdout), _O_U8TEXT);


проверить не могу, у меня венды нет. но вроде должно работать.
lrx2,
13.10.2016, 22:12 Печать через cout << для кодировки UTF-8
а что, стандартные префиксы С++11 не канают?
cout << u8"Русский текст" << endl;
pwp2008,
3.7.2016, 21:39 Небольшой экскурс в особенности битовых полей в С (C++)
Нашла тут статейку (она про С и кернел, но то же самое будет и в С++ и вне кернела):
https://lwn.net/Articles/478657/?utm_conten...campaign=buffer

Статья на английском, если кому лень читать, то краткий смысл вот в чём:
Программист поместил спинлок и битовое поле в одну структуру. Вдруг оказалось, что спинлок не работает.
И очевидно, что он работать не может: потому что при работе с битовыми полями компилятор генерит код, который считывает в регистры слово, меняет в нём бит, а потом пишет его в память. А в это время - упс! - спинлок меняется. И его честно перетирают. И он не срабатывает.

Думаю, что такое поведение компилятора вполне нормально. У компилятора нет выбора: он не может атомарно изменить один бит в памяти. Точнее, может, но для этого пришлось бы лочить все процессоры для обращения к битовым полям. А это глупо и неоправданно. Кроме того, в данном конкретном случае spinlock_t даже не является volatile переменной. Так что компилятор честно выполнил свою работу. А программист не подумал о возможных последствиях.

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

lanz,
10.6.2016, 21:06 Запуск процесса из библиотеки (fork или как еще)
а зачем тебе позикс? в С++ начиная с С++11 потоки реализованы в стандартной библиотеке. создаёшь поток и запускаешь там свою функцию. естественно, при выгрузке библиотеки твой поток должен отрабатывать некоторое условие, по которому он сам добровольно умрёт или его прибьёт сама библиотека.
kruger,
10.6.2016, 21:01 Жучки от мелкософта в MSVS 2015
Вот такие пироги:
Цитата
Recently Reddit user "sammiesdog" posted claims that Visual Studio's C++ compiler was automatically adding function calls to Microsoft's telemetry services. The screenshot accompanying their post showed how a simple 5 line CPP file produced an assembly language file that included a function call titled “telemetry_main_invoke_trigger”.

https://www.infoq.com/news/2016/06/visual-c...campaign=buffer
Я венду давно не пользую, в новостях это прочитала. Но, думаю, тут некоторым программистам будет интересно.
Судя по исследованиям, предыдущие студии этим не страдали. Пока только 2015-я.
В статье рекомендуют линковать проекты с объектником notelemetry.obj для удаления этого милого бесплатного дополнения из вашего кода.
maint,
2.5.2016, 9:49 Использование значения одной переменной в качестве имени другой
в плюсах в откомпилированном коде нет никаких имён переменных. а подобные задачи, как правило, делаются через наследование классов или через указатели.
Dima2387,
8.4.2016, 7:19 QTimer Опрос оборудования чаще 1мс.
Цитата(Влад @ 7.4.2016, 14:53) *
Однако, если вместо "нормальной" работы напрямую с USB (к примеру) на ровном месте без видимых причин наворачивается "абстракция для работы с другими устройствами", то у меня возникает еще больше вопросов.....

нет никакой "нормальной" работы с USB. USB - это очень сложная математика для кодирования потока данных, которую реализует чип, на хардварной основе. всё прочее - лишь методы доставки данных из чипа к юзеру, не более. и тут кому что больше нравится, тот то и использует. поставщики чипов, как правило, предоставляют два варианта драйвера и один из них всегда реализован в виде последовательного доступа (та самая эмуляция COM-порта). это позволяет разработчикам писать относительно легко портируемый код для разных устройств. libusb требует от драйвера реализации определённых API, так что его универсальность базируется на поддержке со стороны разработчиков дров и не очень-то переносима на некоторые системы (например, есть другой стандарт API - HID, который популярен в венде).
lanz,
24.3.2016, 19:53 QTimer Опрос оборудования чаще 1мс.
Цитата(lanz @ 21.3.2016, 12:52) *
Какие подводные камни, как лучше реализовать такой опрос в юзерспейсе?

блин, вспомнить бы ещё! :) давно с вендой дел не имела.
опишу принцип реализации.
я делала через boost::conditional_variable и бустовский таймер boost::chrono (надо читать про параметры буста для сборки его с наносекундными таймерами высокого разрешения, я не помню на память, но ключ такой есть). boost::conditional_variable был выбран мной сознательно, я провела тесты на самый быстрый метод синхронизации потоков. эта реализация победила все прочие, мне тогда известные. поток просыпался намного быстрее, чем в других случаях. std::conditional_variable тогда ещё не было, его скорость надо проверять, не факт, что она быстрее буста.
далее, был отдельный поток таймеров (с очень высоким приоритетом, самым высоким относительно других потоков в приложении), который хранил мап для "просыпаний", с ключом-значением таймера с высоким разрешением, отсортированный по возрастанию. мап был всегда непуст, если не нужно было никого будить, там лежал дефолтный таймаут. поток-таймер выбирал ближайшую точку просыпания из мапа и засыпал на количество микросекунд с разницей между нужным моментом и текущим временем. просыпался, дёргал просыпание conditional_variable, выбирал из мапа следующий элемент и т.д. другие потоки могли добавлять свои таймеры в мап. при этом если таймер добавлялся в начало, то текущее ожидание потока-таймера прерывалось и ему передавался более приоритетный таймер.
на самом деле, там для пущей точности было сделано ещё хитрее. при срабатываниях таймеров замерялись времена срабатывания, и сравнивались с эталонными, заданными в таймере. разницы складировались в отдельный FIFO-список, по ним высчислялось среднее скользящее значение по нескольким величинам (с фильтрацией случайных выбросов) и эта величина задавалась как упреждающее здачение для просыпания таймера чуть раньше (просто вычиталась). кроме того, у меня там были реализованы циклические таймеры, одноразовые таймеры и таймеры, которые будили все потоки. ну, это уже детали реализации.
что касается управления процессами, то чтобы планировщик не выбрасывал процесс, надо ему поднимать приоритет. только так. то же самое внутри процесса, с потоками. приоритеты потоков также выставляются. я самые важные потоки ставила в realtime приоритеты. но надо быть внимательным, если realtime-поток наглухо зациклится или застрянет, то вся система может оказаться в плачевном состоянии :)

P.S. когда-то давно я писала про это здесь:
http://www.forum.crossplatform.ru/index.ph...%E0%E9%EC%E5%F0
за актуальность на данный момент не ручаюсь, но раньше это всё работало и было проверено на практике.
lanz,
21.3.2016, 10:37 QTimer Опрос оборудования чаще 1мс.
Цитата(lanz @ 21.3.2016, 11:34) *
Чего бы добавил еще, 150 мкс это очень бысто, например Windows не система реального времени, поэтому запросто может запарковать тред с опросом на десятки миллисекунд.

это не так. хоть я давно не работаю с вендой но в своё время работала много. задержки чаще всего возникают в некоторых библиотеках, из-за неудачной реализации в софте. но в принципе с таймерами там работать можно. я работала с опросом железа с частотой раз 50 мкс, причём запросов там было около 30 на каждый цикл и при этом параллельно по шине шёл DMA трансфер около 400 мегабайт в секунду. данные опроса состояния аппаратуры при этом сливались в локальную базу. и это работало в юзерспейсе даже на относительно слабых машинах. вопрос в реализации таймеров.
максимальные аппаратные задержки (но это не таймеры, а I/O), которые я видела на венде, были задержки обработки сингалов с шины PCI при высокой нагрузке на сеть (у венды сеть приоритетна и она забивает все прочие прерывания). задержки могли доходить до 100 мкс. но это на очень слабых машинах и только когда сеть была загружена под завязку.
lanz,
20.3.2016, 11:00 Упаковщик приложений под Linux
Упаковщик приложений, позволяющий без проблем распространять их под основными дистрибутивами Linux:
Цитата
Using AppImageKit you can package desktop applications as AppImages that run on common Linux-based operating systems, such as RHEL, CentOS, Ubuntu, Fedora, debian and derivatives. http://appimage.org

https://github.com/probonopd/appimagekit

Монтирует свой пожатый ISO образ, который содержит все зависимости и библиотеки, и позволяет запускать приложение с этого смонтированного диска, в своём кастомном окружении.
Содержит последние свежие версии многих библиотек.
AD, lanz, ViGOur,
15.3.2016, 1:23 Qt 5.5.1 MinGW 492_32 и C++14 использование thread
Цитата(AD @ 15.3.2016, 1:36) *
Честно говоря, такое решение, как мне казалось, хорошо для библиотеки, где используют ветвления под платформы, а для языковых конструкций, как мне казалось есть более элегантные решения

так это и есть библиотека. просто она реализует некоторый описанный в стандарте набор функций (иногда чуть больше), поэтому именуется стандартной. языковые конструкции надо отделять от библиотек. языковые конструкции - это, например, циклы (for, while). и их не так уж много. а библиотеки - это библиотеки. кроме конструкций языка и библиотек в плюсах есть ещё шаблоны (типа STL). они разворачиваются в код на этапе компиляции и не существуют в рантайме. это не библиотеки (в системном смысле) и не конструкции языка. это некий прототип для стандартных мелких паттернов программирования.
что касается процессов, то в системе нет других возможностей породить процесс или поток кроме как через системные вызовы. собственно, управление потоками - одна из важнейших функций операционных систем, в которых многопоточность поддерживается. ведь в железе никаких потоков нет. там голое выполнение инструкций. поток - это некая абстракция, существующая только в рамках операционной системы.
впрочем, некоторые виртуальные машины типа эрланга могут порождать свои "потоки". они внутри своей архитектуры создают свои абстракции для создания легковесных сущностей, которые не используют объекты ядра напрямую и не требуют механизмов выделения стека и памяти. но они и не являются потоками в полном смысле слова. скорее, конечные автоматы. мы сами такое делали при управлении сложными системами в промышленной автоматике. эти легковесные "потоки" выполняются внутри обычных системных потоков, просто как переключатели задач.
Цитата(AD @ 15.3.2016, 1:36) *
что-то писать, для использования возможностей языка

ты лучше найди полезную задачу, а уж в упражнениях недостатка не будет :)
у меня вот, кстати, возникла интересная идея (возможно, такое уже где-то есть, но я не видела): сделать нормальный, полноценный парсер pdf-формата с переводом в текстовое представление (хотя бы), с перспективой трансляции во всякие там epub'ы. проблема в том, что вся техническая документация - это pdf. причём pdf не в формате сканов, а именно текстовый, но с таблицами и вставками примеров кода, редко попадаются небольшие графические рисунки. и вот как бы так научиться переводить этот формат автоматом в формат для мелких читалок. есть конверторы из pdf в epub, но такие убогие, что применять их на практике вообще нереально. текст перекашивает до неузнаваемости. не говоря уже о таблицах и примерах кода. править и чистить сотни страниц вручную от мусора и кривостей разметки после половинчатой конвертации - это мазохизм. вот и хочется чисто для своих нужд сделать нормальный автоматический конвертор. я пороюсь в сети, может, кто-то уже делал такие попытки. скорее всего - да. но вот результатов пока не видать.
AD,
14.3.2016, 9:59 Qt 5.5.1 MinGW 492_32 и C++14 использование thread
Цитата(AD @ 12.3.2016, 19:06) *
хочу сделать приложение с использованием Qt 5.5 MinGW (короче, последняя скачанная версия QtCreator - 3.3.2, по-моему) и в этом приложении хочу использовать не Qt потоки, а стандартную библиотеку thread

не надо так делать. Qt - слишком сложная библиотека и в ней многое завязано на её специфическую реализацию потоков. даже если пытаться создавать потоки стандартного типа самостоятельно, они не будут иметь возможности использовать средства синхронизации Qt и многие другие её фичи. а иногда подобное смешивание вообще приводит к падению или зависанию софта. если используешь такие тяжёлые библиотеки - пользуйся их средствами для работы с потоками. если хочешь экспериментировать со стандартами - отказывайся от использования Qt, она сильно тормозит в плане реализации и до внедрения последних веяний стандартизации там далеко, как до Луны.
в крайнем случае, смешивать разные типы потоков можно через реализацию динамических библиотек. чтобы внутри каждой библиотеки были свои потоки и свои средства синхронизации, но общение между ними не было бы связано с синхронизацией. то есть, библиотека получает какое-то задание и сама внутри себя создаёт потоки любым способом и работает с ними, а потом выдаёт на-гора результат. но этот результат не требует синхронизации в внутренними структурами библиотеки.

Цитата(AD @ 14.3.2016, 11:40) *
Сомневаюсь, что thread c++11 реализован как createthread windows, так как это уже часть языка.

ээээ... а как же он реализован? магическими пассами, что ли? стандартная библиотека не делает никакой уличной магии. она использует API системы для реализации стандарта, только и всего.
AD,
14.3.2016, 9:49 Инфиксное применение функции
Цитата(lanz @ 13.3.2016, 18:05) *
надеюсь вы не будете спорить что они транслируются в такой же объектный код, как и С и ничего волшебно-функционального в выходной программе нет?

безусловно, с этим никто спорить не будет. но язык программирования - это не просто набор атомарных инструкций, а некая идеология (а точнее - топология) над набором простейших операций. и принципиально невозможно реализовать и процедурный подход, и функциональный. это исходит из теории. абсолютно не имеющий особенностей язык - это ассемблер. и то я бы сказала, что ассемблер - типично процедурный, ибо сама логика работы CPU такова, что использует процедурный подход и последовательное выполнение. а вот на GPU или FPGA можно использовать функциональный подход, но там и компиляторы, пардон, совершенно другие, и подходы к проектированию программы.
Цитата(Гость_Гость_lanz_*_* @ 13.3.2016, 18:10) *
Думаете в хаскеле под капотом не указатель на функцию и набор параметров, а какие то функциональные единороги? Как реализация меняет концепцию?

хаскель изначально планировался, как функциональный язык и он весь на этом построен. плюсы никогда не были и не являются ФП. и это радикально меняет концепцию и компилятора, и всех паттернов программирования на языках.

Цитата(Гость_Гость_lanz_*_* @ 13.3.2016, 18:10) *
Собственно вы так и не ответили но мой вопрос, что это за "настоящее ФП" и почему оно невозможно на плюсах.

я уже третий раз тебе повторяю: чтобы понять, что такое "настоящее ФП" - возьми лисп, эрланг или хаскель. и "Почувствуйте разницу!"(С), так сказать. самым колоритным представителем можно назвать лисп. вот напиши одну и ту же программу на плюсах и на лиспе и тогда поймешь, в чём разница.
lanz,
11.3.2016, 11:53 Инфиксное применение функции
Цитата(lanz @ 11.3.2016, 11:06) *
Построить программу из маленьких простых частей, которые можно легко совмещать и заменять.

...и офигенно сложно отлаживать. потому что С++ - изначально не функциональный язык, хотя некоторые фанаты-извращенцы пытаются приспособить для эмуляции функциональщины плюсовые темплейты. кстати, можешь поискать эти поделия в сети, полно уже готовых решений. но выглядит это ужасно и при малейшей опечатке компилятор выдаст полкилометра нечитабельной каши с развёрткой этих темплейтов. не найдёшь концов потом. не говоря уже о том, что в ранйтайме там вообще непонятно что будет выполняться и отлаживать это придётся медленно и печально.

и да, если ты хочешь, чтобы кто-то вникал в твою задачу, приводи код, который компилируется (или не компилируется), а не отрывки непонятного назначения и туманные описания. твои слова про "U - конкретный тип" вообще ни о чём не говорят и абсолютно непонятно, чего ты хочешь добиться: то ли общей параметризации по U, то ли частной перегрузки темплейтов для разных типов. и как, по-твоему, должен выглядеть конечный синтаксис этих перегрузок.
lanz,
10.3.2016, 9:25 обновление Qt без обновления QtCreator
Цитата(Алексей1153 @ 9.3.2016, 22:40) *
Как это побеждается ? Жесть, как неудобно

не скажу наверняка, но посмотри эту тему, вдруг поможет:
http://www.forum.crossplatform.ru/index.ph...%E7%FF%E1%F0%FB
это Qt-шники решили в юникоде свой дебаг изображать и у многих людей полезли проблемы.
Алексей1153,
18.2.2016, 10:10 Уязвимость в ядре Linux для повышения привилегий CVE-2016-0728
ну, тренируйся. станешь белым хацкером.
а мне тут идея rump kernel понравилась. это даже не виртуалка, не чрут, а совсем минимальный обособленный контейнер с системой. это код в виде библиотеки, который создаёт окружение для запуска ядра внутри своего рабочего процесса. идея в том, что компилишь ядро и софт с этой хренью и у тебя получается бинарь, который сам внутри себя крутит виртуалочку с линём и на нём твой софт крутится. захотел прибить - вырубил процесс. даже если он падает, его можно легко поднять заново.
ViGOur,
4.2.2016, 9:59 Сборка в особой среде на другой среде
ну, сборка тулчейна - дело непростое и тоже довольно нудное. у меня на i5 тулчейн собирается за час, примерно. но зато потом можно с его помощью быстро собирать бинарники под специфические процессоры.
детально про сборку тулчейна можно почитать на ресурсе про LFS (Linux From Scratch). там всё подробно разжёвано и по шагам расписано. единственное, что там примеры под интелловскую архитектуру, а тебе придётся там везде ARM проставлять в целевой архитектуре.
kruger,
4.2.2016, 9:41 Сборка в особой среде на другой среде
правильно копаешь. обычно под распространённые архитектуры есть готовые собранные тулчейны. можно взять OpenWRT, там есть опции для сборки тулчейна, это проще, чем самому настраивать все конфиги для компилятора.
хотя там libc весьма специфические, под embedded. возможно, придётся прикручивать другие. но как основу для сборки можно взять, чтобы с нуля не городить сборку.
kruger,
11.1.2016, 14:22 Array
Цитата(AD @ 11.1.2016, 13:15) *
Я тоже не пользуюсь auto и прочими прелестями нового стандарта, но тут к ужасу узнал, что на подходе новый стандарт. Думаю, при появлении свободного времени поизучать новый стандарт.

да чота в последние годы новые стандарты плодятся, как грибы после дождя! я успешно освоила С++11 и поизучала С++14, а сейчас уже новые грядут.
я последние года два в основном чистым С занимаюсь, ощущаю, что отстаю от прогресса и надо сесть и почитать про последние новости стандартизации, для общего развития.
кстати, про чистый С. вчера на ЛОРе увидела ссылку на неплохую обзорную статью по С99 и С11. там ничего такого особенного, но сжато и понятно написано. возможно, для кого-то это будет полезно:
https://matt.sh/howto-c
AD, lanz,
28.10.2015, 16:09 Кириллица в Qt 5.5
Это багофича новой Qt. Решение см. здесь: http://www.forum.crossplatform.ru/index.php?showtopic=10548
iCast,
6.10.2015, 8:41 Умные указатели через сигналы.
обычный shared_ptr подойдёт.
вопрос не относится к Qt, переношу его в вопросы по С++.
call_me_Frank,
28.8.2015, 10:36 Что я не так делаю с указателями?
Цитата(Shaitan @ 27.8.2015, 18:48) *
Спасибо за ошибку.

да не за что. это твоя ошибка, ты её сам сделал ;)

код надо писать внимательно. если опыта нет, то тем более не нужно торопиться.

например, ты уверен, что это условие написано правильно?
if((_strList[i] != "=")||(_strList[i] != ".")||(_strList[i] != ",")||(_strList[i] != ":"))
Shaitan,
27.8.2015, 15:32 Что я не так делаю с указателями?
Цитата(Shaitan @ 27.8.2015, 15:03) *
Насчёт
delete &rVar; Это я пытаюсь очистить память от указателей. Согласен нужно это сделать иначе.

это выражение просто вообще смысла не имеет, причём в любом контексте. и оно всегда будет вызывать сбой в памяти.

Цитата(Shaitan @ 27.8.2015, 15:03) *
Вторая странность это я узнаю длину списка и перебираю его до того пока не упрусь в ";"

нет. до конца это списка это никогда не дойдёт, потому что условие leght >= i его выкинет ровно посередине.
простая система уравнений
Цитата
leght = _strList.length() - i;
leght = i;

даёт
Цитата
i = _strList.length()/2;

так что с логикой тут серьёзные проблемы.
Shaitan,
27.8.2015, 11:01 Что я не так делаю с указателями?
ну, при беглом просмотре кода, сразу же в первом блоке:
   delete &rVar;

зачем тут адрес? подумай, что ты удаляешь.

вообще, логика кода какая-то странная. ты не проверяешь, что _strList содержит минимум два элемента, хотя обращаешься к ним.

потом, вот это условие тоже какое-то малопонятное:
leght = _strList.length() - i;
        while(leght >= i ...


не исключено, что там ещё есть ошибки логические.
в общем, внимательнее надо код писать.
Shaitan,
7.7.2015, 10:10 QSerialPort
чем длиннее провод - тем ниже должна быть скорость передачи.
и на проводе должны быть терминаторы. если их нет, то скорее всего в сигнале будут отражённые паразитные данные.
да, если в непосредственной близости присутствуют двигатели, трансформаторы или любые девайсы с мощными токами в обмотках, то возможны помехи на линии и данные также могут искажаться.
в целом от подобных вещей спасает только вычисление CRC на каждый пакет и нумерация пакетов плюс система перезапроса пакета, в случае его потери или испорченных данных.
leonneon_89,

8 страниц V   1 2 3 > » 
RSS Текстовая версия Сейчас: 27.3.2017, 13:33