Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сохранить адрес в строку (QString) [QT], перевод адреса в строку и обратно 
V
    Опции темы
ss
Дата 21.8.2013, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 17.5.2007

Репутация: нет
Всего: нет



Здравствуйте. Нужна помощь с задачей:
есть контейнер(stl) (у меня QList<QString> data) есть итератор (у меня QList<QString>::itertor it_data).
Необходимо разработать две функции которые будут:
первая (QString PointerToStr(void *) ) сохранять адрес в строку и выдавать ее;
вторая ( void* StrToPointer(QString *) ) выдавать адрес (ссылку) сохраненный в строке.

Пример использования

Код

#include <QString>
#include <QList>
#include <QtDebug)
. . .

QList<QString> data;
QList<QString>::itertor it_data;
QString st;
//...... заполняем контейнер
//.....data.push

it_data = data.begin();
it_data++;  //второй элемент  (просто взял произвольный)

st=PointerToStr(it_data);

it_data=NULL;

it_data = (QList<QString>::iterator) StrToPointer(&st);

qDebug() << *it_data;

PM MAIL   Вверх
borisbn
Дата 22.8.2013, 06:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



XY-problem detected


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
ss
Дата 22.8.2013, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 17.5.2007

Репутация: нет
Всего: нет



нужна реализация самих функций
(переменная st в качестве буфера хранения )
PM MAIL   Вверх
bsa
Дата 22.8.2013, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



ss, ну так в чем проблема? реализуй!
PM   Вверх
borisbn
Дата 22.8.2013, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



ss, это реальная проблема или задание в школе/институте/на собеседовании? Если первое, то найди в вики статью про xy-problem, и, если понял о чём я, то выкладывай X smile


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
bsa
Дата 22.8.2013, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



borisbn, не знал, что это называется XY-problem. Спасибо, буду знать.
PM   Вверх
ss
Дата 23.8.2013, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 17.5.2007

Репутация: нет
Всего: нет



это не задание в школе/институте/на собеседовании. Для моего проекта надо.  У меня не получается правильно привести адрес к строковому типу и обратно .Взять буковки которые в строке и использовать их как адрес в памяти. Поэтому и надеюсь ,что добрая душа более опытная в QT c++ поделится своими идеями

Это сообщение отредактировал(а) ss - 23.8.2013, 14:32
PM MAIL   Вверх
bsa
Дата 26.8.2013, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



ss, зачем тебе это надо? Подобная работа с указателями нужна исключительно для отладочных целей. Но для этого существуют отладчики. А сохранять, загружать и передавать по сети указатели не нужно вообще никогда, так как у разных процессов одни и те же данных хранятся в разных местах.
Цитата(ss @  21.8.2013,  17:11 Найти цитируемый пост)
есть контейнер(stl) (у меня QList<QString> data)
Ты определись, STL или Qt. У STL есть контейнеры std::vector и std::list. А у Qt: QList и QVector.
Цитата(ss @  21.8.2013,  17:11 Найти цитируемый пост)
сохранять адрес в строку и выдавать ее;
для этого достаточно сделать каст указателя к типу size_t, затем это значение преобразовать в строку в виде hex (делай через QTextStream).
Цитата(ss @  21.8.2013,  17:11 Найти цитируемый пост)
выдавать адрес (ссылку) сохраненный в строке.
А это наоборот. Используя QTextStream ты из строки получаешь size_t, затем кастишь к указателю.

Но еще раз повторяю, скорее всего, ты что-то делаешь не так.
PM   Вверх
ss
Дата 2.9.2013, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 17.5.2007

Репутация: нет
Всего: нет



 smile 

мне это надо для быстрого доступа к классам
Есть QList<Device>. Эти классы выстраиваются в дерево в (TreeWidget). При двойном клипе по пункту в дереве ,чтобы не искать в листе, преобразовать адрес в строку и на против пункта устройства ,в дереве, во второй колонке сохранять адрес на класс.

не могли ли бы вы привести пример с кастамиbс QList<QString>

Это сообщение отредактировал(а) ss - 2.9.2013, 14:30
PM MAIL   Вверх
bsa
Дата 2.9.2013, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



ss, сделай наследника QTreeWidgetItem и добавь в него указатель устройство, как член класса.
PM   Вверх
ss
Дата 4.9.2013, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 17.5.2007

Репутация: нет
Всего: нет



T.E.
QTreeWidgetItem *itm = iterator_Device;   
itm->settext(iterator_Device->name); //имя устройства кот. будет отображаться в дереве
?

не могли ли бы Вы привести пример, пожалуйста.

Это сообщение отредактировал(а) ss - 4.9.2013, 22:47
PM MAIL   Вверх
bsa
Дата 5.9.2013, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



Код
class MyTreeWidgetItem : public QTreeWidgetItem
{
    Q_OBJECT
public:
...
private:
    void *devAddress_;
};

PM   Вверх
ss
Дата 5.9.2013, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 17.5.2007

Репутация: нет
Всего: нет



bsa, спасибо
PM MAIL   Вверх
ss
Дата 8.9.2013, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 17.5.2007

Репутация: нет
Всего: нет



вот код программы для метода предложенным bsa
создаем класс наследник от QTreeWidgetItem

Код



#include <QTreeWidgetItem>

class QItmsM : public QTreeWidgetItem
{
public:
    QItmsM(){};
    //любые переменные. Например две переменных st и data
    // st хранит текст любой, может и не зависить от названия пункта
    QString st;
    void * data;
};


в дизайнере стягиваем QTreeWidget.

Создаем два своих пункта 
Код

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTreeWidgetItem>
#include <QMessageBox>


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);


QString st;

            QItmsM *ii = new QItmsM();    //пункт
            st =ii->st = "моя ячейка";
            ii->setText(0,st);
            ui->treeWidget->addTopLevelItem(ii);


            QItmsM *iii = new QItmsM(); //подпункт
            st =iii->st = "ячейка1";
            iii->setText(0,st); //название подпункта
            ii->addChild(iii); //добавить подпункт iii в пункт ii

}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::on_treeWidget_itemDoubleClicked(QTreeWidgetItem *item, int column)
{ //при двойном клике на дерево выводим в окно сообщения содержимое класса наследника, поле st  (в качестве проверки правильной работы программы)
      QItmsM *M;
      M= (QItmsM*) item;
    QMessageBox::information(0,"", M->st );
}



А для тех кто столкнется с проблемой, описанной вначале, вот реализация (действует на все незащищенные данные QVector, char* ... .Не работает на QList)

Код

#ifndef POINTERS_H
#define POINTERS_H

//#endif // POINTERS_H
#include <QString>



class QPointerS
{
public:
    static QString pointerToStr(void* pointer) //переводит адреса к строковому типу.
{
            int n = (int)pointer;
            QString s;
            while(n != 0)
            {
                int temp = n % 10;
                s += (temp + '0');
                n /= 10;
            }
            std::reverse(s.begin(),s.end());
            return s;
        }


      static void* srtToPointer(QString *_st)  //переводит строковый тип к адресу
{
         return (void*)atoi(_st->toStdString().c_str());
}
};

#endif


пример использования 
QVector<QString> v1;  
QVector<QString>::iterator it_v1;
QString st = QPointerS::pointerToStr(it_v1); //сохранить адрес
it_v1 = static_cast<QVector<QString>::iterator >( QPointerS::srtToPointer(&st) ); //восстановить
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0935 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.