0

プログラムでクラッシュが発生しましたが、それは問題ないように思えますが、もちろん、プログラムはそうではないと言っており、混乱しています。

私が現在取り組んでいる私の機能のこのスニペット:

        for(int k = 0; k < dictionary[k].size(); k++)
        {
            //"i" represents the fragment's first character
            //while "k" represents the dictionary first character
            if(fragments[i][j] == dictionary[k][j]) {
                token++;
                cout << token << endl;
            }
        }

問題かもしれません。問題をデバッグすると、デバッガーはスニペットの最初の行に移動します。

    for(int k = 0; k < dictionary[k].size(); k++)

次に行こうとするとクラッシュします。デバッガーでは、このウィンドウがコード ブロックで開きます。

Signal Received

Program Received Singal SIGEGV, segmentation fault. Do you want to view backtrace?

はいをクリックしましたが、それは私には恣意的に思えます。

私が間違ったことを誰か知っていますか?

バックトレースが必要な場合 (ウィンドウには Call Stack と表示されます)、後で必要に応じて編集します。

編集:これは機能全体であり、必要ではないと考えていました

void Language::compare()
{
    int para = getParameters(0); //eg. 3

    int valid = para;
    int token = 0;

    for(int i = 0; i < para; i++)
    {
        //If the string is creater than 2 characters
        if(fragments[i].length() > 1) {
            for(int j = 0; j < fragments[i].length(); j++)
            {
                //Checking if that character match in dictionary
                for(int k = 0; k < para; k++) //Changed and now works,
                {
                    //"i" represents the fragment's first character
                    //while "k" represents the dictionary first character
                    if(fragments[i][j] == dictionary[k][j]) { //But now this line crashes
                        token++;
                        cout << token << endl;
                    }
                }
                if(token == 0) {
                    break;
                }
            }
        }
        else {
        //...
        }
    }
}

辞書とフラグメントは、どちらもベクトルであるクラス「Language」で宣言されています。

4

5 に答える 5

10

dictionary[k].size()ループが繰り返されているので、そこでループ制御の一部として使用するつもりだったとは思えませんk。意味ですか、dictionary.size()それともdictionary[i].size()多分?

于 2009-09-03T21:26:42.977 に答える
7

この行:

for(int k = 0; k < dictionary[k].size(); k++)

疑わしいようです。辞書の配列/コレクションのサイズまでループしたくないですか?

あなたがdictionaryそれの定義を投稿したならば、私たちがいくつかの具体的な提案をするのを助けるかもしれません。

于 2009-09-03T21:26:22.930 に答える
1

fragments[i][j] == dictionary[k][j]

dictionary[k].size()>j間接参照を試みる前に確認する必要がありますdictionary[k][j]

于 2009-09-03T22:54:48.130 に答える
0

ループに入るときのjの値は何ですか?

そして私は他の人に同意します:

for(int k = 0; k<辞書[k].size(); k ++)

偽物のようです。何かのようなもの

for(int k = 0; k<辞書[m].size(); k ++)

もっと理にかなっているようです。

于 2009-09-03T21:30:43.277 に答える
0

疑わしいと思われる for ループのテストに関する他のコメントはおそらく正しいですが、さらに、最初にループに入ろうとしたときにこの segfault が発生する場合はdictionary vector<>、エントリのないa で作業している可能性があります。 .

この場合dictionary[0].size()、未定義の動作があります (セグメンテーション違反である可能性があります)。

于 2009-09-03T21:54:06.123 に答える