У Google TensorFlow есть одна замечательная особенность, оно умеет работать не только в программах на Python, а также и в программах на C++. Однако, как оказалось, в случае С++ нужно немного повозиться, чтобы правильно приготовить это блюдо. Конечно, основная часть разработчиков и исследователей, которые используют TensorFlow работают в Python. Однако, иногда бывает необходимо отказаться от этой схемы. Например вы натренировали вашу модель и хотите ее использовать в мобильном приложении или роботе. А может вы хотите интегрировать TensorFlow в существующий проект на С++. Если вам интересно как это сделать, добро пожаловать под кат.
Читать полностью »
Рубрика «c++» - 146
Как подружить Tensorflow и C++
2016-08-21 в 23:25, admin, рубрики: c++, TensorFlow, Алгоритмы, машинное обучение, Разработка робототехникиQt: Вывод отчета стандартными средствами (или живем без генераторов отчета)
2016-08-19 в 13:49, admin, рубрики: c++, qt, отчетыНудное вступление с Qt 4.8
Недавно коллега по работе спросил об опыте использования построения отчетов под Qt (начинаем потихоньку внедрять SCADA, написанную на Qt) — в силу поставленной задачи очень нужная вещь. Генераторами никто не пользовался (на данной платформе), но отчеты мы я каким-то образом делали без использования FastReport и таскания лишних приложений.
Покопавшись в проектах, нашел приложение с отчетами, виджетами для предпросмотра (QLabel, QTableView....). Вид отчета «preview»:
SObjectizer: от простого к сложному. Часть III
2016-08-19 в 4:58, admin, рубрики: actor model, c++, c++11, C++14, concurrency, multithreading, open source, ПрограммированиеВ очередной статье про SObjectizer продолжим следить за эволюцией простого поначалу агента, который все более и более усложняется по мере своего развития. Рассмотрим, как быть с отложенными сообщениями, в которых мы больше не заинтересованы. И воспользуемся некоторой функциональностью иерархических конечных автоматов.
Не так-то просто обнулять массивы в VC++ 2015
2016-08-17 в 21:32, admin, рубрики: c++, Блог компании ABBYY, Компиляторы, ПрограммированиеВ чем разница между двумя этими определениями инициализированных локальных переменных С/С++?
char buffer[32] = { 0 };
char buffer[32] = {};
Одно отличие состоит в том, что первое допустимо в языках С и С++, а второе — только в С++.
Что ж, давайте тогда сосредоточимся на С++. Что означают эти два определения?
Первое гласит: компилятор должен установить значение первого элемента массива в ноль и затем (грубо говоря) инициализировать нулями оставшиеся элементы массива. Второе означает, что компилятор должен инициализировать нулями весь массив.
Эти определения несколько различаются, но по факту результат один — весь массив должен быть инициализирован нулями. Поэтому согласно правилу «as-if» в С++ они одинаковы. То есть любой достаточно современный оптимизатор должен генерировать идентичный код для каждого из этих фрагментов. Верно?Читать полностью »
Преобразование обычного класса в странно повторяющийся шаблон
2016-08-16 в 16:42, admin, рубрики: c plus plus, c++, виртуальные функции, Программирование, шаблоны С++Некоторое время назад ко мне подошли программисты, недавно начавшие изучать с++ и привыкшие к процедурному программированию, с жалобой на то, что механизм вызова виртуальных методов «тормозит». Я был очень удивлён.
Давайте вспомним, как работают виртуальные методы. Если класс содержит один или более виртуальный метод, компилятор для такого класса создает таблицу виртуальных методов, а в сам класс добавляет виртуальный табличный указатель. Компилятор также генерирует код в конструкторе класса для инициализации виртуального табличного указателя. Выбор вызываемого виртуального метода производится на этапе выполнения программы при помощи выбора адреса метода из созданной таблицы.
Итого имеем следующие дополнительные затраты:
1) Дополнительный указатель в классе (указатель на таблицу виртуальных методов);
2) Дополнительный код в конструкторе класса (для инициализации виртуального табличного указателя);
3) Дополнительный код при каждом вызове виртуального метода (разыменование указателя на таблицу виртуальных методов и поиск по таблице нужного адреса виртуального метода).
Читать полностью »
В ожидании Linux версии: проверка кода графического редактора Inkscape
2016-08-15 в 14:40, admin, рубрики: c++, inkscape, open source, pvs-studio, static code analysis, Блог компании PVS-Studio, обработка изображений, Программирование, статический анализ кодаВ этой статье речь пойдет о проверке еще одного известного open source проекта — векторного графического редактора Inkscape 0.92. Проект развивается уже более 12 лет и предоставляет множество возможностей по работе с различными форматами векторных иллюстраций. За это время его кодовая база выросла до 600 тысяч строк, и пришло время проверить его с помощью статического анализатора PVS-Studio.
Читать полностью »
Минуя бесконечность: t-тест своими руками
2016-08-15 в 12:33, admin, рубрики: C, c/c++, c++, java, t-тест, алгоритм, Алгоритмы, гамма функция, гипергеометрическая функция, математика, статистика, тест Стьюдента, метки: t-тест, гамма функция, гипергеометрическая функция, тест СтьюдентаВ этом посте речь пойдёт о реализации процедуры вычисления значения функции распределения Стьюдента без использования каких-либо специальных математических библиотек. Только Java (либо C/C++, код вполне универсален).
Каламбуры типизации функций в C
2016-08-14 в 18:20, admin, рубрики: assembly, C, c++, x86-64, ассемблер, каламбуры типизации, ненормальное программирование, слабая типизация, тонкости программированияУ C репутация негибкого языка. Но вы знаете, что вы можете изменить порядок аргументов функции в C, если он вам не нравится?
#include <math.h>
#include <stdio.h>
double DoubleToTheInt(double base, int power) {
return pow(base, power);
}
int main() {
// приводим к указателю на функуцию с обратным порядком аргументов
double (*IntPowerOfDouble)(int, double) =
(double (*)(int, double))&DoubleToTheInt;
printf("(0.99)^100: %lf n", DoubleToTheInt(0.99, 100));
printf("(0.99)^100: %lf n", IntPowerOfDouble(100, 0.99));
}
Этот код на самом деле никогда не определяет функцию IntPowerOfDouble
— потому что функции IntPowerOfDouble
не существует. Это переменная, указывающая на DoubleToTheInt
, но с типом, который говорит, что ему хочется, чтобы аргумент типа int
шел перед аргументом типа double
.
Вы могли бы ожидать, что IntPowerOfDouble
примет аргументы в том же порядке, что и DoubleToTheInt
, но приведет аргументы к другим типам, или что-то типа того. Но это не то, что происходит.
Попробуйте — вы увидите одинаковый результат в обоих строчках.
emiller@gibbon ~> clang something.c
emiller@gibbon ~> ./a.out
(0.99)^100: 0.366032
(0.99)^100: 0.366032
Как переменная может быть не равной её собственному значению
2016-08-14 в 11:54, admin, рубрики: c++, переполнение int, ПрограммированиеНедавно мой друг показал мне ошибку, которая проявляется в простой функции, вычисляющей полиномиальный хеш от строки с переполнением int'a. Она возвращала отрицательное число, хотя не должна была. Вот сама функция:
unsigned MAX_INT = 2147483647;
int hash_code(std::string x) {
int h = 13;
for (unsigned i = 0; i < 3; i++) {
h += h * 27752 + x[i];
}
if (h < 0) h += MAX_INT;
return h;
}
На некоторых строках, в частности, на строке «bye», и только на сервере (что интересно, на своем компьютере все было в порядке) функция возвращала отрицательное число. Но как же так, ведь в случае, если число отрицательное, к нему прибавится MAX_INT и оно должно стать положительным.
Читать полностью »