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

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

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Создаю библиотеку формата *.а  (Прочитано 17724 раз)
tiiL
Гость
« : Март 22, 2012, 14:08 »

Создаю библиотеку грубо говорят библиотека состоит из двух основных файлов

plot_fat.cpp:
Код:
#include <mainwindow.h> // здесь объявленна plot_first 
int   plot_fat ( int spec_qty, SPEC_DATA *s, CURVE *c )
{
 вычисления...
n= plot_first("передаются какие то параметры вычисления")

}

mainwindow.h:
Код:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H


#include <QtGui>
#include<QMainWindow>
//#include <qmainwindow.h>
#include <QMessageBox>
#include <QFile>
//#include <QtCore/QObject>

//хедеры qwt
#include <qwt_plot_canvas.h>
#include <qwt_plot_curve.h>
#include <qwt_plot_grid.h>
#include <qwt_symbol.h>
#include <qwt_scale_engine.h>
#include <qwt_legend.h>
//

namespace Ui{
    class MainWindow;
}
class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent =0 );
    ~MainWindow();
    void plot_fat();
    int plot_first(double AxisXmax,
                    double AxisXmin,
                    double AxisYmax,
                    double AxisYmin,
                    double errorX,
                    double *x, double *y,
                    const int N, int numberCurve);
    int plot_next(double *x, double *y,
                  const int N, int numberCurve);
    void showData(double *x, double *y,
                  /*double *x2, double *y2*/
                  const int N,int numberCurve);
    int i;

private:
    Ui::MainWindow *ui;
protected:
    QwtPlotGrid *grid;
    QwtPlotCurve *curv1,*curv2;
    QwtSymbol *symbol1, *symbol2;
    QwtLegend *leg;

    QMessageBox *error;

private slots:
    void on_Log10X_toggled();
    void on_Log10Y_toggled();

};
#endif // MAINWINDOW_H

и вылезают такие ошибки:

In file included from ..\..\Qt\2010.05\qt\include/QtCore/qshareddata.h:1,

 from ..\..\Qt\2010.05\qt\include/QtCore/../../src/corelib/tools/qsharedpointer.h:47,

 from ..\..\Qt\2010.05\qt\include/QtCore/qsharedpointer.h:1,

 from ..\..\Qt\2010.05\qt\include/QtGui/../../src/gui/image/qpixmap.h:49,

 from ..\..\Qt\2010.05\qt\include/QtGui/qpixmap.h:1,

 from ..\..\Qt\2010.05\qt\include/QtGui/../../src/gui/painting/qbrush.h:53,

 from ..\..\Qt\2010.05\qt\include/QtGui/qbrush.h:1,

 from ..\..\Qt\2010.05\qt\include/QtGui/../../src/gui/kernel/qpalette.h:47,

 from ..\..\Qt\2010.05\qt\include/QtGui/qpalette.h:1,

 from ..\..\Qt\2010.05\qt\include/QtGui/../../src/gui/kernel/qwidget.h:49,

 from ..\..\Qt\2010.05\qt\include/QtGui/qwidget.h:1,

 from ..\..\Qt\2010.05\qt\include/QtGui/../../src/gui/dialogs/qdialog.h:45,

 from ..\..\Qt\2010.05\qt\include/QtGui/qdialog.h:1,

 from ..\..\Qt\2010.05\qt\include\QtGui/../../src/gui/dialogs/qmessagebox.h:45,

 from ..\..\Qt\2010.05\qt\include\QtGui/qmessagebox.h:1,

 from ..\..\Qt\2010.05\qt\include\QtGui/QMessageBox:1,

 from ./mainwindow.h:8,

 from plot_fat.cpp:28:

..\..\Qt\2010.05\qt\include/QtCore/../../src/corelib/tools/qshareddata.h:165: error: expected identifier before '(' token
и этих ошибок 233 штуки.
как быть и что делать?
Записан
mutineer
Гость
« Ответ #1 : Март 22, 2012, 14:12 »

обратить внимание на указанные строки
Записан
tiiL
Гость
« Ответ #2 : Март 22, 2012, 14:44 »

обратил внимание, они берутся из стандартных библиотек QT, mainwindow.h это файл из отдельного приложения файлы, которого я включил в библиотеку, которую я создаю, приложение то работает отлично(
Записан
mutineer
Гость
« Ответ #3 : Март 22, 2012, 14:45 »

 from ./mainwindow.h:8,

 from plot_fat.cpp:28:

ити строки не из стандартных библиотек
Записан
tiiL
Гость
« Ответ #4 : Март 22, 2012, 15:15 »

в этих строках написанно
28-ая строка : #include "mainwindow.h"
7-ая строка #include <qmainwindow.h>
Записан
V1KT0P
Гость
« Ответ #5 : Март 22, 2012, 15:19 »

в этих строках написанно
28-ая строка : #include "mainwindow.h"
7-ая строка #include <qmainwindow.h>
Выложи минимальный проект с ошибкой, скорее всего где-то толи скобку не поставил, толи точку с запятой...
Записан
tiiL
Гость
« Ответ #6 : Март 22, 2012, 15:30 »

да всё что есть я выложил в первом посте  Грустный
Записан
mutineer
Гость
« Ответ #7 : Март 22, 2012, 15:35 »

да всё что есть я выложил в первом посте  Грустный

Если взять это "все, что есть", то оно не скомпилируется ни у кого

К тому же, как соотносятся между собой функции
int   plot_fat ( int spec_qty, SPEC_DATA *s, CURVE *c )
и
void MainWindow::plot_fat();
?


Что за функция n= plot_first("передаются какие то параметры вычисления") и где она описана?
« Последнее редактирование: Март 22, 2012, 15:37 от mutineer » Записан
tiiL
Гость
« Ответ #8 : Март 22, 2012, 15:47 »

отвечаю: была задача написать приложение которое рисует графики, а потом включить это приложение в библиотеку.

При написание программы для рисования графиков старался максимально приблизиться к структуре библиотеки, для того чтобы подключая приложение в библиотеку убирать переобъявление функции(в данном случаи plot_fat() ).

plot_first описанна в моем графическом приложении :
Код:
int MainWindow::plot_first (double AxisXmax, double AxisXmin, double AxisYmax, double AxisYmin, double errorX, double *x, double *y, const int N, int numberCurve)
{
////опре деление в каких осях рисовать в логарифмических или линейных
    //qDebug("1 i = %i", i);

    if(!ui->Log10X->isChecked () && !ui->Log10Y->isChecked ())
    {
        if(i == 1)
        {
            ui->myPlot->setAxisScaleEngine (QwtPlot::yLeft, new QwtLog10ScaleEngine);
            ui->myPlot->setAxisScaleEngine (QwtPlot::xBottom, new QwtLog10ScaleEngine);
            ui->Log10X->setChecked (true);
            ui->Log10Y->setChecked (true);
            AxisYmin=1;
            AxisXmin=1;
            if(errorX<0)
            {
                QMessageBox::warning (this,tr("Warning"),tr("There are negative values"));
            }
        }
        if(i == 2)
        {
            ui->myPlot->setAxisScaleEngine (QwtPlot::yLeft, new QwtLinearScaleEngine);
            ui->myPlot->setAxisScaleEngine (QwtPlot::xBottom, new QwtLinearScaleEngine);
        }
    }else
    {
        if(ui->Log10X->isChecked ()) AxisXmin=1;
        if(ui->Log10Y->isChecked ()) AxisYmin=1;
    }

    ui->myPlot->setAxisTitle(
        QwtPlot::xBottom,QString::fromLocal8Bit("X"));
    ui->myPlot->setAxisScale(QwtPlot::xBottom, AxisXmin, AxisXmax);

    ui->myPlot->setAxisTitle(
        QwtPlot::yLeft,QString::fromLocal8Bit("Y"));
    ui->myPlot->setAxisScale(QwtPlot::yLeft, AxisYmin, AxisYmax);

    showData(x,y,N,numberCurve);

    ui->myPlot->replot ();
    return 0;
}


компилятор ругается в тот момент когда я в файле plot_fat(), пытаюсь include <mainwindow.h> и пошло поехало по всем инклудам... на сами функции не ругается...
Записан
mutineer
Гость
« Ответ #9 : Март 22, 2012, 15:51 »

plot_fat.cpp:
Код:
#include <mainwindow.h> // здесь объявленна plot_first 
int   plot_fat ( int spec_qty, SPEC_DATA *s, CURVE *c )
{
 вычисления...
n= plot_first("передаются какие то параметры вычисления")

}

plot_fat не является членом MainWindow. почему она вызвает plot_first без объекта класса MainWindow?

Выложи проект, который можно скачать и попробовать скомпилировать
Записан
tiiL
Гость
« Ответ #10 : Март 23, 2012, 08:27 »

Выкладывать очень много придетья, чтобы облегчить отладку сделал вот так

создал программу, поместив в неё функцию plot_fat() из основной программы, а свою программу grathQWT собираю как статическую библиотеку.

Код:
#include <QtCore/QCoreApplication>
#include <math.h>
#include <mainwindow.h>

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

    const int N = 13;
    int n;
    int numberCurve;

    double x[N+1]={1,2,3,6,8,9,11,12,13,14,18,21,22};
    //double x[N+1]={-10,-7,-6,-5,-4, -2,-1,0, 2,3,6,9,10};
    double y[N+1];
    double x2[N+1];
    double y2[N+1];
    double AxisXmax = 0;
    double AxisXmin = 0;
    double AxisYmax = 0;
    double AxisYmin = 0;
    double errorX;
    for(int k = 0; k < N; k++ )
    {

    y[k]=exp(x[k]); //первый график

    x2[k]= x[k]+ 2;
    y2[k]=x2[k]*x[k] + 3 * x2[k];  //exp(x2[k]); //второй график

//определяем минимум макимум х и у
    if(x[k] > AxisXmax) AxisXmax = x[k];

    if(x[k] < AxisXmin) AxisXmin = x[k];

    if(y[k] < AxisYmin) AxisYmin = y[k];

    if(y[k] > AxisYmax) AxisYmax = y[k];

    if(x[k] < 0 ) errorX = x[k];
    }

    numberCurve = 1;

    n = MainWindow::plot_first(AxisXmax,AxisXmin,AxisYmax,AxisYmin,errorX,x,y,N,numberCurve);
//    if( n == 0 )
//    {
//        numberCurve++;
//        for(int k=0; k < N; k++)
//        {
//        x[k]=x2[k];
//        y[k]=y2[k];
//        }
//        n = plot_next(x,y,N,numberCurve);
//    }

    return a.exec();
}

grathQWT:
Код:
#include "mainwindow.h"
#include "dialog.h"
#include <ui_qwtplot.h>
#include <ui_dialog.h>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent),
    ui(new Ui::MainWindow)
{   
    ui->setupUi (this);
    ui->myPlot->setTitle (QString::fromLocal8Bit ("Графики"));

    grid = new QwtPlotGrid;
    grid->enableXMin (true);
    grid->enableYMin (true);

    grid->setMajPen (QPen(Qt::black,0,Qt::DotLine));
    grid->setMinPen (QPen(Qt::gray,0,Qt::DotLine));
    grid->attach (ui->myPlot);

    ui->myPlot->canvas ()->setCursor (Qt::ArrowCursor);

    curv1 = new QwtPlotCurve(QString::fromLocal8Bit("exp(x)"));
    curv1->setRenderHint(QwtPlotItem::RenderAntialiased);
    curv1->setPen(QPen(Qt::red));

    symbol1 = new QwtSymbol();
    symbol1->setStyle (QwtSymbol::Ellipse);
    symbol1->setPen (QColor(Qt::black));
    symbol1->setSize (5);
    curv1->setSymbol (symbol1);

    curv2 = new QwtPlotCurve(QString::fromLocal8Bit ("X*X+3X"));
    curv2->setRenderHint (QwtPlotItem::RenderAntialiased);
    curv2->setPen (QPen(Qt::green));

    symbol2 = new QwtSymbol();
    symbol2->setStyle (QwtSymbol::Rect);
    symbol2->setPen (QColor(Qt::blue));
    symbol2->setSize (5);
    curv2->setSymbol (symbol2);

    leg = new QwtLegend();
    leg->setItemMode(QwtLegend::ReadOnlyItem);
    ui->myPlot->insertLegend(leg,QwtPlot::TopLegend);

    //plot_fat();

    ui->myPlot->replot ();

}

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

//void MainWindow::plot_fat ()
//{
//    const int N = 13;
//    int n;
//    int numberCurve;

//    double x[N+1]={1,2,3,6,8,9,11,12,13,14,18,21,22};
//    //double x[N+1]={-10,-7,-6,-5,-4, -2,-1,0, 2,3,6,9,10};
//    double y[N+1];
//    double x2[N+1];
//    double y2[N+1];
//    double AxisXmax = 0;
//    double AxisXmin = 0;
//    double AxisYmax = 0;
//    double AxisYmin = 0;
//    double errorX;
//    for(int k = 0; k < N; k++ )
//    {

//    y[k]=exp(x[k]); //первый график

//    x2[k]= x[k]+ 2;
//    y2[k]=x2[k]*x[k] + 3 * x2[k];  //exp(x2[k]); //второй график

////определяем минимум макимум х и у
//    if(x[k] > AxisXmax) AxisXmax = x[k];

//    if(x[k] < AxisXmin) AxisXmin = x[k];

//    if(y[k] < AxisYmin) AxisYmin = y[k];

//    if(y[k] > AxisYmax) AxisYmax = y[k];

//    if(x[k] < 0 ) errorX = x[k];
//    }

//    numberCurve = 1;

//    n = plot_first(AxisXmax,AxisXmin,AxisYmax,AxisYmin,errorX,x,y,N,numberCurve);
//    if( n == 0 )
//    {
//        numberCurve++;
//        for(int k=0; k < N; k++)
//        {
//        x[k]=x2[k];
//        y[k]=y2[k];
//        }
//        n = plot_next(x,y,N,numberCurve);
//    }

//}
int MainWindow::plot_first (double AxisXmax, double AxisXmin, double AxisYmax, double AxisYmin, double errorX, double *x, double *y, const int N, int numberCurve)
{
////опре деление в каких осях рисовать в логарифмических или линейных
    //qDebug("1 i = %i", i);

    if(!ui->Log10X->isChecked () && !ui->Log10Y->isChecked ())
    {
        if(i == 1)
        {
            ui->myPlot->setAxisScaleEngine (QwtPlot::yLeft, new QwtLog10ScaleEngine);
            ui->myPlot->setAxisScaleEngine (QwtPlot::xBottom, new QwtLog10ScaleEngine);
            ui->Log10X->setChecked (true);
            ui->Log10Y->setChecked (true);
            AxisYmin=1;
            AxisXmin=1;
            if(errorX<0)
            {
                QMessageBox::warning (this,tr("Warning"),tr("There are negative values"));
            }
        }
        if(i == 2)
        {
            ui->myPlot->setAxisScaleEngine (QwtPlot::yLeft, new QwtLinearScaleEngine);
            ui->myPlot->setAxisScaleEngine (QwtPlot::xBottom, new QwtLinearScaleEngine);
        }
    }else
    {
        if(ui->Log10X->isChecked ()) AxisXmin=1;
        if(ui->Log10Y->isChecked ()) AxisYmin=1;
    }

    ui->myPlot->setAxisTitle(
        QwtPlot::xBottom,QString::fromLocal8Bit("X"));
    ui->myPlot->setAxisScale(QwtPlot::xBottom, AxisXmin, AxisXmax);

    ui->myPlot->setAxisTitle(
        QwtPlot::yLeft,QString::fromLocal8Bit("Y"));
    ui->myPlot->setAxisScale(QwtPlot::yLeft, AxisYmin, AxisYmax);

    showData(x,y,N,numberCurve);

    ui->myPlot->replot ();
    return 0;
}

int MainWindow::plot_next (double *x, double *y, const int N, int numberCurve)
{
    showData(x,y,N, numberCurve);
    ui->myPlot->replot ();
    return 1;
}

void MainWindow::showData (double *x, double *y, const int N, int numberCurve)
{
    if(numberCurve == 1)
    {
        curv1->setSamples (x,y,N);
        curv1->attach (ui->myPlot);
    }else{
    curv2->setSamples (x,y,N);
    curv2->attach (ui->myPlot);
    }
}

void MainWindow::on_Log10Y_toggled()
{
    if(ui->Log10Y->isChecked ())
    {
        ui->myPlot->setAxisScaleEngine (QwtPlot::yLeft,new QwtLog10ScaleEngine);
        //plot_fat();
    }else
    {
        ui->myPlot->setAxisScaleEngine (QwtPlot::yLeft,new QwtLinearScaleEngine);
       // plot_fat();
    }
}

void MainWindow::on_Log10X_toggled()
{
    if(ui->Log10X->isChecked ())
    {
        ui->myPlot->setAxisScaleEngine (QwtPlot::xBottom,new QwtLog10ScaleEngine);
        //plot_fat();
    }else
    {
        ui->myPlot->setAxisScaleEngine (QwtPlot::xBottom,new QwtLinearScaleEngine);
        //plot_fat();
    }
}
та старая ошибка пропала

появилась ошибка main.cpp:45: error: cannot call member function 'int MainWindow::plot_first(double, double, double, double, double, double*, double*, int, int)' without object
Записан
lighting
Гость
« Ответ #11 : Март 23, 2012, 09:11 »

появилась ошибка main.cpp:45: error: cannot call member function 'int MainWindow::plot_first(double, double, double, double, double, double*, double*, int, int)' without object
Собственно о чем тебе mutineer и говорил в предыдущем сообщении
Записан
tiiL
Гость
« Ответ #12 : Март 23, 2012, 09:41 »



Цитировать
появилась ошибка main.cpp:45: error: cannot call member function 'int MainWindow::plot_first(double, double, double, double, double, double*, double*, int, int)' without object
Собственно о чем тебе mutineer и говорил в предыдущем сообщении

Хорошо, но как бороться с этой ошибкой ?
Записан
mutineer
Гость
« Ответ #13 : Март 23, 2012, 11:31 »



Цитировать
появилась ошибка main.cpp:45: error: cannot call member function 'int MainWindow::plot_first(double, double, double, double, double, double*, double*, int, int)' without object
Собственно о чем тебе mutineer и говорил в предыдущем сообщении

Хорошо, но как бороться с этой ошибкой ?

Способ борьбы с этой ошибкой очень стар и очевиден - идти учить C++
Записан
tiiL
Гость
« Ответ #14 : Март 23, 2012, 13:22 »

Спасибо, за тапок в рыло!
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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