Russian Qt Forum
Апрель 25, 2024, 23:55 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Указатель типа void на структуру  (Прочитано 3994 раз)
Firefox
Новичок

Offline Offline

Сообщений: 7


Просмотр профиля
« : Июнь 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)
{
}


Записан
Firefox
Новичок

Offline Offline

Сообщений: 7


Просмотр профиля
« Ответ #1 : Июнь 25, 2021, 09:15 »

В итоге надо по этому указателю записывать данные из QBytaArray в нужную структуру. И данные из структуры в QBytaArray другой переписывать.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Июнь 25, 2021, 14:14 »

А зачем Вы мучительно ищете если хеш как раз предназначен для быстрого поиска? Просто
Код
C++ (Qt)
taggeddata * data = hash.value("st3");
if (data) {
 ...
}
А если эл-т хеша - массивная структура (вместо указателя), то лучше
Код:
auto it = hash.find("st3");
if (it != hash.end()) {
  it.value()...
}
Записан
Firefox
Новичок

Offline Offline

Сообщений: 7


Просмотр профиля
« Ответ #3 : Июнь 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, тоже самое толь первый байт заполнен.
« Последнее редактирование: Июнь 25, 2021, 16:08 от Firefox » Записан
Firefox
Новичок

Offline Offline

Сообщений: 7


Просмотр профиля
« Ответ #4 : Июнь 25, 2021, 16:20 »

Извините. Оказалось что все верно, это qDebug почему-то выводит только первый байт QByteArray. В так все методы работают.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Июнь 25, 2021, 16:24 »

Код:
[quote author=Firefox link=topic=33056.msg244956#msg244956 date=1624626370]
Как ещё можно заменить получение данных побайтрво.
А нафиг Вы связались с этим exdata/size ? Необходимости в таком низкоуровневом коде никакой. Замените эту парочку на QByteArray, и извлекать ничего не придется

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.089 секунд. Запросов: 22.