LINUX.ORG.RU

299
Всего сообщений: 3665

Совместная разработка

Привет.
Уточню сразу - у меня нет опыта совместной разработки. Допустим, у меня есть некая многопоточная софтина, как правильно организовать совместную работы с малоизвестными энтузиастами? Подозреваю что нужно сделать некое ядро (в которое никого не пускать) и модульную систему с чётко описанным интерфейсом, и принимать pull request’ы в виде модулей. Ну не пускать же первого встречного править всё что угодно.

Может у кого есть реальный опыт/мысли? Как организуется процесс в реальных проектах, разграничивается «зона ответственности». Поделитесь, пожалуйста.

 , ,

pavlick ()

70% багов в Chrome из-за неверной работы с памятью

https://www.chromium.org/Home/chromium-security/memory-safety

Не прошло и года с последних откровений: Про статическую типизацию и безопасный доступ к памяти, как гугл пришёл к тем же выводам, что и MS.

Что на это скажут приверженцы «они просто не умеют писать на C/C++», «в C++ тоже есть умные указатели, зачем вам этот раст» и «понанимали дебилов»?

Из интересного, они рассматривают вариант использования своей/патченой std и бан сырых указателей на уровне компилятора.

 , , ,

RazrFalcon ()

C++ — сила, а вы не верили

Опытный разработчик игр проясняет смузихлебам за С++, линукс и emacs.

Для Ъ: аватар поставил хипсторов на место

P.S. на 02:00:00 самое интересное. Он рекомендует Croco.

Таймкоды в первом комментарии на ютубе.

 , , ,

BceM_IIpuBeT ()

Подкрутить C-indenting

Привет. В виме есть C-indenting, который запускается через ‘=’. Я понимаю, что есть справка, надо разбираться и всё такое. Но хочется срезать путь, не вникая глубоко. Дело вот в чём - пишу такие конструкции:

/*block start*/ {
if (condition) {
	statements;
}
...
} /*block end*/

т.е. для экономии пространства не делаю отступ внутри «блока», но если пропустить все строки через автоиндент, то отступ впихнётся, чего мне не хочется. Что и как можно подкрутить на коленках чтобы C-indenting работал желаемым образом (оставить дефолтный конфиг, но спец поведение для /block start/ {…} /block end/)?

 , ,

pavlick ()

Перенос текста в ячейке в qtableView?

Как сделать перенос текста в ячейке, если не влезает в ширину столбца с помощью в qtableView?

Ни как не могу сделать перенос. Уже использую Delegate, но не получилось. Что сделал:

model = new QSqlTableModel(this,db);
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->setTable("TableEventBalancer");
model->select();
TableViewColumnDelegate *tableviewcolumnDelegate;
tableviewcolumnDelegate = new TableViewColumnDelegate;
ui->tableView->setItemDelegate(tableviewcolumnDelegate);
ui->tableView->setModel(model);
ui->tableView->setWordWrap(true);
ui->tableView->setTextElideMode(Qt::ElideNone);
int id = QFontDatabase::addApplicationFont("/usr/share/fonts/dejavu/DejaVuSansMono.ttf");
QFont font = QFont(QFontDatabase::applicationFontFamilies(id).first());
font.setPointSize(12);
ui->tableView->setFont(font);
ui->tableView->resizeColumnToContents(0);
ui->tableView->resizeColumnToContents(1);
ui->tableView->horizontalHeader()->setResizeMode(0, QHeaderView::Fixed);
ui->tableView->horizontalHeader()->setResizeMode(1, QHeaderView::Fixed);
ui->tableView->horizontalHeader()->setResizeMode(2, QHeaderView::Stretch);
ui->tableView->verticalHeader()->setResizeMode(QHeaderView::ResizeToContents);
model->setHeaderData(model->fieldIndex("number"), Qt::Horizontal, QString::fromLocal8Bit("ID"));
model->setHeaderData(model->fieldIndex("_date"), Qt::Horizontal, QString::fromLocal8Bit("Дата"));
model->setHeaderData(model->fieldIndex("text"), Qt::Horizontal, QString::fromLocal8Bit("Событие"));

Делегейт:

#include <QStyledItemDelegate>
#include <QPainter>
#include <QApplication>
#include <QDebug>
 
class TableViewColumnDelegate : public QStyledItemDelegate
{
    Q_OBJECT
public:
    explicit TableViewColumnDelegate(QObject *parent = 0);
    void paint(QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) const;
    QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const;
    QSize iconSize;
    int padding;
 
signals:
 
public slots:
};
 
#include "tableviewcolumndelegate.h"
 
TableViewColumnDelegate::TableViewColumnDelegate(QObject *parent) : QStyledItemDelegate(parent)
{
    iconSize = QSize(100, 40);
    padding = 5;
}
 
void TableViewColumnDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    if(!index.isValid())
           return;
 
       painter->save();
       if (option.state & QStyle::State_Selected)
           painter->fillRect(option.rect, option.palette.highlight());
 
       QString Text = index.data(0).toString();
       qDebug() << "Text" << Text;
 
       QString Text1 = index.data().toString();
       qDebug() <<"Text1"<< Text1;
 
       QFont Font = QApplication::font();
       QFontMetrics Fm(Font);
       QRect Rect = Fm.boundingRect(option.rect.left() + iconSize.width(), option.rect.top() + padding,
                                     option.rect.width() - iconSize.width(), 0,
                                     Qt::AlignLeft|Qt::AlignTop|Qt::TextWordWrap,
                                     Text);
       painter->setPen(Qt::black);
       painter->setFont(Font);
       painter->drawText(Rect, Qt::AlignLeft|Qt::AlignTop|Qt::TextWordWrap, Text);
       painter->restore();
}
 
QSize TableViewColumnDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    if(!index.isValid())
        return QSize();
    QString Text = index.data().toString();
    QFont Font = QApplication::font();
    QFontMetrics Fm(Font);
    QRect Rect = Fm.boundingRect(0, 0, option.rect.width() - iconSize.width(), 0,
                                             Qt::AlignLeft|Qt::AlignTop|Qt::TextWordWrap,
                                             Text);
    QSize size(option.rect.width(), Rect.height() +  3*padding);
 
    if(size.height()<iconSize.height())
        size.setHeight(iconSize.height());
    return size;
}

Получил, что время не вписалось в столбец и перенос не заработал.

 ,

Alex_Golubev ()

Ищу SDK старого речевого синтезатора L&H TTS3000

Собственно ищу данный сабж, ищу довольно давно и без особой надежды найти. Нужна именно СДК (файлы включения, документация по API etc), а не сам голосовой движок (его найти не проблема).

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

Возможные имена файлов включения

ttssdk32.h
lhtypes.h

Возможные имена функций

TtsInitialize
TtsUninitialize
TtsSpeakText
TtsStopSpeech
TtsPauseSpeech
TtsResumeSpeech
TtsGenPcmBuf
TtsGenNextPcmBuf
TtsGenPcmFile
TtsGetSpeechMode
TtsSetSpeechMode
TtsGetFreq
TtsSetFreq
TtsLoadUsrDict
TtsUnloadUsrDict
TtsEnableUsrDict
TtsUnloadAllUsrDict
TtsGetChannelStatus
TtsGetIdentity
TtsSetCmdSymbol
TtsSetSpeedUpMode
TtsGenUsrDict
TtsGetLastErrMsg
TtsGetAppInfo
TtsGetEngineInfo
TtsSelectEngine
TtsEnableNotify
TtsSetCallback
TtsSetSystemMode
TtsStopSpeechEx
TtsPauseSpeechEx
TtsGetAboutText
TtsGetSysInfo
TtsGetUsrDictEntry
TtsUpdateUsrDictEntry
TtsGetUsrDictInfo
TtsSaveUsrDict
TtsDeleteUsrDictEntry
TtsAddUsrDictEntry
TtsGenPcmBufEx
TtsResumeSpeechEx
TtsSetEngineMode
TtsGetMrkMode
TtsSetMrkMode
TtsGenPhonString
TtsSpeakTextEx
TtsAppendText
TtsGetMrkRecords
TtsSpeakPhonString
TtsGetVisual
TtsInitGetSysInfo
TtsSelectCtxMode^^^
TtsEnableCtxMode
TtsDisableCtxMode
TtsRegUsrCtxMode
TtsGetCtxModeInfo
TtsGetVoiceInfo
TtsSelectVoice
TtsGetCtxData
TtsGetCtxModeInfoEx
TtsSelectCtxModeEx
_TtsMgrCallBack
TtsGenPhonPcmFile
TtsPlayMidiSound
TtsPauseMidiSound
TtsResumeMidiSound
TtsStopMidiSound
TtsContinueMidiSound
TtsGetVoiceInfoEx
TtsGetUsrDictList
TtsGetCurrentEngineInfo
TtsGetCurrentVoiceInfo
TtsGetCurrentCtxModeInfo
TtsGetCmdList
TtsConvString
TtsSetVoiceMode
TtsGetVoiceMode
TtsGetCurrentVoiceUuid
TtsGetVoiceUuid
DllRegisterServer
DllUnregisterServer

Основная проблема в том, что продукт родом из девяностых и соответственно никаких ссылок (если они и были) не осталось, но может быть кто-то живет на свете достаточно и располагает данной SDK. В сети нашел какие-то отдельные упоминания и обрывки кода.

 ,

SwipeRight ()

QSettings, но не QSettings

QSettings мне не понравился тем, что вывод в ini не очень читабелен. Посоветуйте альтернативу. (Лёгкую || совместимую с Qt) && удобно подключаемую && хорошо документированную.

 

next_time ()

Можно ли выполнить bash команду в C++?

Возможно ли выполнять bash коммадны из c++?

 ,

spellman ()

Bosque - очередной убийца C++ от MS

https://github.com/microsoft/BosqueLanguage

Основные фичи:

  • GC в виде счетчика ссылок, ага
  • immutable
  • нет циклов, только функциональщина
  • дженерики, в том числе variadic
  • sum types/adt
  • синтаксически, смесь C++, Rust, Swift и OCaml, но страшнее
  • optional - часть языка, ака оператор ?
  • рекурсия должна быть явно объявлена через ключевое слово recursive
  • трансплитер написан на typescript и выплёвывает C++ (но это не точно)
  • они ещё используют Z3, но не ясно как именно

Пример:

entity Person {
    field name: String; 
}

function foo(arg?: {f: Int, n?: String} | String | Person): String {
    if(arg == none) {
        return "Blank";
    }
    else {
        return switch(arg) {
            type Record => arg.n ?| "Blank"
            type String => arg
            type Person => arg.name
        };
    }
}

foo()                    //"Blank"
foo(none)                //Type error - none not allowed
foo("Bob")               //Bob
foo(Person@{name="Bob"}) //Bob
foo({f=5})               //"Blank"

foo({f=1, n="Bob"})      //"Bob"
foo({g=1, n="Bob"})      //Type error - Missing f property

 

RazrFalcon ()

Как отловить в с++ прыжок из секции кода в секцию данных ?

В программе на с++ происходит иногда под отладкой остановка при исполнении секции данных. То есть где-то до этого по какому-то указателю исполнение попало в секцию данных и далее acess violation случается. Проблема в том, что нету стэк трейса в отладчике и не видно откуда произошел прыжок. Как можно или получить стек трейс или разобрать обратный ход, откуда из кода произошло выпадение в секцию данных.

 , , , ,

user2132 ()

снифер для snmpv3

доброго времени суток , снова . возникла задача найти или создать ПО обеспечивающее прием и обработку шифрованных инициативных сообщений от автоматизированных систем по протоколу snmpV3. проще говоря сниффер . на языке С++ . предложили как вариант взять за основу snmptrapd т.к. исходный код находится в открытом доступе . покопались в нем . но что то как то дело не пошло , файл не находит хидеры ,и много много еще всего . с огромной надеждой спрашиваю , может здесь у кого то есть такой сниффер под snmpv3 на плюсах ???? скорее всего это последняя просьба о помощи , больше в линукс мы не полезем , никогда ….

 , , ,

Kurama ()

Линковка к символическим ссылкам

Когда я пытаюсь слинковать что-то к файлу libjsoncpp.so, оно линкуется к символической ссылке libjsoncpp.so.1. Мне нужно слинковать именно к libjsoncpp.so, т.к. в других дистрибутивах, например арче, файла libjsoncpp.so.1 нет в пакете jsoncpp. Как это сделать?
(Мой дистрибутив - дебиан)

Это сошки либы: https://i.postimg.cc/d3j86zYw/image.png
Тут я собрала пример: https://i.postimg.cc/TwZkB8Fb/image.png
Тут я проверяю его на арче: https://i.postimg.cc/qByQg5Wm/image.png

 , ,

mirai65536 ()

Как правильно инициализировать список(std::list) объектов «на лету»?

Создаётся список(std::list) объектов с нетривиальным конструктором «на лету», элемент за элементом. Как их правильно инициализировать?

 

zanac1 ()

QPrintDialog: Cannot be used on non-native printers

Пишу на C++ и qt. Вывод текста на печать делаю следующим образом:

QPrinter Printer(QPrinter::PrinterResolution);
PrintDialog = new QPrintDialog(&Printer);
Printer.setPageSize(QPrinter::A4);
Printer.setOrientation(QPrinter::Portrait);
Printer.setPageMargins(20, 20, 20, 20, QPrinter::Millimeter);
Printer.setFullPage(false);
Printer.setOutputFormat(QPrinter::NativeFormat);
QTextDocument Doc;
QFont DocFont("PT Serif");
DocFont.setPixelSize(10);
Doc.setDefaultFont(DocFont);
QString HtmlForPrint = "<b>Test</b>";
Doc.setPageSize(Printer.pageRect().size());
Doc.setDocumentMargin(0);
Doc.setDefaultFont(DocFont);
Doc.setHtml(HtmlForPrint);
if (PrintDialog->exec()) {
    Doc.print(&Printer);
}
delete PrintDialog;
При сборке в debian всё работает правильно, при сборке в windows при попытке печати ничего не происходит (диалоговое окно не появляется), в выводе приложения:
QPrintDialog: Cannot be used on non-native printers
Пробывал qt 5.11, qt 5.9, windows 10 x64, windows 7 x64, windows 7 x86 - проблема остается везде. Собственно, что я делаю не так?

 ,

MIV ()

не компилируется портянка

Здравствуйте, что-то подвис на компиляции такого... подскажите, как поправить

template< int in1, int in2, typename FinalT,
		  int (FinalT::*WrapperImpl)(double const& arg1, double const& arg2, double& arg3)>
static int func_impl(int* self, double const& arg1, double const& arg2, double& arg3, bool in)
{
    return 1;
}

template< int in1, int in2, typename FinalT,
		  int (FinalT::*WrapperImpl)(double const& in_frame_info, double const& in_frame, double& out_frame_info)>
static int func(int* self, double const& arg1, double const& arg2, double& arg3)
{
    return func_impl< in1, in2, typename FinalT,
		      int (FinalT::*WrapperImpl)(double const& arg1, double const& arg2, double& arg3)>
	(self, arg1, arg2, arg3, false);
}

 

xperious ()

clang: member overload ambiguous

Имеется класс вида


struct A
{
 void f(const String&);
 String f(const int) const;
};


...
A* a = new A;
a->f(1); // clang9: error ambiguous overload

«Чинится» так static_cast<const A*>(a)->f(1);

В отдельно взятом примере - не воспроизводится.

В чем может быть проблема, идеи? Что тут шлангу не понятно? Разве что String не определен и компилятор думает что неопределенный тип - int.

 ,

invy ()

Qt wigets рендеринг на OpenGL

Добрый день. Подскажите пожалуйста с таким вопросом. Можно ли сделать так, чтобы рендеринг стандартных виджетов (QWidget и потомки) осуществлялся с использованием OpenGL, а не с использованием программного рендера. Вот например, столкнулся я с проектом, который представляет собой помойку из стандартных виджетов вперемешку с QML виджетами QQuickWidget и подумал, раз QML виджеты рисуются через OpenGL, то пусть бы все рисовалось через OpenGL. И еще вопрос: как вы относитесь к смещиванию стандартных виджетов и qml? Не приводит ли это к просадкам в производительности? Можно ли все делать полностью на qml или без виджетов не обойтись?

 , ,

rumgot ()

Определить тип возвращаемого из Python в C++ значения (при помощи pybind11)

Вызываю из C++ некоторую Python-функцию, которая может возвращать одну строку или список строк. Для интерфейса Python-С++ использую pybind11.

Сейчас делаю так (res имеет тип pybind11::object)

std::vector<std::string> result;
try {
    result.push_back(pybind11::cast<std::string>(res));
} catch(pybind11::cast_error& Err) {
    result = pybind11::cast<std::vector<std::string>>(res);
}

Есть ли более элегантный способ?

Элегантный способ (спасибо за подсказку):

if (py::isinstance<py::str>(res)) {
    result.push_back(pybind11::cast<std::string>(res));
} else {
    result = pybind11::cast<std::vector<std::string>>(res);
}

 , ,

Sahas ()

Почему два раза вызывается деструктор?

Делаю программу, в которой нужно запускать терминальные команды в самодельном эмуляторе консоли. Происходит это с помощью «вспомогательного» класса CommandRun и класса-диалога ConsoleEmulator .

В классе основного окна MainWindow создан приватный член класса CommandRun:

CommandRun *syncroCommandRun;

В конструкторе MainWindow он инициализируется и запоминается в глобальный объект globalParameters.
syncroCommandRun=new CommandRun( this );
globalParameters.setSyncroCommandRun( syncroCommandRun );
(Этот globalParameters по сути ничего не делает, просто помнит указатель, проблема не в нем).

Класс CommandRun унаследован от QObject. При создании объекта syncroCommandRun конструктору передается указатель на родительский объект this, поэтому в деструкторе MainWindow никаких команд delete нет, потому что этот объект должен сам корректно удалиться как дочерний для MainWindow. Это обычное дело для Qt.

Если запустить демонстрационный пример, и сразу нажать кнопку закрытия окна [x], то закрытие программы произойдет нормально, без ошибок.

Если же запустить демонстрационный пример, нажать в нем кнопку Run (мигнет окно запуска процесса), и нажать кнопку закрытия окна [x], то в консоль будет выдано:
Программа неожиданно завершилась.

Если проделать то же самое под дебаггером, то будет видно, что по какой-то причине два раза вызывается деструктор объекта syncroCommandRun. Вот скриншот:

https://anonfiles.com/18F8h8u7oe/_2020-04-28_16-11-44_png

Я не пойму, почему так происходит.

Демонстрационный пример тут: https://anonfiles.com/R541h7udoc/qtSample_zip

Те же файлы на dropmefiles: https://dropmefiles.com/s92FS

 , , ,

Xintrea ()

Хранилище или СУБД для множества blob данных

Просьба посоветовать, что посмотреть из дисковых хранилищ/key-value СУБД со следующими требованиями:

  • Хранение blob значений по ключам или путям (число или строка, не важно).
  • Сущностей для хранения много (порядка 10 млн), все они - бинарные блобы разных размеров - от 100Кб до 1Гб.
  • Нужен быстрый random-access на чтение/запись. Намного быстрее, чем хранить каждую из сущностей в виде отдельного файла в фс (это проверено, очень медленно при росте числа файлов).
  • Все хранится на одной машине, не распределенно
  • Не слишком большой оверхед по занимаемому месту на диске
  • С или C++ API

Копалось в сторону штук типа leveldb, проприетарных хранилищ и собственного велосипеда, все показывает сильное падение скорости доступа при росте числа значений или просто константно-низкую скорость (порядка 0.1 от скорости диска)

 , , ,

CatsCantFly ()