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. How to call a variable defined in one function in another function
Forum Updated to NodeBB v4.3 + New Features

How to call a variable defined in one function in another function

Scheduled Pinned Locked Moved Unsolved General and Desktop
15 Posts 5 Posters 4.3k Views 4 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.
  • F Fred Barclay
    7 Sept 2016, 22:53

    @mrjj Would this be correct?

    void Taz::on_chooseButton_clicked()
    {
        QFileDialog dialog(this);
        dialog.setViewMode(QFileDialog::Detail);
        dialog.setFileMode(QFileDialog::ExistingFiles);
        QStringList fileNames;
        if (dialog.exec())
            fileNames = dialog.selectedFiles();
        for (int i = 0; i < fileNames.size(); ++i)
            cout << fileNames.at(i);
    }
    

    ...

    void Taz::on_shredButton_clicked()
    {
         QProcess process;
        process.start("srm" <<cout );
    }
    

    Currently when I try to make this I get an error:

    g++ -c -pipe -O2 -std=gnu++0x -Wall -W -D_REENTRANT -fPIC -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I. -I/opt/Qt/5.6/gcc_64/include -I/opt/Qt/5.6/gcc_64/include/QtWidgets -I/opt/Qt/5.6/gcc_64/include/QtGui -I/opt/Qt/5.6/gcc_64/include/QtCore -I. -I. -I/opt/Qt/5.6/gcc_64/mkspecs/linux-g++ -o taz.o taz.cpp
    taz.cpp: In member function ‘void Taz::on_chooseButton_clicked()’:
    taz.cpp:40:9: error: ‘cout’ was not declared in this scope
             cout << fileNames.at(i);
             ^
    Makefile:945: recipe for target 'taz.o' failed
    make: *** [taz.o] Error 1
    

    How should I declare cout?

    Thanks!

    J Offline
    J Offline
    jeremy_k
    wrote on 8 Sept 2016, 00:00 last edited by
    #4

    @Fred-Barclay said in How to call a variable defined in one function in another function:

    taz.cpp: In member function ‘void Taz::on_chooseButton_clicked()’:
    taz.cpp:40:9: error: ‘cout’ was not declared in this scope
    cout << fileNames.at(i);
    ^
    Makefile:945: recipe for target 'taz.o' failed
    make: *** [taz.o] Error 1

    
    How should I declare cout?
    

    #include <iostream> and change the reference to std::cout to fix the error reported by the compiler, but that's not going to produce useful results. cout is an output file stream. cout << fileName.at(i) will write one file name at a time to standard output, without a newline or space to separate them. The commented-out process.start("srm" <<cout ) definitely isn't right.

    You may want to find a basic C++ tutorial such as http://www.cplusplus.com/doc/tutorial/classes/

    Asking a question about code? http://eel.is/iso-c++/testcase/

    F 1 Reply Last reply 8 Sept 2016, 00:12
    0
    • J jeremy_k
      8 Sept 2016, 00:00

      @Fred-Barclay said in How to call a variable defined in one function in another function:

      taz.cpp: In member function ‘void Taz::on_chooseButton_clicked()’:
      taz.cpp:40:9: error: ‘cout’ was not declared in this scope
      cout << fileNames.at(i);
      ^
      Makefile:945: recipe for target 'taz.o' failed
      make: *** [taz.o] Error 1

      
      How should I declare cout?
      

      #include <iostream> and change the reference to std::cout to fix the error reported by the compiler, but that's not going to produce useful results. cout is an output file stream. cout << fileName.at(i) will write one file name at a time to standard output, without a newline or space to separate them. The commented-out process.start("srm" <<cout ) definitely isn't right.

      You may want to find a basic C++ tutorial such as http://www.cplusplus.com/doc/tutorial/classes/

      F Offline
      F Offline
      Fred Barclay
      wrote on 8 Sept 2016, 00:12 last edited by Fred Barclay 9 Aug 2016, 00:15
      #5

      @jeremy_k Thanks - I'll read this more thoroughly in a moment, but the commented-out process.start("srm" <<cout ) is a typo. Fixing now. :)

      1 Reply Last reply
      0
      • M Offline
        M Offline
        mrjj
        Lifetime Qt Champion
        wrote on 8 Sept 2016, 06:03 last edited by mrjj 9 Aug 2016, 06:33
        #6

        hi
        Just a note:
        The arguments for QProcess should be put in a list

        //Example
        QString program = "./path/to/srm";
        QStringList arguments;
        arguments << "file1" << "file 2";
        QProcess myProcess(parent);
        myProcess.start(program, arguments);

        since fileNames is such list, you can use it directly.
        as in
        myProcess.start(program, fileNames );

        Also sorry for cout. what just to write out the names to check
        for (int i = 0; i < fileNames.size(); ++i)
        cout << fileNames.at(i); // <<< this prints the entry [i] from the list

        F 1 Reply Last reply 8 Sept 2016, 20:46
        2
        • M mrjj
          8 Sept 2016, 06:03

          hi
          Just a note:
          The arguments for QProcess should be put in a list

          //Example
          QString program = "./path/to/srm";
          QStringList arguments;
          arguments << "file1" << "file 2";
          QProcess myProcess(parent);
          myProcess.start(program, arguments);

          since fileNames is such list, you can use it directly.
          as in
          myProcess.start(program, fileNames );

          Also sorry for cout. what just to write out the names to check
          for (int i = 0; i < fileNames.size(); ++i)
          cout << fileNames.at(i); // <<< this prints the entry [i] from the list

          F Offline
          F Offline
          Fred Barclay
          wrote on 8 Sept 2016, 20:46 last edited by
          #7

          @mrjj Would this be correct? I'm just trying to get the contents of fileName echoed into a text file - before I try calling srm -r fileNames with another button.

          void Taz::on_chooseButton_clicked()
          {
          // New behavior
              QFileDialog dialog(this);
              dialog.setViewMode(QFileDialog::Detail);
              dialog.setFileMode(QFileDialog::ExistingFiles);
              QStringList fileNames;
              if (dialog.exec())
                  fileNames = dialog.selectedFiles();
          
              QObject *parent;
              QString program = "/bin/echo";
              QStringList arguments;
              arguments << "fileNames" << ">> /home/fred/fn.txt";
              QProcess *myProcess = new QProcess(parent);
              myProcess->start(program, arguments);
          
          }
          

          When compiling with make I get a warning:

          taz.cpp: In member function ‘void Taz::on_chooseButton_clicked()’:
          taz.cpp:41:46: warning: ‘parent’ may be used uninitialized in this function [-Wmaybe-uninitialized]
               QProcess *myProcess = new QProcess(parent);
          

          The GUI does finish compiling, though. However, nothing is echoed into /home/fred/fn.txt. :(
          Thanks!

          1 Reply Last reply
          0
          • M Offline
            M Offline
            mrjj
            Lifetime Qt Champion
            wrote on 8 Sept 2016, 20:56 last edited by
            #8

            Hi
            well, this is not ok.
            QObject *parent;
            ..
            QProcess *myProcess = new QProcess(parent);
            as parent is a dangling pointer so its invalid to do.
            ( its just points to random location)
            ( that is what it means with warning: ‘parent’ may be used uninitialized)
            so just use
            QProcess *myProcess = new QProcess(this); // this being Taz ( mainwinow i guess)

            also, you are not really processing the list
            but you should get "fileNames" in the fn.txt?

            maybe you can do
            fileNames << ">> /home/fred/fn.txt";
            and
            myProcess->start(program, fileNames );

            But in any case
            "fileNames" do not expand to the real list as it would in say bash.
            it just is text. like "hello".

            F 1 Reply Last reply 8 Sept 2016, 21:14
            0
            • M mrjj
              8 Sept 2016, 20:56

              Hi
              well, this is not ok.
              QObject *parent;
              ..
              QProcess *myProcess = new QProcess(parent);
              as parent is a dangling pointer so its invalid to do.
              ( its just points to random location)
              ( that is what it means with warning: ‘parent’ may be used uninitialized)
              so just use
              QProcess *myProcess = new QProcess(this); // this being Taz ( mainwinow i guess)

              also, you are not really processing the list
              but you should get "fileNames" in the fn.txt?

              maybe you can do
              fileNames << ">> /home/fred/fn.txt";
              and
              myProcess->start(program, fileNames );

              But in any case
              "fileNames" do not expand to the real list as it would in say bash.
              it just is text. like "hello".

              F Offline
              F Offline
              Fred Barclay
              wrote on 8 Sept 2016, 21:14 last edited by
              #9

              @mrjj Thanks - unallocated error fixed. You're right, I'm definitely not processing the list fileNames. I was just hoping I could get something (even the word "fileNames") to be echoed into a file.

              This yields nothing; is it what you are talking about?

              void Taz::on_chooseButton_clicked()
              {
              // New behavior
                  QFileDialog dialog(this);
                  dialog.setViewMode(QFileDialog::Detail);
                  dialog.setFileMode(QFileDialog::ExistingFiles);
                  QStringList fileNames;
                  if (dialog.exec())
                      fileNames = dialog.selectedFiles();
              
                  QString program = "/bin/echo";
                  QStringList arguments;
                  fileNames << ">> /home/fred/fn.txt";
                  QProcess *myProcess = new QProcess(this);
                  myProcess->start(program, fileNames );
              }
              

              BTW: here is my entire taz.cpp file: https://gist.github.com/Fred-Barclay/f0454d31681fe3744659cd18dfd62403

              and here is a screenshot (just in case...)
              0_1473369253927_taz.png

              1 Reply Last reply
              0
              • M Offline
                M Offline
                mrjj
                Lifetime Qt Champion
                wrote on 8 Sept 2016, 21:34 last edited by mrjj 9 Aug 2016, 21:35
                #10

                Hi
                it looks ok now.

                you should use qDebug() to check stuff out
                (#include <QDebug>)

                and do
                qDebug() << " numfiles:" << fileNames.size();
                It will show in Creator in output window.
                Should give you a non zero value.

                also
                QProcess has a error() function u should also call to see if any errors.

                for test u can also try
                QProcess sh;
                sh.start("sh", QStringList() << "-c" << "ifconfig" << ">> /home/fred/fn.txt");

                1 Reply Last reply
                0
                • S Offline
                  S Offline
                  SGaist
                  Lifetime Qt Champion
                  wrote on 8 Sept 2016, 21:38 last edited by
                  #11

                  Hi,

                  IIRC, you should split >> and /home/fred/fn.txt and add both separately to your argument list.

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

                  F 1 Reply Last reply 8 Sept 2016, 21:46
                  0
                  • S SGaist
                    8 Sept 2016, 21:38

                    Hi,

                    IIRC, you should split >> and /home/fred/fn.txt and add both separately to your argument list.

                    F Offline
                    F Offline
                    Fred Barclay
                    wrote on 8 Sept 2016, 21:46 last edited by
                    #12

                    @SGaist Hmm... that would make sense but even then nothing seems to happen when or after I press the button ("Choose File" in the screenshot above):

                    void Taz::on_chooseButton_clicked()
                    {
                    // New behavior
                        QFileDialog dialog(this);
                        dialog.setViewMode(QFileDialog::Detail);
                        dialog.setFileMode(QFileDialog::ExistingFiles);
                        QStringList fileNames;
                        if (dialog.exec())
                            fileNames = dialog.selectedFiles();
                    
                        QString program = "/bin/echo";
                        QStringList arguments;
                        arguments << "fileName" << ">>" << "/home/fred/fn.txt";
                        QProcess *myProcess = new QProcess(this);
                        myProcess->start(program, arguments);
                    }
                    
                    J 1 Reply Last reply 8 Sept 2016, 23:32
                    0
                    • S Offline
                      S Offline
                      SGaist
                      Lifetime Qt Champion
                      wrote on 8 Sept 2016, 21:49 last edited by
                      #13

                      You should add some error checking to your code. That would help pinpoint the problem.

                      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
                      0
                      • F Fred Barclay
                        8 Sept 2016, 21:46

                        @SGaist Hmm... that would make sense but even then nothing seems to happen when or after I press the button ("Choose File" in the screenshot above):

                        void Taz::on_chooseButton_clicked()
                        {
                        // New behavior
                            QFileDialog dialog(this);
                            dialog.setViewMode(QFileDialog::Detail);
                            dialog.setFileMode(QFileDialog::ExistingFiles);
                            QStringList fileNames;
                            if (dialog.exec())
                                fileNames = dialog.selectedFiles();
                        
                            QString program = "/bin/echo";
                            QStringList arguments;
                            arguments << "fileName" << ">>" << "/home/fred/fn.txt";
                            QProcess *myProcess = new QProcess(this);
                            myProcess->start(program, arguments);
                        }
                        
                        J Offline
                        J Offline
                        jeremy_k
                        wrote on 8 Sept 2016, 23:32 last edited by
                        #14

                        @Fred-Barclay said in How to call a variable defined in one function in another function:

                        @SGaist Hmm... that would make sense but even then nothing seems to happen when or after I press the button ("Choose File" in the screenshot above):

                        void Taz::on_chooseButton_clicked()
                        {
                        // New behavior
                            QFileDialog dialog(this);
                            dialog.setViewMode(QFileDialog::Detail);
                            dialog.setFileMode(QFileDialog::ExistingFiles);
                            QStringList fileNames;
                            if (dialog.exec())
                                fileNames = dialog.selectedFiles();
                        
                            QString program = "/bin/echo";
                            QStringList arguments;
                            arguments << "fileName" << ">>" << "/home/fred/fn.txt";
                            QProcess *myProcess = new QProcess(this);
                            myProcess->start(program, arguments);
                        }
                        

                        Is the expectation that "fileName" will be appended to the file /home/fred/fn.txt?

                        Neither echo nor QProcess have special handling for ">>" as far as I am aware. Redirection to a file using this syntax is usually the domain of a shell such as bash. QProcess either redirects output to the enclosing program's output, or makes it available via QProcess::readChannel().

                        What you'll get instead is the string "fileName >> /home/fred/fn.txt" written to standard output.

                        #include <QCoreApplication>
                        #include <iostream>
                        #include <QProcess>
                        #include <QObject>
                        
                        int main(int argc, char *argv[])
                        {
                            QCoreApplication a(argc, argv);
                            QProcess p;
                            p.setProcessChannelMode(QProcess::ForwardedChannels);
                            QStringList arguments;
                            arguments << "fileName" << ">>" << "/home/fred/fn.txt";
                            QObject::connect<void(QProcess::*)(int)>(&p, &QProcess::finished, [=](){ std::cout << "process done" << std::endl; });
                            p.start("/bin/echo", arguments);
                        
                            return a.exec();
                        }
                        

                        Asking a question about code? http://eel.is/iso-c++/testcase/

                        1 Reply Last reply
                        0
                        • M Offline
                          M Offline
                          mjsurette
                          wrote on 9 Sept 2016, 01:10 last edited by mjsurette 9 Sept 2016, 01:15
                          #15

                          Hi. For a non c++ programmer, you seem to be catching on. Your posting of...

                          void Taz::on_chooseButton_clicked()
                          {
                          // New behavior
                              QFileDialog dialog(this);
                              dialog.setViewMode(QFileDialog::Detail);
                              dialog.setFileMode(QFileDialog::ExistingFiles);
                              QStringList fileNames;
                              if (dialog.exec())
                                  fileNames = dialog.selectedFiles();
                          
                              QString program = "/bin/echo";
                              QStringList arguments;
                              arguments << "fileName" << ">>" << "/home/fred/fn.txt";
                              QProcess *myProcess = new QProcess(this);
                              myProcess->start(program, arguments);
                          }
                          

                          isn't too bad. Just a little overly complex, so this

                          void Taz::on_chooseButton_clicked()
                          {
                          // New behavior
                              QFileDialog dialog(this);
                              dialog.setViewMode(QFileDialog::Detail);
                              dialog.setFileMode(QFileDialog::ExistingFiles);
                              QStringList fileNames;
                              if (dialog.exec())
                              {
                                  fileNames = dialog.selectedFiles();
                                  QProcess::execute("echo", fileNames);
                              }
                          }
                          

                          should echo the filenames to your Application Output screen. This is actually a lot closer to what you're end game should look like.

                          HTH

                          Mike

                          1 Reply Last reply
                          0

                          13/15

                          8 Sept 2016, 21:49

                          • Login

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