Название: Указатель типа void на структуру
Отправлено: Firefox от Июня 25, 2021, 09:12
Здравствуйте. Создаю QHash с ключем в виде строки и класса. В класс передаются указатели на разные структуры данных. Потом произвожу поиск заданной структуры. Но как взять по указателю данные не понимаю. mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H
#include <QMainWindow> #include <QHash> #include <QString> #include <QDebug> #include "taggeddata.h"
struct str1 { int k; short y; char g;
}; struct str2 { int k; short y; char g;
}; struct str3 { int k; short y; char g;
};
namespace Ui { class MainWindow; }
class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow();
QHash<QString, taggeddata*> hash; str1 ST1; str2 ST2; str3 ST3;
private: Ui::MainWindow *ui; void AddToList(char* ID, int size, void *exdata, int flags); void getHashData(char* ID); };
#endif // MAINWINDOW_H
Mainwindow.cpp #include "mainwindow.h" #include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); AddToList("st1", sizeof(ST1), &ST1, IS_READABLE); AddToList("st2", sizeof(ST2), &ST2, IS_WRITABLE); AddToList("st3", sizeof(ST3), &ST3, IS_READABLE); AddToList("st4", sizeof(ST1), &ST1, IS_READABLE);
ST3.k=5; ST3.y=9; ST3.g=1; sleep(5); getHashData("st3"); }
MainWindow::~MainWindow() { delete ui; } void MainWindow::AddToList(char* ID, int size, void *exdata, int flags) { hash[ID]=new taggeddata(ID, size, exdata, flags);
} void MainWindow::getHashData(char* ID) {
QHashIterator<QString, taggeddata *> i(hash);
while (i.hasNext()) { i.next(); qDebug()<<"current data"<<i.value()->get_ID()<<i.value()->get_exdata()<<i.value()->get_flags();
if(strcmp(ID,i.value()->get_ID())==0) { qDebug()<<"FINED DATA+++++++++++++++++++++++"<<ID<<i.value()->get_exdata()<<i.value()->get_size(); break; }
} QByteArray ttt; ttt.clear();
memcpy(i.value()->get_exdata(), ttt, i.value()->get_size());
qDebug()<<ttt.size();// результат 0 !!!!!!
// формируем QByteArray // QByteArray sendArr; // sendArr.clear(); // qint16 count_st=2; // sendArr.append(count_st); // qDebug()<<sendArr.size(); // sendArr.append(ID,16); // qDebug()<<sendArr.size()<<sendArr; // sendArr.append(ID,);
}
taggeddata.h #ifndef TAGGEDDATA_H #define TAGGEDDATA_H
#include <QMutex>
#define IS_READABLE 1 #define IS_WRITABLE 2
class taggeddata {
public: taggeddata(char* ID, int size, void *exdata, int flags);
inline QMutex *get_mutex(){return &_mutex;}; inline void *get_exdata(){return _exdata;}; inline int get_size(){return _size;}; inline char* get_ID(){return _ID;}; inline int get_flags(){return _flags;};
private: QMutex _mutex; int _flags; void *_exdata; int _size; char* _ID;
}; #endif//TAGGEDDATA_H
taggeddata.cpp include "taggeddata.h"
taggeddata::taggeddata(char* ID, int size, void *exdata, int flags) : _flags(flags), _exdata(exdata), _size(size), _ID(ID) { }
Название: Re: Указатель типа void на структуру
Отправлено: Firefox от Июня 25, 2021, 09:15
В итоге надо по этому указателю записывать данные из QBytaArray в нужную структуру. И данные из структуры в QBytaArray другой переписывать.
Название: Re: Указатель типа void на структуру
Отправлено: Igors от Июня 25, 2021, 14:14
А зачем Вы мучительно ищете если хеш как раз предназначен для быстрого поиска? Просто C++ (Qt) taggeddata * data = hash.value("st3"); if (data) { ... }
А если эл-т хеша - массивная структура (вместо указателя), то лучше auto it = hash.find("st3"); if (it != hash.end()) { it.value()... }
Название: Re: Указатель типа void на структуру
Отправлено: Firefox от Июня 25, 2021, 16:06
Спасибо. Как ещё можно заменить получение данных побайтрво. Делаю так: char *dat=(char*)i.value()->get_extdata(); int count=0; while(count<i.value()->get_size()) { qDebug()<<*dat; ++dat; count++; }
Так выводит правильно все данные из найденной структуры.если заменяю например на QByteArray send; send.resize(i.value()->get_size());
memcpy(send.data(),(char*)i.value()->get_exdata(),i.value()->get_size()); qDebug()<<send;// размер верный send 8 байт, но данные толь первый байт есть, дальше пусто
Или например на fromRawData, тоже самое толь первый байт заполнен.
Название: Re: Указатель типа void на структуру
Отправлено: Firefox от Июня 25, 2021, 16:20
Извините. Оказалось что все верно, это qDebug почему-то выводит только первый байт QByteArray. В так все методы работают.
Название: Re: Указатель типа void на структуру
Отправлено: Igors от Июня 25, 2021, 16:24
[quote author=Firefox link=topic=33056.msg244956#msg244956 date=1624626370] Как ещё можно заменить получение данных побайтрво.
А нафиг Вы связались с этим exdata/size ? Необходимости в таком низкоуровневом коде никакой. Замените эту парочку на QByteArray, и извлекать ничего не придется
|