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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Так и не понял куда задать свой вопрос, поэтому задам сюда.  (Прочитано 14230 раз)
vfrcbvrf23
Гость
« : Апрель 11, 2016, 23:24 »

Возник вопрос при постройке графика при помощи qcustomplot. Она,проблема, заключается в том что, какой бы я график не пытался построить, всегда уходит в точку(0;0).
При постройке y=5, получаю вот такой результат:
http://c2n.me/3wNhOMT(не понял как вставить картинку)

И вот собственно код, как это происходит:
Код:
void MainWindow::on_pushButton_27_clicked()//кнопка построения первой производной введенной пользователем
{
    char* p = new char(ui->lineEdit_3->text().length() + 1);
    strcpy(p, ui->lineEdit_3->text().toUtf8().constData());
    functparcer funct1 = functparcer(p);
    double dlina = ui->lineEdit_2->text().toDouble();
    double a = -dlina; //Начало интервала, где рисуем график по оси Ox
    double b = dlina+1; //Конец интервала, где рисуем график по оси Ox
    double h = 0.001; //Шаг, с которым будем пробегать по оси Ox
    int n=10*((b-a)/h + 1); //Вычисляем количество точек, которые будем отрисовывать
    QVector<double> x(n), y(n); //Массивы координат точек
    //Вычисляем наши данные
    int i=0;
    for (double X=a; X<=b; X+=h)
    {
        x[i]=X;
        y[i]=funct1.getY(X);
        i++;
    }
    ui->widget->addGraph();
    ui->widget->graph(0)->setData(x, y);
    ui->widget->graph(0)->setPen(QColor(0, 0, 250, 255));
    ui->widget->xAxis->setLabel("x");
    ui->widget->yAxis->setLabel("y");
    ui->widget->xAxis->setRange(-dlina, dlina);//Для оси Ox
    ui->widget->yAxis->setRange(-dlina, dlina);//Для оси Oy
    ui->widget->replot();//И перерисуем график на нашем widget
}
как от этого избавиться?
« Последнее редактирование: Апрель 11, 2016, 23:30 от vfrcbvrf23 » Записан
juvf
Программист
*****
Offline Offline

Сообщений: 570


Просмотр профиля
« Ответ #1 : Апрель 12, 2016, 09:52 »

наверно нужно разбираться вот с этим
functparcer funct1 = functparcer(p);
и с этим
funct1.getY(X);

из кода не видно, что строиться график у=5. попробуйте для начала так

Код:
    //Вычисляем наши данные
    int i=0;
    for (double X=a; X<=b; X+=h)
    {
        x[i]=X;
        y[i]=5;
        i++;
    }

Если график будет нормальный, то ковыряйте functparcer.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #2 : Апрель 12, 2016, 09:54 »

наверно нужно разбираться вот с этим
Не, начать нужно еще с этого: Улыбающийся
Код
C++ (Qt)
char* p = new char(ui->lineEdit_3->text().length() + 1);
 
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #3 : Апрель 12, 2016, 10:46 »

Цитировать
    char* p = new char(ui->lineEdit_3->text().length() + 1);
    strcpy(p, ui->lineEdit_3->text().toUtf8().constData());

вообще адище Грустный

имхо хватит вызова functparcer(ui->lineEdit_3->text().toUtf8().constData());
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
vfrcbvrf23
Гость
« Ответ #4 : Апрель 12, 2016, 12:29 »

Цитировать
   char* p = new char(ui->lineEdit_3->text().length() + 1);
    strcpy(p, ui->lineEdit_3->text().toUtf8().constData());

вообще адище Грустный

имхо хватит вызова functparcer(ui->lineEdit_3->text().toUtf8().constData());
При таком написании выдает ошибку:
D:\QT\kurc\mainwindow.cpp:129: ошибка: invalid conversion from 'const char*' to 'char*' [-fpermissive]
     functparcer(ui->lineEdit_3->text().toUtf8().constData());
Именно из-за этой ошибки все было сделано так как оно есть, ибо по другому реализовать не получалось

                                                           ^
« Последнее редактирование: Апрель 12, 2016, 12:31 от vfrcbvrf23 » Записан
vfrcbvrf23
Гость
« Ответ #5 : Апрель 12, 2016, 12:30 »

наверно нужно разбираться вот с этим
functparcer funct1 = functparcer(p);
и с этим
funct1.getY(X);

из кода не видно, что строиться график у=5. попробуйте для начала так

Код:
    //Вычисляем наши данные
    int i=0;
    for (double X=a; X<=b; X+=h)
    {
        x[i]=X;
        y[i]=5;
        i++;
    }

Если график будет нормальный, то ковыряйте functparcer.

График не изменился, все осталось точно так же.(http://clip2net.com/s/3wOhAeR)
Записан
vfrcbvrf23
Гость
« Ответ #6 : Апрель 12, 2016, 12:35 »

наверно нужно разбираться вот с этим
Не, начать нужно еще с этого: Улыбающийся
Код
C++ (Qt)
char* p = new char(ui->lineEdit_3->text().length() + 1);
 
Что вы имеете ввиду? Я просто перепробовал уже уйму всего и все равно не могу понять в чем проблема.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #7 : Апрель 12, 2016, 12:41 »

Что вы имеете ввиду? Я просто перепробовал уже уйму всего и все равно не могу понять в чем проблема.
Здесь вы выделяете в куче ОДИН байт и инициализируете его длиной строки.
Код
C++ (Qt)
char* p = new char(ui->lineEdit_3->text().length() + 1);
 

Следующее копирование разрушает (затирает) память кучи и включает "режим чудес". Дальше может происходит много странного: от падения программы и до вычисления неверных результатов.

Если вы хотели выделить буфер для хранения всей строки из lineEdit_3, то нужно делать так:
Код
C++ (Qt)
char* p = new char[ ui->lineEdit_3->text().length() + 1 ];
 

P.S. Вряд ли вы "далеко уедите" методом тыка. C++ это не тот язык. Подмигивающий
« Последнее редактирование: Апрель 12, 2016, 12:44 от Old » Записан
vfrcbvrf23
Гость
« Ответ #8 : Апрель 12, 2016, 12:51 »

Что вы имеете ввиду? Я просто перепробовал уже уйму всего и все равно не могу понять в чем проблема.
Здесь вы выделяете в куче ОДИН байт и инициализируете его длиной строки.
Код
C++ (Qt)
char* p = new char(ui->lineEdit_3->text().length() + 1);
 

Следующее копирование разрушает (затирает) память кучи и включает "режим чудес". Дальше может происходит много странного: от падения программы и до вычисления неверных результатов.

Если вы хотели выделить буфер для хранения всей строки из lineEdit_3, то нужно делать так:
Код
C++ (Qt)
char* p = new char[ ui->lineEdit_3->text().length() + 1 ];
 

P.S. Вряд ли вы "далеко уедите" методом тыка. C++ это не тот язык. Подмигивающий
Это не дало никаких результатов, строится точно так же.

Я просто только начинаю изучать программирование, и меня привлекла сама среда Qt. А в плане обучения руководителем была поставлена задача реализовать построение графиков, вводимых пользователем. И вот я над ней бьюсь уже больше месяца, но сделать ничего самому не удалось с проблемой, поэтому решил вот попросить помощи у более умных людей.
Записан
juvf
Программист
*****
Offline Offline

Сообщений: 570


Просмотр профиля
« Ответ #9 : Апрель 12, 2016, 13:21 »


от сюда взят пример. уберите весь бред в начале функции и сделайте так

Код:
void MainWindow::on_pushButton_27_clicked()//кнопка построения первой производной введенной пользователем
{
// generate some data:
QVector<double> x(101), y(101); // initialize with entries 0..100
for (int i=0; i<101; ++i)
{
  x[i] = i/50.0 - 1; // x goes from -1 to 1
  y[i] = x[i]*x[i]; // let's plot a quadratic function
}
// create graph and assign data to it:
ui->widget->addGraph();
ui->widget->graph(0)->setData(x, y);
// give the axes some labels:
ui->widget->xAxis->setLabel("x");
ui->widget->yAxis->setLabel("y");
// set axes ranges, so we see all data:
ui->widget->xAxis->setRange(-1, 1);
ui->widget->yAxis->setRange(0, 1);
ui->widget->replot();
}
будет парабола, изкаропки. потом сделайте ваш у=5

Код:
void MainWindow::on_pushButton_27_clicked()//кнопка построения первой производной введенной пользователем
{
// generate some data:
QVector<double> x(101), y(101); // initialize with entries 0..100
for (int i=0; i<101; ++i)
{
  x[i] = i/50.0 - 1; // x goes from -1 to 1
  y[i] = 5; // let's plot a quadratic function
}
// create graph and assign data to it:
ui->widget->addGraph();
ui->widget->graph(0)->setData(x, y);
// give the axes some labels:
ui->widget->xAxis->setLabel("x");
ui->widget->yAxis->setLabel("y");
// set axes ranges, so we see all data:
ui->widget->xAxis->setRange(-1, 1);
ui->widget->yAxis->setRange(0, 1);
ui->widget->replot();
}
Должны увидеть прямую без захода в 0,0. Дальше этот пример добавляйте вашим кодом....

Цитировать
Я просто только начинаю изучать программирование
вы меня извините, но как-то написано всё... неочевидно. индусский код, одним словом.
цикл заполнения
Код:
  //Вычисляем наши данные
    for (int i = 0; i<n; i++)
    {
        x[i] = a + h*i;//и вообще уберите a и b. они не нужны. сделайте так x[i] = h*i - dlina ;
        y[i] = 5;// или funct1.getY(x[i]);
    }

double dlina = ui->lineEdit_2->text().toDouble(); в Qt есть виджет для таких целей  QDoubleSpinBox и QSpinBox
double dlina = ui->doubleSpinBox->value();

Код:
int n=10*((b-a)/h + 1); //Вычисляем количество точек, которые будем отрисовывать
vs
Код:
for (double X=a; X<=b; X+=h)
допустим длинну ввели 10, т.е. dlina = 10.0. Считаем сколько будет n? n = 10*( 1 +   (11-(-10))/0.001)  ) = 210010. Далее создаются два вектора размером в 210 тыщ! но в цикле for вы всего заполняете первые 21000 элементов этих векторов. Судя по всему должно быть так
int n= dlina*2/h; ну или так int n= 1 + dlina*2/h;
Записан
juvf
Программист
*****
Offline Offline

Сообщений: 570


Просмотр профиля
« Ответ #10 : Апрель 12, 2016, 13:33 »

Цитировать
char* p = new char ....
а тут утечка памяти.... где delete?
Записан
juvf
Программист
*****
Offline Offline

Сообщений: 570


Просмотр профиля
« Ответ #11 : Апрель 12, 2016, 13:48 »

Цитировать
   char* p = new char(ui->lineEdit_3->text().length() + 1);
    strcpy(p, ui->lineEdit_3->text().toUtf8().constData());

вообще адище Грустный

имхо хватит вызова functparcer(ui->lineEdit_3->text().toUtf8().constData());
При таком написании выдает ошибку:
D:\QT\kurc\mainwindow.cpp:129: ошибка: invalid conversion from 'const char*' to 'char*' [-fpermissive]
     functparcer(ui->lineEdit_3->text().toUtf8().constData());
Именно из-за этой ошибки все было сделано так как оно есть, ибо по другому реализовать не получалось

                                                           ^
Как объявлена функция functparcer()? Очевидно, что в неё передается указатель на строку для разбора, а не для того, чтобы изменить эту строку. Поэтому нужно объявлять с константным аргументом functparcer(const char *p), тогда можно передать константный указатель functparcer(ui->lineEdit_3->text().toUtf8().constData());
Записан
vfrcbvrf23
Гость
« Ответ #12 : Апрель 12, 2016, 13:55 »

Код:
void MainWindow::on_pushButton_27_clicked()//кнопка построения первой производной введенной пользователем
{
// generate some data:
QVector<double> x(101), y(101); // initialize with entries 0..100
for (int i=0; i<101; ++i)
{
  x[i] = i/50.0 - 1; // x goes from -1 to 1
  y[i] = x[i]*x[i]; // let's plot a quadratic function
}
// create graph and assign data to it:
ui->widget->addGraph();
ui->widget->graph(0)->setData(x, y);
// give the axes some labels:
ui->widget->xAxis->setLabel("x");
ui->widget->yAxis->setLabel("y");
// set axes ranges, so we see all data:
ui->widget->xAxis->setRange(-1, 1);
ui->widget->yAxis->setRange(0, 1);
ui->widget->replot();
}
будет парабола, изкаропки. потом сделайте ваш у=5

Код:
void MainWindow::on_pushButton_27_clicked()//кнопка построения первой производной введенной пользователем
{
// generate some data:
QVector<double> x(101), y(101); // initialize with entries 0..100
for (int i=0; i<101; ++i)
{
  x[i] = i/50.0 - 1; // x goes from -1 to 1
  y[i] = 5; // let's plot a quadratic function
}
// create graph and assign data to it:
ui->widget->addGraph();
ui->widget->graph(0)->setData(x, y);
// give the axes some labels:
ui->widget->xAxis->setLabel("x");
ui->widget->yAxis->setLabel("y");
// set axes ranges, so we see all data:
ui->widget->xAxis->setRange(-1, 1);
ui->widget->yAxis->setRange(0, 1);
ui->widget->replot();
}
Должны увидеть прямую без захода в 0,0. Дальше этот пример добавляйте вашим кодом....
Код:
  //Вычисляем наши данные
    for (int i = 0; i<n; i++)
    {
        x[i] = a + h*i;//и вообще уберите a и b. они не нужны. сделайте так x[i] = h*i - dlina ;
        y[i] = 5;// или funct1.getY(x[i]);
    }

double dlina = ui->lineEdit_2->text().toDouble(); в Qt есть виджет для таких целей  QDoubleSpinBox и QSpinBox
double dlina = ui->doubleSpinBox->value();


Сделал все как вы сказали вот тут.
При построении он выдал примерно следующее
http://c2n.me/3wOANdZ(вот синенькая черточка это результат)
Записан
juvf
Программист
*****
Offline Offline

Сообщений: 570


Просмотр профиля
« Ответ #13 : Апрель 12, 2016, 13:57 »

а почему на картинке от -10 до 10 график? в коде рэндж ставиться ui->widget->xAxis->setRange(-1, 1);
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #14 : Апрель 12, 2016, 13:58 »

Код
C++ (Qt)
char* p = new char[ ui->lineEdit_3->text().length() + 1 ];
 

Кажется, этого недостаточно для отключения "режима чудес". Там далее следует
Код
C++ (Qt)
strcpy(p, ui->lineEdit_3->text().toUtf8().constData());
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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