10

でコンソールアプリケーションを作成しようとしQtていますが、引数を取得しようとすると、非常に奇妙な動作に直面しています。QCoreApplication私のクラスは、通常はすべての引数をのリストに入れる必要がある関数を持っているものから派生していstringsます。ただし、場合によっては、その呼び出しはセグメンテーション違反で終了します。

コードは次のとおりです。

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

上記のコードをコンパイルして実行すると、すべてDiagrammが正常に機能しますが、コンストラクターの行のコメントを解除すると、関数の最初の行でセグメンテーション違反が発生しますtestArguments(の呼び出しarguments()

Qtのドキュメント、フォーラムを読んで、私は何時間もそれを続けてきました...誰かがそれがどこから来ることができるか知っていますか?どんなアイデアでも大歓迎です。

注:execイベントループが必要ないため、意図的に関数を呼び出していません。

4

2 に答える 2

17

Q(Core)Applicationargcはand argv by referenceを望んでいるので、コンストラクターは読み取る必要があります

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

これを行わないと、場合によっては機能する可能性がありますが、遭遇したように、セグメンテーション違反や奇妙な動作が発生する可能性があります。これは一般的なエラーのようで、ドキュメントを読んでも簡単に見つけることはできません。

于 2012-08-27T05:40:01.263 に答える
0

arguments()は静的関数なので、行は次のようになります。

QStringList arguments = QCoreApplication::arguments();
于 2012-08-27T05:02:05.950 に答える