2012-08-27 5 views
9

Sto provando a creare un'applicazione console con Qt e ho riscontrato un comportamento davvero strano quando si tenta di recuperare gli argomenti. La mia classe è derivata da QCoreApplication che ha una funzione che normalmente dovrebbe mettere tutti gli argomenti in una lista di strings. Ma in alcuni casi la chiamata termina con un errore di segmentazione.Gli argomenti dell'utente sono vuoti con QCoreApplication in casi misteriosi

Ecco il codice:

main.cpp

#include "Diagramm.h" 

int main(int argc, char *argv[]) 
{ 
    Diagramm application(argc, argv); 
    application.run(); 
    return EXIT_SUCCESS; 
} 

Diagramm.h

#include <QCoreApplication> 
#include <iostream> 
#include <QStringList> 
#include <QFile> 
#include <QDebug> 


class Diagramm : public QCoreApplication 
{ 
    Q_OBJECT 

    public: 
     Diagramm(int argc, char *argv[]); 
     void run(); 
    private: 
     void testArguments(); 
    signals: 
    public slots: 
}; 

Diagramm.cpp

#include "Diagramm.h" 

Diagramm::Diagramm(int argc, char *argv[]) : QCoreApplication(argc, argv) 
{ 
    //std::cout << "calling Diagramm constructor" << std::endl; 
} 

void Diagramm::run() 
{ 
    testArguments(); 
} 

void Diagramm::testArguments() 
{ 
    //get source and target files from arguments 
    QStringList arguments = this->arguments(); 

    if(arguments.count() < 2) 
    { 
     std::cout << "Missing arguments" << std::endl; 
     return exit(1); 
    } 
} 

Quando la compilazione e l'esecuzione del codice di cui sopra, tutto funziona Va bene, ma quando ho il commento dalla riga nel costruttore Diagramm s' Ho un errore di segmentazione sulla prima riga della funzione testArguments (la chiamata a arguments())

Sono stato su per ore, la lettura doc Qt, forum ... Qualcuno sa da dove può venire? Qualsiasi idea sarebbe molto apprezzata.

Nota: non sto chiamando la funzione exec di proposito perché non ho bisogno di alcun ciclo di eventi.

risposta

14

Q (Core) Applicazione vuole argc e argvcon riferimento, in modo che il costruttore dovrebbe leggere

Diagramm(int& argc, char **argv[]) 

Se non lo fai, potrebbe funzionare in alcuni casi e portare a segfault o comportamento strano negli altri, come hai incontrato. Sembra essere un errore comune e non è facile da individuare durante la lettura della documentazione.

+2

Era così. Molte grazie ! Per gli altri, il codice sopra dovrebbe essere: (in main.cpp) 'Diagramm application (argc, &argv);' (in Diagramm.cpp) 'Diagramm :: Diagramm (int & argc, char ** argv []): QApplication (argc, * argv) ' – Ote

0

arguments() è una funzione statica in modo che la linea dovrebbe essere:

QStringList arguments = QCoreApplication::arguments(); 
+1

Questo è davvero più chiaro, ma per il resto non dovrebbe fare alcuna differenza. –