0
#include <fstream>
#include <vector>
#define maxn 200000
#include <algorithm>

using namespace std;

class automat {
    vector<pair<int, char> > Q[maxn];
    int *validare;
    int *p;
    int init, st_fin, n, m, i, a, b;
    char c;
    public: automat(char*);
    // void operator +=(automat);
};

automat::automat(char *s) {
    ifstream f(s);
    f >> n >> m >> init >> st_fin;
    validare = new int[n];
    p = new int[n];
    for (i = 1; i <= st_fin; i++) {
        f >> p[i];
    }
    for (i = 0; i < m; i++) {
        f >> a >> b >> c;
        Q[a].push_back(make_pair(b, c));
    }
}

int main() {
    automat M("input.txt");
    return 0;
}

コンパイルされません。理由を教えてください。cc1plus.exe が動作を停止したというメッセージが表示されますが、その理由は本当にわかりません。私はOOPを初めて使用するので、助けていただければ幸いです。ありがとう!

4

3 に答える 3

3

automat M;引数なしでコンストラクター (デフォルトのコンストラクター) を呼び出そうとします。コンパイラは、独自のコンストラクターを定義していない場合にのみ、デフォルトのコンストラクターを暗黙的に生成します。ただし、引数automatを取る1 つのコンストラクターを定義しました。char*を渡す必要がありchar*ます。たとえば、次の操作を実行できます。

char filename[] = "file.txt";
automat M(filename);

これは、配列からポインターへの変換に依存して、filename配列をその最初の要素へのポインターに変換します。


MinGW の既知の問題により、コンパイラがクラッシュします。std::vector原因は、スタックに200000 を割り当てようとしていることにあります。ほとんどの環境では、約 1MB のスタック制限があります。簡単にスタック オーバーフローが発生します。

于 2013-03-26T16:34:18.117 に答える
2

automatデフォルトのコンストラクターがないため、これを行うことはできません。

automat M;

コンストラクターを宣言すると、コンパイラーはデフォルトのコンストラクターを生成しなくなります。あなたはこれを宣言しました:

automat(char*);

そのため、コンパイラは合成しなくなりautomat();ます。デフォルトの構築が必要かどうかを判断する必要があります。必要な場合は、デフォルトのコンストラクターを追加する必要があります。そうでない場合は、 を でインスタンス化しautomatますchar*

于 2013-03-26T16:34:24.433 に答える
1

上記で指定されたプログラムは正常にコンパイルされますが、実行時にクラッシュします。クラッシュはデフォルトのコンストラクターが提供されていないためではありません!

コンパイラが作成しようとするとクラッシュする

vector<pair<int, char> > Q[maxn];

そしてその理由は、この巨大な maxn です

現在、次のように定義されています。

#define maxn 200000

そして、スタック上にこの巨大なベクトルを作成しているときにクラッシュが発生します。これをより小さな値、つまり 200 に変更すると、クラッシュが発生することはありません。そうでなければ、スタックサイズを変更する必要があります!

Visual Studio 10 で再現できました。VS では、 http://msdn.microsoft.com/en-us/library/tdkhxaks( v=vs.71 ).aspx で指定されているようにスタック サイズを変更できます。 GCC http://www.cs.nyu.edu/exact/core/doc/stackOverflow.txtにも変更します

于 2013-03-26T17:48:23.500 に答える