Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. As dynamic libraries to use class variables?
Forum Updated to NodeBB v4.3 + New Features

As dynamic libraries to use class variables?

Scheduled Pinned Locked Moved Solved General and Desktop
50 Posts 4 Posters 13.0k Views 3 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • M Offline
    M Offline
    Mikee
    wrote on last edited by
    #26

    I done this in strategycod.pro

    INCLUDEPATH = "C:/Qt/project/MyCandleSrick"  "C:/Qt/Qt5.9.2/5.9.2/Src/qtbase/include/QtWidgets"
    

    Now it included <QMainWindow>. But it isnt working now

    extern "C" {STRATEGYCODSHARED_EXPORT void StrategyCod(MainWinow * main);}
    

    and

    void StrategyCod(MainWinow * main)
    

    errors:
    C:\Qt\project\StrategyCod\strategycod.h:7: error: variable or field 'StrategyCod' declared void
    extern "C" {STRATEGYCODSHARED_EXPORT void StrategyCod(MainWinow * main);}
    ^
    C:\Qt\project\StrategyCod\strategycod.h:7: error: 'MainWinow' was not declared in this scope
    C:\Qt\project\StrategyCod\strategycod.h:7: error: 'main' was not declared in this scope
    extern "C" {STRATEGYCODSHARED_EXPORT void StrategyCod(MainWinow * main);}
    ^
    C:\Qt\project\StrategyCod\strategycod.cpp:9: оerror: variable or field 'StrategyCod' declared void
    void StrategyCod(MainWinow * main)
    ^
    C:\Qt\project\StrategyCod\strategycod.cpp:9: error: 'MainWinow' was not declared in this scope
    C:\Qt\project\StrategyCod\strategycod.cpp:9: error: 'main' was not declared in this scope
    void StrategyCod(MainWinow * main)

    1 Reply Last reply
    0
    • SGaistS Offline
      SGaistS Offline
      SGaist
      Lifetime Qt Champion
      wrote on last edited by
      #27

      Because when you do INCLUDEPATH = you replace the content of that variable with what follows. Use INCLUDEPATH += to append your folders to it.

      Interested in AI ? www.idiap.ch
      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

      1 Reply Last reply
      2
      • M Offline
        M Offline
        Mikee
        wrote on last edited by
        #28

        Now all includes are working.
        When I use function

        void StrategyCod(MainWindow * main)
        {
            //MainWindow w;
            main->NBar;
            qDebug()<<"Library work2"<<main->NBar;//<<w.NBar;
        }
        

        qDebug message is not a valid value NBar

        1 Reply Last reply
        0
        • M Offline
          M Offline
          Mikee
          wrote on last edited by
          #29

          I think that need to do reference class variable. But this code isn't working

          void StrategyCod(/*MainWindow * main*/)
          {
              long long &NBar1 =MainWindow.NBar;
              qDebug()<<"Library work2";//<<w.NBar;
          }
          
          

          How can i do reference?

          mrjjM 1 Reply Last reply
          0
          • M Mikee

            I think that need to do reference class variable. But this code isn't working

            void StrategyCod(/*MainWindow * main*/)
            {
                long long &NBar1 =MainWindow.NBar;
                qDebug()<<"Library work2";//<<w.NBar;
            }
            
            

            How can i do reference?

            mrjjM Offline
            mrjjM Offline
            mrjj
            Lifetime Qt Champion
            wrote on last edited by mrjj
            #30

            @Mikee

            via the parameter ( main or what u called it)

            void StrategyCod(MainWindow * main) {
                qDebug()<<"Library work2"<<main->NBar;
            }
            

            if NBAr is wrong, then something else is wrong. not the function
            it might be you call StrategyCod BEFORE setting it in mainwindow or
            something like that.

            1 Reply Last reply
            0
            • M Offline
              M Offline
              Mikee
              wrote on last edited by
              #31

              I checked:
              library:
              void StrategyCod(double Parametr)

              {
                  MainWindow *w;
                  qDebug()<<"Library work2"<<Parametr<<w->NBar;
              }
              

              main.cpp:

              QLibrary MyLib("C:\\Qt\\project\\build-StrategyCod-Desktop_Qt_5_9_2_MinGW_32bit-Debug\\debug\\StrategyCod");  
                  MyLib.load();
                  typedef void (*MyPrototype)();
                  MyPrototype StrategyCod = (MyPrototype) MyLib.resolve("StrategyCod");
                  qDebug()<<w.NBar;  //NBar=0 is hear 
                  StrategyCod();  //NBar=5943858560 is hear 
                  MyLib.unload();
              

              Maybe here typedef void (*MyPrototype)(); need append void (*MyPrototype)(class); ?

              mrjjM 1 Reply Last reply
              0
              • M Mikee

                I checked:
                library:
                void StrategyCod(double Parametr)

                {
                    MainWindow *w;
                    qDebug()<<"Library work2"<<Parametr<<w->NBar;
                }
                

                main.cpp:

                QLibrary MyLib("C:\\Qt\\project\\build-StrategyCod-Desktop_Qt_5_9_2_MinGW_32bit-Debug\\debug\\StrategyCod");  
                    MyLib.load();
                    typedef void (*MyPrototype)();
                    MyPrototype StrategyCod = (MyPrototype) MyLib.resolve("StrategyCod");
                    qDebug()<<w.NBar;  //NBar=0 is hear 
                    StrategyCod();  //NBar=5943858560 is hear 
                    MyLib.unload();
                

                Maybe here typedef void (*MyPrototype)(); need append void (*MyPrototype)(class); ?

                mrjjM Offline
                mrjjM Offline
                mrjj
                Lifetime Qt Champion
                wrote on last edited by
                #32

                @Mikee
                Yes it must all match.

                typedef void (*MyPrototype)();

                means pointer to function takes no parameters
                which is untrue.

                1 Reply Last reply
                0
                • M Offline
                  M Offline
                  Mikee
                  wrote on last edited by
                  #33

                  But what to do with NBar?

                  void StrategyCod()
                  {
                      MainWindow *w;
                      qDebug()<<"Library work2"<<w->NBar;
                    
                  }
                  
                  jsulmJ 1 Reply Last reply
                  0
                  • M Mikee

                    But what to do with NBar?

                    void StrategyCod()
                    {
                        MainWindow *w;
                        qDebug()<<"Library work2"<<w->NBar;
                      
                    }
                    
                    jsulmJ Offline
                    jsulmJ Offline
                    jsulm
                    Lifetime Qt Champion
                    wrote on last edited by
                    #34

                    @Mikee

                    typedef void (*MyPrototype)(MainWindow *w);
                    

                    https://forum.qt.io/topic/113070/qt-code-of-conduct

                    1 Reply Last reply
                    0
                    • M Offline
                      M Offline
                      Mikee
                      wrote on last edited by Mikee
                      #35

                      I have done this and it's working

                       QLibrary MyLib("C:\\Qt\\project\\build-StrategyCod-Desktop_Qt_5_9_2_MinGW_32bit-Debug\\debug\\StrategyCod");  
                          MyLib.load();
                          typedef void (*MyPrototype)(MainWindow *);
                          MyPrototype StrategyCod = (MyPrototype) MyLib.resolve("StrategyCod");
                          StrategyCod(&w);  
                          qDebug()<<"q1"<< q1;
                          MyLib.unload();
                      

                      Thank you

                      1 Reply Last reply
                      1
                      • mrjjM Offline
                        mrjjM Offline
                        mrjj
                        Lifetime Qt Champion
                        wrote on last edited by
                        #36

                        Congrats :)

                        1 Reply Last reply
                        1
                        • M Offline
                          M Offline
                          Mikee
                          wrote on last edited by
                          #37

                          I have are new problem.

                          qDebug()<<NBar;
                          

                          return NBar=1064,

                          qDebug()<<"Library work2"<< Parametr<<w->NBar;
                          

                          return NBar=0
                          In class MainWindow:

                          void MainWindow::on_ButtonRuneOne_clicked()//запуск стратегии на одном ядре
                          {
                              bool ok;
                              double d = QInputDialog::getDouble(this, tr("ParametrForStrategy"),
                                                                     tr("double:"), 37.56, -100000, 100000, 6, &ok);
                              if (ok) {ParametrForStrategyCod=d; }
                          
                              QLibrary MyLib("C:\\Qt\\project\\build-StrategyCod-Desktop_Qt_5_9_2_MinGW_32bit-Debug\\debug\\StrategyCod");  
                              MyLib.load();
                              typedef void (*MyPrototype)(double,MainWindow *);
                              MyPrototype StrategyCod = (MyPrototype) MyLib.resolve("StrategyCod");
                              MainWindow w;
                              qDebug()<<NBar;
                              StrategyCod(ParametrForStrategyCod,&w);  /
                              MyLib.unload();
                          }
                          

                          In library:

                          void StrategyCod(double Parametr, MainWindow *w)
                          {
                              qDebug()<<"Library work2"<< Parametr<<w->NBar;
                          }
                          

                          But in main.cpp it works good. How can I fix problem with link of object class?

                          1 Reply Last reply
                          0
                          • SGaistS Offline
                            SGaistS Offline
                            SGaist
                            Lifetime Qt Champion
                            wrote on last edited by
                            #38

                            You're passing w to your method which is not the current MainWindow object you are calling StrategyCod from.

                            Pass this to the method.

                            On a side note, you are doing some pretty convoluted stuff here for what seems to be a pretty simple task. I'd encourage you to re-think a bit the design of your application.

                            Interested in AI ? www.idiap.ch
                            Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                            1 Reply Last reply
                            3
                            • M Offline
                              M Offline
                              Mikee
                              wrote on last edited by
                              #39

                              Thank you. I wrote it like this

                              StrategyCod(ParametrForStrategyCod,this); 
                              

                              and it works

                              1 Reply Last reply
                              0
                              • M Offline
                                M Offline
                                Mikee
                                wrote on last edited by
                                #40

                                How can I create lamda function in the slot of the class?

                                
                                       QVector <double> Perebor1;
                                       for (double i=d1;i<=d2;i=i+d3) 
                                       {
                                           Perebor1.append(i);
                                       }
                                       QLibrary MyLib("C:\\Qt\\project\\build-StrategyCod-Desktop_Qt_5_9_2_MinGW_32bit-Debug\\debug\\StrategyCod");  
                                       MyLib.load();
                                       typedef void (*MyPrototype)(double,MainWindow *);
                                       MyPrototype StrategyCod = (MyPrototype) MyLib.resolve("StrategyCod");
                                       //StrategyCod(ParametrForStrategyCod,this);  
                                       QFuture<void> Perebor2 = QtConcurrent::map(Perebor1,[&](const double& d){ StrategyCod(d,this);}); 
                                       MyLib.unload();
                                
                                1 Reply Last reply
                                0
                                • M Offline
                                  M Offline
                                  Mikee
                                  wrote on last edited by Mikee
                                  #41

                                  And if I do, the function does not work.

                                  void StrategyCod(double Parametr, MainWindow *w)
                                  {
                                      qDebug()<<"Library work2"<< Parametr<<w->NBar;
                                      w->NBar=2000;
                                  }
                                  

                                  error:
                                  Invalid parameter passed to C runtime function.
                                  Invalid parameter passed to C runtime function.

                                  1 Reply Last reply
                                  0
                                  • mrjjM Offline
                                    mrjjM Offline
                                    mrjj
                                    Lifetime Qt Champion
                                    wrote on last edited by
                                    #42

                                    Well if Perebor2 still runs when you do MyLib.unload()
                                    its not so nice for it...

                                    1 Reply Last reply
                                    1
                                    • M Offline
                                      M Offline
                                      Mikee
                                      wrote on last edited by Mikee
                                      #43

                                      How to wait for all Perebor2?
                                      How to change w->NBar throw StrategyCod? If I do it in one thred

                                      void StrategyCod(double Parametr, MainWindow *w)
                                      {
                                          qDebug()<<"Library work2"<< Parametr<<w->NBar;
                                          w->NBar=2000;
                                      }
                                      

                                      it compiles, but when it works errors appears:
                                      ASSERT failure in QVector<T>::operator[]: "index out of range", file ....\Qt5.9.2\5.9.2\mingw53_32\include/QtCore/qvector.h, line 430
                                      Invalid parameter passed to C runtime function.
                                      Invalid parameter passed to C runtime function.

                                      mrjjM 1 Reply Last reply
                                      0
                                      • M Mikee

                                        How to wait for all Perebor2?
                                        How to change w->NBar throw StrategyCod? If I do it in one thred

                                        void StrategyCod(double Parametr, MainWindow *w)
                                        {
                                            qDebug()<<"Library work2"<< Parametr<<w->NBar;
                                            w->NBar=2000;
                                        }
                                        

                                        it compiles, but when it works errors appears:
                                        ASSERT failure in QVector<T>::operator[]: "index out of range", file ....\Qt5.9.2\5.9.2\mingw53_32\include/QtCore/qvector.h, line 430
                                        Invalid parameter passed to C runtime function.
                                        Invalid parameter passed to C runtime function.

                                        mrjjM Offline
                                        mrjjM Offline
                                        mrjj
                                        Lifetime Qt Champion
                                        wrote on last edited by mrjj
                                        #44

                                        @Mikee
                                        Dont wait for it.
                                        Just move the MyLib.unload(); to a better place.

                                        also if you have

                                        void mainwindow::somefunction {
                                        QVector <double> Perebor1;
                                        for (double i=d1;i<=d2;i=i+d3)
                                        {
                                        Perebor1.append(i);
                                        }
                                        QLibrary MyLib("C:\Qt\project\build-StrategyCod-Desktop_Qt_5_9_2_MinGW_32bit-Debug\debug\StrategyCod");
                                        MyLib.load();
                                        typedef void (*MyPrototype)(double,MainWindow *);
                                        MyPrototype StrategyCod = (MyPrototype) MyLib.resolve("StrategyCod");
                                        //StrategyCod(ParametrForStrategyCod,this);
                                        QFuture<void> Perebor2 = QtConcurrent::map(Perebor1,[&](const double& d){ StrategyCod(d,this);});
                                        MyLib.unload();
                                        } // Perebor1 is deleted here.

                                        Perebor1 also dies as its a local
                                        so make them member variables of the class
                                        and structure code better.

                                        1 Reply Last reply
                                        0
                                        • M Offline
                                          M Offline
                                          Mikee
                                          wrote on last edited by
                                          #45

                                          `Perebor in class ,MainWindow. It doesn't work. Errors are the same.
                                          ``
                                          for (double i=d1;i<=d2;i=i+d3)
                                          {
                                          Perebor.append(i);
                                          }

                                             QLibrary MyLib("C:\\Qt\\project\\build-StrategyCod-Desktop_Qt_5_9_2_MinGW_32bit-Debug\\debug\\StrategyCod");  
                                             MyLib.load();
                                             typedef void (*MyPrototype)(double,MainWindow *);
                                             MyPrototype StrategyCod = (MyPrototype) MyLib.resolve("StrategyCod");
                                             //StrategyCod(ParametrForStrategyCod,this);  
                                             //QFuture<void> Perebor2 = QtConcurrent::map(Perebor1,[&](const double& d){ StrategyCod(d,this);});  
                                             QFuture<void> Perebor2 = QtConcurrent::map(Perebor,[&](const double& d){ StrategyCod(d,this);});
                                          
                                          1 Reply Last reply
                                          0

                                          • Login

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • Users
                                          • Groups
                                          • Search
                                          • Get Qt Extensions
                                          • Unsolved