2012-08-27 2 views
9

मैं Qt के साथ एक कंसोल एप्लिकेशन बनाने की कोशिश कर रहा हूं और तर्कों को पुनर्प्राप्त करने का प्रयास करते समय वास्तव में अजीब व्यवहार का सामना कर रहा हूं। मेरी कक्षा QCoreApplication से ली गई है जिसमें एक ऐसा फ़ंक्शन है जो सामान्यतः strings की कुछ सूची में सभी तर्क डाल देना चाहिए। लेकिन कुछ मामलों में कॉल सेगमेंटेशन गलती में समाप्त होता है।रहस्यमय मामलों में QCoreAplication के साथ उपयोगकर्ता के तर्क खाली हैं

कोड यह रहा:

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); 
    } 
} 

जब संकलन और इसके बाद के संस्करण कोड को क्रियान्वित करने, सब कुछ काम करता है ठीक, लेकिन मैं समारोह testArguments की पहली पंक्ति पर एक विभाजन गलती (arguments() करने के लिए कॉल)

मैं घंटों के लिए उस पर किया गया है, क्यूटी के दस्तावेज़ पढ़ने मिल गया है जब मैं Diagramm के निर्माता में लाइन uncomment, मंच ... क्या कोई जानता है कि वह कहां से आ सकता है? किसी भी विचार की सराहना की जाएगी।

नोट: मैं उद्देश्य पर exec फ़ंक्शन को कॉल नहीं कर रहा हूं क्योंकि मुझे किसी भी ईवेंट लूप की आवश्यकता नहीं है।

उत्तर

14

क्यू (कोर) आवेदनargc और argvचाहता संदर्भ से है, तो आपके निर्माता पढ़ना चाहिए

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

यदि आप ऐसा नहीं करते हैं, तो यह कुछ मामलों में काम कर सकता है और दूसरों के बीच में segfaults या अजीब व्यवहार का कारण बन सकता है। एक सामान्य त्रुटि प्रतीत होती है और दस्तावेज़ पढ़ने के दौरान स्पॉट करना आसान नहीं होता है।

+2

वह था। आपका बहुत बहुत धन्यवाद ! दूसरों के लिए, ऊपर दिया गया कोड होना चाहिए: (main.cpp में) 'आरेखण अनुप्रयोग (argc, &argv);' (Diagramm.cpp में) 'आरेखण :: आरेख (int और argc, char ** argv []): QApplication (argc, * argv) ' – Ote

0

arguments() एक स्थिर समारोह है तो लाइन किया जाना चाहिए:

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

यह वास्तव में स्पष्ट है, लेकिन अन्यथा कोई फर्क नहीं पड़ता है। –

संबंधित मुद्दे