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.
  • 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 Online
                  jsulmJ Online
                  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
                                        • mrjjM Offline
                                          mrjjM Offline
                                          mrjj
                                          Lifetime Qt Champion
                                          wrote on last edited by
                                          #46

                                          What about Perebor2 ?
                                          Wont it suffer the same and run out of scope ?

                                          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