LINUX.ORG.RU

Сообщения developer-cpp

 

где смотреть ошибки найденные valgrind

имеется совершенно минимальное приложение:

$ cat main.c 
#include <mpi.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[]){

    MPI_Init(&argc,&argv);

    MPI_Finalize();

    return 0;
}

Что за 507 ошибок нашел valgrind? Как отфильтровать ошибки, которые я допускаю в коде? --quiet или какие-то есть приемы?

$ mpicc main.c -lm -std=c99 -g -O0 -o main && valgrind --tool=memcheck  mpirun -np 4 ./main
==409== Memcheck, a memory error detector
==409== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==409== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==409== Command: mpirun -np 4 ./main
==409== 
==409== Invalid read of size 8
...
==409== ERROR SUMMARY: 507 errors from 2 contexts (suppressed: 4 from 4)

 

developer-cpp
()

MPI сбой в одном из потоков

При написании MPI приложения возможно ли средствами MPI предусмотреть возможность сбоя в одном из потоков (например роизошла ошибка сегментирования или узел выключили ...)? Так чтобы приложение не заканчивалось аварийно, а просто «вычисляющий» поток сообщал о сбое, а «управляющий» его работу передавал еще кому-то.

 

developer-cpp
()

openmpi кластер

Помогите допилить CentOS кластер.

1> сделал пользователя cluster

2> настроил ssh вход по ключу:

ssh 192.168.0.*
выполняет вход без пароля

3> настроил общий каталог /var/cluster

4> установил openmpi

5> в /var/cluster создал hosts.txt и прописал пока два узла 192.168.0.1 и 192.168.0.2, проверил что вход по ssh есть.

6> в ~/.bashrc cluster-а добавил

export PATH=$PATH:/usr/lib64/openmpi/bin
export LD_LIBRARY_PATH=/usr/lib64/openmpi/lib
на всякий ребутнулся и проверил что пути работают

8> вот эта команда работает на любом из узлов

$ mpirun -np 2 hostname
а вот эта висит
$ mpirun -hostname /var/cluster/hosts.txt  -np 2 hostname
просто висит и никаких сообщений.

Что можно сделать? проверить?

 

developer-cpp
()

собрать программу для старого linux без компилятора

Посоветуйте что почитать или просто порекомендуйте на что обратить внимание: нужно статически собрать проект на C++ для машин с операционными системами CentOS5 (или ниже, пока мне не изветно) без библиотек C++ (устанавливать библиотеки нельзя), имея в распоряжени современный Linux с 3 ядром. Приложение использует библиотеку STL.

P.S. просто есть подозрения, что только ключиком -static не удасться так вот просто обойтись

 

developer-cpp
()

сформировать условие для setFilter из QSqlTableModel

Нужно отфильтровать данные из таблицы по имени, хранящемуся в связанном справочнике. Т.е. в таблице храниться идентификатор dict_id, который разыменовывается в справочнике.

Ниже простой пример. Конечно же dict_id=1 работает и отфильтровывает строку с first element. А вот как выбрать по 'first element' не понятно.

CREATE TABLE TestDict (    
    "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
    "name" varchar(20) NOT NULL
);
CREATE TABLE TestTable (
    "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
    "dict_id" integer NOT NULL,
    "value" real NOT NULL,
    FOREIGN KEY("dict_id") REFERENCES TestDict
);

INSERT INTO TestDict ("name") VALUES ("first element");
INSERT INTO TestDict ("name") VALUES ("second element");

INSERT INTO TestTable ("dict_id","value") VALUES ("1","22");
INSERT INTO TestTable ("dict_id","value") VALUES ("2","32");
#include <QtGui>
#include <QtSql>

int main(int argc, char *argv[]){
	QApplication app(argc,argv);
	QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
	db.setDatabaseName("test.db");
	if(!db.open()) {
            qDebug() << "open error";
	    return 1;
	}
	QSqlRelationalTableModel model;
	model.setTable("TestTable");
	model.setRelation(model.fieldIndex("dict_id"), QSqlRelation("TestDict", "id", "name"));
	//model.setFilter(tr("TestTable.dict_id=TestDict.id AND TestDict.name='first element'"));
	model.setFilter("dict_id=1");
	QTableView view;
	view.setModel(&model);
        view.setItemDelegate(new QSqlRelationalDelegate(&view)); 
	view.show();
	model.select();
	return app.exec();
}

В SQL был бы такой запрос:

sqlite>  select TestTable.id, TestTable.dict_id, TestTable.value from TestTable,TestDict WHERE TestTable.dict_id=TestDict.id AND TestDict.name='first element';
1|1|22.0
или может так правильнее
sqlite> select TestTable.id, TestDict.name, TestTable.value from TestTable,TestDict WHERE TestTable.dict_id=TestDict.id AND TestDict.name='first element';
1|first element|22.0

p.s. Пытаюсь «лесом» обойти вот эту проблему https://www.linux.org.ru/forum/development/11689249?cid=11689890 (комментарий)

 ,

developer-cpp
()

мучаем QSortFilterProxyModel - не работает setRelation

При использовании модели посредника proxy типа QSortFilterModel перестает работать связь со справочниками.

// при открытии документа делаю
model = new QSqlRelationalTableModel(this);
proxy = new QSortFilterProxyModel(this);
proxy->setSourceModel(model);

// при работе с таблицей
model->setTable("TestTable");
model->setRelation(1, QSqlRelation("Dict1", "id", "name"));
view->setModel(proxy);

Если сделать

view->setModel(model);
то при работе с таблицей TestTable данные нормально берутся из справочника. Если же как в коде
view->setModel(proxy);
то данные из справочника пропадают.

Как подправить этот баг? P.S.

QSortFilterProxyModel *proxy;
QSqlRelationalTableModel *model;
MyView *view; // наследник QTableView

 ,

developer-cpp
()

Использование QSortFilterProxyModel

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

Использую модель-посредник QSortFilterProxyModel для фильтрации строк одной из таблиц. Все остальные таблицы в фильтрации не нуждаются и управляются моделью QSqlRelationalTableModel.

Логика работы организована так:

QSortFilterProxyModel *proxy;
QSqlRelationalTableModel *model;
MyView *view;

// в конструкторе
view = new MyView

// в методе открытии документа
model = new QSqlRelationalTableModel(this);
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
proxy = new QSortFilterProxyModel(this);
proxy->setSourceModel(model);

// при выборе таблицы для работы (редактирования)
    // для всех таблиц (кроме одной)
    view->setModel(model);
    // для одной
    view->setModel(proxy);

// в методе сохранения действую так:
QSqlTableModel *md = qobject_cast<QSqlTableModel*>(model()); // вот здесь то и проблема
md->database().transaction();
// ...

Поблема такая: md для таблиц работающих с model не пустое (правильное), а вот для одной таблицы, работающий с proxy --- md=0.

Как правильно заполучить в md модель-посредник? или, может быть здесь д.б. настоящая модель, ведь ничего же не фильтруется при сохранении. Тогда, как правильно заполучить модель?

 ,

developer-cpp
()

QLineEdit в панели инструментов главного окна

в конструкторе главного окна создал панель инструметов

QWidgetAction *filter1 = new QWidgetAction(this);
filter1->setDefaultWidget(new QLineEdit(this));
toolForFilters->addAction(filter1);
addToolBar(Qt::TopToolBarArea,toolForFilters);
В интерфейсе главного окна имеется ссылка на класс документа document.

Как в методе открытия документа (который расположен в классе главного окна) добраться до сигнала textChanged виджета QLineEdit? И, вообще, можно ли добраться до textChanged?

нужно поставить коннект

connect(что типа this->toolBar()-> ... filter1,SIGNAL(textChanged(const QString&)),document,SLOT(setFilter1(const QString&)))

 ,

developer-cpp
()

собрать Qt приложение с openmp

Решил распараллелить некоторый код в Qt приложении. Расчеты выполняются в цикле и больших усилий процесс расспараллеливания не вызывает (в код всего лишь добывил перед циклом #pragma omp parallel for ...). Пробую собрать:

qmake -project && qmake QT+=sql QMAKE_CXXFLAGS+=-fopenmp && make 

ошибки:

undefined reference to `GOMP_loop_static_start'
undefined reference to `GOMP_loop_static_next'
undefined reference to `GOMP_loop_end_nowait'
undefined reference to `GOMP_parallel_start'
undefined reference to `GOMP_parallel_end'

в чем может бють проблема, если просто консольные программы без Qt нормально собираются с ключем -fopenmp? как устранить?

 ,

developer-cpp
()

установить в virtualbox win 64 bit

Можно ли в virtualbox установить window 64 bit? Если можно, то как?

В версии, к-я у меня установлена, это Oracle VM VirtualBox 4.3.20 (+Extension Pack 4.3.20) доступны только 32 bit.

 

developer-cpp
()

Qt костыль закрытия открытой БД

Нужно открыть соединение с БД и при этом закрыть старое соединение, если оно было открыто. Написал код - работает, но как-то костылеобразно выглядит ... предложите покрасивее что-то поприятнее на глаз. Соединение всегда открыто только одно.

void MyWidget::openDatabase(){

    {
	    QString name;
	    {
                  QSqlDatabase db = QSqlDatabase::database();
                  if (db.isOpen()) 
		  { 
           	     db.close(); 
		     name = db.connectionNames()[0];
	             delete model;
                  }
	    }
       QSqlDatabase::removeDatabase(name);
    }

    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");

    db.setDatabaseName("test.sqlite");
    if(!db.open()) {
        QMessageBox::critical(0,QObject::tr("Ошибка"),db.lastError().text());
    }

    model = new QSqlTableModel(this);
    // ...
}

P.S. а почему removeDatabase() статический, объясните, пожалуйста. Нифига не понятно почему просто методом нельзя сделать

 ,

developer-cpp
()

QtSql как правильно открыть SQLite-файл

Нужно чтобы приложение работало с разными DB-файлами. Пишу так

в main()

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");

в слоте вьюхи

void MyView::openDatabase(){
   QSqlTableModel *m = qobject_cast<QSqlTableModel*>(model());
   m->database().setDatabaseName("test.sqlite3");
   if(!m->database().open()) {
       QMessageBox::critical(0,QObject::tr("Ошибка открытия"),m->database().lastError().text());
    }
}

Приложение работает. Но, в консоли возникает ошибка, хотелось бы избавиться от нее

QSqlDatabasePrivate::database: unable to open database: " " 

 

developer-cpp
()

почему с QSqlRelationalTableModel данные не сохраняются?

отображается все верно, но при нажитии на сохранить данные не сохраняются : - (

class MyView: public QTableView {
Q_OBJECT
public:
    MyView(QWidget * parent = 0);
public slots:
    void saveData();
};

class MyWidget: public QWidget { 
Q_OBJECT
    QSqlRelationalTableModel *model;
    MyView *view;
public:
    MyWidget(QWidget *parent = 0);
};

MyWidget::MyWidget(QWidget *parent): QWidget(parent){
    QVBoxLayout * layout = new QVBoxLayout;
    setLayout(layout);

    model = new QSqlRelationalTableModel(this);
    model->setTable("testtable");
    model->setRelation(0, QSqlRelation("dict", "dict_id", "name"));
    model->select(); 
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);

    view = new MyView;
    view->setModel(model);
    view->setItemDelegate(new QSqlRelationalDelegate(view));
    layout->addWidget(view,5);

    QPushButton *bSave = new QPushButton(QObject::tr("&Сохранить"));
    QObject::connect(bSave,SIGNAL(clicked()),view,SLOT(saveData()));
    layout->addWidget(bSave,1);
}

MyView::MyView(QWidget *parent): QTableView(parent){}

void MyView::saveData(){
    if(((QSqlTableModel *) model())->submitAll()) qDebug() << "ok" ;
}

база вот такая

CREATE TABLE "dict" (    
    "dict_id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
    "name" varchar(20) NOT NULL
);
CREATE TABLE "testtable" (
    "dict_id" integer,
    "value" real NOT NULL,
    FOREIGN KEY(dict_id) REFERENCES dict
);

INSERT INTO dict ("name") VALUES ("A");
INSERT INTO dict ("name") VALUES ("B");

INSERT INTO testtable VALUES ("1",2.2);
INSERT INTO testtable VALUES ("2",6.6);

 

developer-cpp
()

не стандартный MyTableView

записи в некоторой таблице Table храняться так

x_id   y_id     value
1      1        12
1      2        22
1      3        25
2      1        1.1
2      2        2.2
2      3        4.4
//...

Подскажите методы qt для реализации таблицы представления, отображающую эти данные так:

x/y   1     2     3
1     12    22    25
2     1.1   2.2   4.4
3    .....

 

developer-cpp
()

автоматически менять ширину столбца QTableView

Как заставить столбцы увеличиваться в соответствии с размером контекста?

Делал так, в конструкторе своего виджета

model = new MyTableModel;
// ...
view = new MyTableView;
layout->addWidget(view);
//...

Причем model и view члены класса собственного виджета.

перегрузил

void MyTableView::resizeEvent(QResizeEvent *event)
{
  resizeRowsToContents();
  resizeColumnsToContents();
}

ну и выбор таблицы происходит в отдельном слоте:

model->setTable("TestTable");
view->setModel(model);
model->setHeaderData(1,Qt::Horizontal,tr("Имя")); 
// ...
model->select();
view->hideColumn(0); // idx
updateGeometry();

Проблема: при выборе первой таблицы, ширина столбцов подгоняется под размер столбца. А при выборе второй, третьей ... таблиц ширина столбцов уже не менятется.

 

developer-cpp
()

проектирование БД

Возникла такая проблемка. Каждому объекту в таблице сопоставляется тип объекта из множества 0,1,2,...N-1. N - это число объектов (или записей в таблице). Сейчас таблица спроектирована так

idx type   object
1    0     объект1
5    1     объект2
13   2     объект3
т.е. есть первичный ключ автоинкрементный idx и поле type. Записи вставлялись, удалялись и опять вставлялись и idx не использует все индексы по порядку. А для type нужно чтобы нумерация была неотрицательными числами без их пропуска. Но в этом решении меня не устраивает, что повесил на пользователя ввод значений поля type.

Можно ли оставить только поле type первичным ключом, и как-то заставить СУБД нумеровать записи без пропусков чисел?

 ,

developer-cpp
()

Qt делегат

Для поля email некоторого столбца написал делегата, в котором используется lineEditor типа QLineEdit с валидатором (рег. выражение упрощено):

QRegExp rxe("^[a-z]+@[a-z]+$");
QValidator *validator = new QRegExpValidator(rxe,parent);
lineEditor->setValidator(validator);

В делегате это код работает в методах: createEditor, setEditorData, setModelData. Валидатор не пускает лишние символы, все+. Но, если прекратить редактирование и выполнить commit, то может сохраниться и неверный емайл, например без @. Вопрос: как в пределах класса делегата (думаю в setModelData) не дать невалидному тексту сохраниться?

 

developer-cpp
()

qobject_cast

SModel *m =qobject_cast<SModel*>(model());// main.cpp:61

как исправить эту ошибку

g++ -c -m64 -pipe -O2 -Wall -W -D_REENTRANT -DQT_WEBKIT -DQT_NO_DEBUG -DQT_SQL_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++-64 -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtSql -I/usr/include/qt4 -I. -I. -o main.o main.cpp
In file included from /usr/include/qt4/QtSql/qsqlrelationaltablemodel.h:45:0,
                 from /usr/include/qt4/QtSql/qsqlrelationaldelegate.h:50,
                 from /usr/include/qt4/QtSql/QtSql:5,
                 from main.cpp:2:
/usr/include/qt4/QtSql/qsqltablemodel.h: In instantiation of ‘void QSqlTableModel::qt_check_for_QOBJECT_macro(const T&) const [with T = SModel]’:
/usr/include/qt4/QtCore/qobject.h:378:5:   required from ‘T qobject_cast(QObject*) [with T = SModel*]’
main.cpp:61:59:   required from here
/usr/include/qt4/QtSql/qsqltablemodel.h:61:5: error: void value not ignored as it ought to be
make: *** [main.o] Ошибка 1

 ,

developer-cpp
()

sqlite3 database is locked

Добрый день, всем!

Что делаю не так?

if(условие1){
   sqlite3 *db;
   sqlite3_open(mysqlitefile, &db);
   zRequest = "SELECT ... ? ...";
   sqlite3_stmt *stmt; 
   sqlite3_prepare_v2(db, zRequest,-1,&stmt,0);
   sqlite3_bind_...;
   sqlite3_step(stmt);
   val1 = sqlite3_column_double(stmt,0);
   ...
   sqlite3_reset(stmt);
   sqlite3_finalize(stmt);
   sqlite3_close(db);
}

// ...

if(условие2){
   sqlite3 *db;
   sqlite3_open(mysqlitefile, &db);
   zRequest = "UPDATE ... ? ...";
   sqlite3_stmt *stmt; 
   sqlite3_prepare_v2(db, zRequest,-1,&stmt,0);
   sqlite3_bind_...;
   sqlite3_step(stmt); // вот тут ошибка database is locked
   ...
   sqlite3_finalize(stmt);
   sqlite3_close(db);
}

P.S. ничего не меняется при от открытии базы во втором случае, с явным флагом о записи:

sqlite3_open_v2(mysqlitefile, &db, SQLITE_OPEN_READWRITE, NULL)

 ,

developer-cpp
()

C/SQLite что за ошибка

Помите найти причину ошибки. В базу данные вставляются.

int main(int argc, char **argv){
  sqlite3 *db;
  sqlite3_open(argv[1], &db);
  sqlite3_stmt *stmt;
  char const * sqlRequest = "INSERT INTO MyTable (dict_id, value) VALUES (?,?);";
  for(int n=1; n<=2;++n){
              if(sqlite3_prepare(db, sqlRequest,-1,&stmt,0))
                       fprintf(stderr, "error1: %s\n", sqlite3_errmsg(db));
              sqlite3_bind_int(stmt,1,n); 
              sqlite3_bind_double(stmt,2,3.14*n); 
              if(sqlite3_step(stmt)  != SQLITE_OK) 
                       fprintf(stderr, "error2: %s\n", sqlite3_errmsg(db));
              sqlite3_reset(stmt);
  }
  sqlite3_finalize(stmt);
  sqlite3_close(db);
  return 0;
}

в ходе работы приложение выдает:

error2: unknown error
error2: unknown error
CREATE TABLE "Dict" (
    "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
    "name" varchar(2) NOT NULL,
    "note" varchar(100) NOT NULL
)
;
CREATE TABLE "MyTable" (
    "dict_id" integer NOT NULL REFERENCES "Dict" ("id"),
    "value" real NOT NULL,
    PRIMARY KEY( "dict_id" )
)
;
CREATE INDEX "MyTable_0137dbe1" ON "MyTable" ("dict_id");

INSERT INTO Dict ("name", "note") VALUES ("Линукс","Ubuntu, Debian, ...");
INSERT INTO Dict ("name", "note") VALUES ("Виндовс","XP, 7, ...");

 ,

developer-cpp
()

RSS подписка на новые темы