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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите разобраться с QString  (Прочитано 2992 раз)
xonotic
Гость
« : Сентябрь 20, 2011, 22:25 »

В общем проблема следующая. Все выполняется на linux 64 bit, есть сторонняя библиотека с функцией, которой аргументом передается некая структура. Одно из полей этой структуры типа
Код
C++ (Qt)
char *
.
Для наглядности приведу два упрощенных класса, которые отражают различия в поведении при различном присваивании значения полю структуры.

Код
C++ (Qt)
class MyClass{
private:
    QString* m_str;
public:
    MyClass(const QString& str){
         m_str = new QString(str);
    }
 
    void execute(){
         THIRDPARTYSTRUCT s;
         s.member = m_str->toAscii().data();              // <-------------- See here
         qDebug(third_party_function(s));
    }
}
 
class MyClass2{
private:
    QString* m_str;
public:
    MyClass2(const QString& str){
         m_str = new QString(str);
    }
 
    void execute(){
         THIRDPARTYSTRUCT s;
         s.member = "test";              // <-------------- See here
         qDebug(third_party_function(s));
    }
}
 
MyClass *c = new MyClass("test");
MyClass2 *c2 = new MyClass2("test");
c->execute(); // executed with error
c2->execute(); // executed ok
 
 
Необходимо, чтобы работал MyClass.
Смотрел память в отладчике. Адреса, конечно, в первом и во втором случае разные, но значения по ним совпадают. Подскажите, в чем может быть проблема.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Сентябрь 20, 2011, 22:32 »

Так делать нельзя. Сначала создаешь s.member = new char [что-то там], а потом юзаешь strcpy.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
BRE
Гость
« Ответ #2 : Сентябрь 21, 2011, 08:13 »

Код
C++ (Qt)
class MyClass
{
private:
    QByteArray m_buf;
public:
    MyClass(const QString& str)
         : m_buf( str.toAscii() ) {
    }
 
    void execute(){
         THIRDPARTYSTRUCT s;
         s.member = m_buf.constData();
         qDebug(third_party_function(s));
    }
}
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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