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
    #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
                                      • 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
                                        • M Offline
                                          M Offline
                                          Mikee
                                          wrote on last edited by
                                          #47

                                          No. It's okey with Perebor2. Function StrategyCod2 is in class MainWindow works correctly.

                                          for (double i=d1;i<=d2;i=i+d3) 
                                                 {
                                                     Perebor.append(i);
                                                 }
                                          
                                                 QFuture<void> Perebor2 = QtConcurrent::map(Perebor,[this](const double& d){ StrategyCod2(d);});
                                          
                                          mrjjM 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