crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Цвет линий графика
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
AD Дата 29.4.2008, 8:49
 
Цитата(Tonal @ 29.4.2008, 8:31) *
Не хватает определения param_color.
Оно выглядит так?
QColor* param_color?


Но всё таки, мне кажется, что мая телепатия меня не подвела. :)

Ты запоминаешь в векторе fact_prm указатель на локальную переменную.
Догадайся, куда он будет указывать при выходе из функции?

Исправить - просто. Вместо указателя на QColor везде используй само значение. В параметрах конструктора вместо QColor* пиши const QColor& и будет тебе щастье. :)

Вах-вах! Какая глупая ошибка. Спасибо! Действительно помогло - убрать указатель! :)
Tonal Дата 29.4.2008, 7:31
  Не хватает определения param_color.
Оно выглядит так?
QColor* param_color?


Но всё таки, мне кажется, что мая телепатия меня не подвела. :)

Ты запоминаешь в векторе fact_prm указатель на локальную переменную.
Догадайся, куда он будет указывать при выходе из функции?

Исправить - просто. Вместо указателя на QColor везде используй само значение. В параметрах конструктора вместо QColor* пиши const QColor& и будет тебе щастье. :)
AD Дата 28.4.2008, 17:28
 
Цитата(Tonal @ 28.4.2008, 11:25) *
По приведённому тобой коду нельзя сказать где ошибка.
Несколько уточняющих вопросов:
1) Во втором куске кода, где и как определено имя clr?
2) Покажи конструктор, QFactParam который там вызывается.
3) Второй и 3ий кусок кода как распологаются друг относительно друга (в одном блоке, в одной процедуре, в одном классе...)?

Предположение, основанное на телепатии - в QFactParam ты запоминаешь адрес локального объекта, который разрушается при выходе из блока, а используешь этот адрес совсем в другой функции. :)

1)
QColor clr;

for(paramI iter=graphic -> mainWindow -> cur_rec.begin(); iter!=graphic -> mainWindow -> cur_rec.end(); ++iter)
     if((*iter) -> Name() == prm_name.toStdString() && (*iter) -> Address() == iadr)
     {
/// etc

2)
 
QFactParam(): param_record(NULL), param_color(NULL), type(NOTYPE) {}
    QFactParam(ParamDescr* _pr, TP_PARAM _tp, QColor* _cl = &QColor(Qt::black)): param_record(_pr), type(_tp),
                            param_color(_cl) {}
    QFactParam(const QFactParam& _qf) { *this = _qf; }

3) 2-ой и 3-ий куски кода в 1 посте располагаются в разных файлах, вектор QFactParams виден глобально!
Tonal Дата 28.4.2008, 10:25
  По приведённому тобой коду нельзя сказать где ошибка.
Несколько уточняющих вопросов:
1) Во втором куске кода, где и как определено имя clr?
2) Покажи конструктор, QFactParam который там вызывается.
3) Второй и 3ий кусок кода как распологаются друг относительно друга (в одном блоке, в одной процедуре, в одном классе...)?

Предположение, основанное на телепатии - в QFactParam ты запоминаешь адрес локального объекта, который разрушается при выходе из блока, а используешь этот адрес совсем в другой функции. :)

По поводу хранения в векторах объектов и указателей - правильно использовать то, что нужно для задачи, а не что попало. :)
ViGOur Дата 25.4.2008, 16:26
  В данном случае используется не Qt'шный QVector, а STL vector. Но в принципе желательно также использовать указатели.
Litkevich Yuriy Дата 25.4.2008, 16:04
 
Цитата(' date='25.4.2008, 14:56) *
в чем большая разница-то?

вектор это же контейнер, а в Qt4 в контейнер рекомендуют только указатели класть, если я ничего не путаю.
ViGOur Дата 25.4.2008, 14:00
 
for(vector<Reader::DName>::iterator jter=dist_vec -> begin(); jter!=dist_vec -> end(); ++jter)
{
    if(jter -> getPrName() == parameter -> Name().c_str() && jter -> getAddress() == parameter -> Address())
    {
        QString s_color = jter -> getColor();
        clr = QColor(s_color);
        break;
    }
    QFactParam *inParam=new QFactParam(parameter, DISTPARAM, &clr);
    if(check -> isChecked())
        fact_prm.push_back( inParam);
}
Соответственно в коде исправляешь vector<QFactParam> на vector<QFactParam*>...
AD Дата 25.4.2008, 13:34
 
Цитата(ViGOur @ 25.4.2008, 13:22) *
У тебя будет происходить куча операций копирования.
Посмотри на результат работы данного кода. :)
Я его для примера написал. :)

Посмотрел код, действительно некрасиво. Но как это к моему случаю относится? Можно пример правильного кода относительно моей программы! Заранее благодарю!
Andrew Selivanov Дата 25.4.2008, 12:30
 
Цитата(AD @ 25.4.2008, 11:45) *
Вот присвоение уже QColor:
for(vector<Reader::DName>::iterator jter=dist_vec -> begin(); jter!=dist_vec -> end(); ++jter)
    if(jter -> getPrName() == parameter -> Name().c_str() && jter -> getAddress() == parameter -> Address())
    {
        QString s_color = jter -> getColor();
        clr = QColor(s_color);
        break;
    }
    QFactParam inParam(parameter, DISTPARAM, &clr);
    if(check -> isChecked())
        fact_prm.push_back(inParam);


У тебя цикл for только для первого if, остальное почему-то на том же уровне, но выполняется оно не в цикле.
ViGOur Дата 25.4.2008, 12:22
  У тебя будет происходить куча операций копирования.
Посмотри на результат работы данного кода. :)
#include <QtCore/QCoreApplication>

#include <vector>
using namespace std;

class CTest
{
    int m_nTmp;
    static int m_n;
public:
    CTest();
    CTest( const CTest &r);
    virtual ~CTest();

    int GetValue()const;
};

int CTest::m_n=0;

CTest::CTest()
{
    m_nTmp=m_n;
    qDebug( "CTest: %d", m_n);
    m_n++;
}

CTest::CTest( const CTest &r)
{
    qDebug( "CTest( const CTest &): %d, Value: %d", m_n, r.m_nTmp);
    m_n++;
    this->m_nTmp = r.m_nTmp;
}

CTest::~CTest()
{
    m_n--;
    qDebug( "~CTest: %d", m_n);
}

int CTest::GetValue()const
{
    return m_nTmp;
}

void f2( vector<CTest> &v)
{
    for( int n = 0; n < 10; n++)
    {
        CTest test;
        v.push_back( test);
    }
}

void f1()
{
    vector<CTest> v;
    //v.reserve( 10);

    f2( v);

    vector<CTest>::iterator pIter;
    for( pIter=v.begin(); pIter!=v.end(); pIter++)
    {
        qDebug( "Value: %d", pIter->GetValue());
    }
}


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

    f1();
    
    return a.exec();
}
Я его для примера написал. :)
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 29.3.2024, 9:23